如何在Linux中检查页面错误

时间:2020-03-05 15:26:16  来源:igfitidea点击:

虚拟内存是当我们实现超过物理内存的内存时的概念。
虚拟内存的大问题是页面错误。

基本传输单元是一个称为页面的固定长度块。
当一个过程没有在主内存中获取页面时,硬件将异常(称为页面错误)提升到软件。
当页面已被映射到地址空间但未加载到物理内存中时会发生。
如果请求的页面不驻留在主内存或者CPU缓存中,则页面必须从外部存储器交换。
它被称为主要页面错误。
如果所请求的页面驻留在主内存中,但由于未初始化的内存或者牛(编写写入)页面的过程无法访问它,则称为次要页面错误。
这里不需要来自硬盘的I/O,因此需要更少的时间。

可以在Linux中使用以下命令找到主要和次要页面错误。

使用ps命令

Linux ps命令使用-o选项我们可以用来打印页面错误。

其中我们对页面错误感兴趣。
"min_flt"选项报告次要故障和'maj_flt'报告的主要错误。

# ps -o pid,min_flt,maj_flt,cmd
PID MINFL MAJFL CMD
2636 2357 0 -bash
2827 146187 0 /bin/bash /usr/sbin/makewhatis
11723 133 0 [makewhatis]
11724 116 0 [gawk]
11725 254 0 ps -o pid,min_flt,maj_flt,cmd

默认情况下,PS命令仅显示与当前终端关联的进程。
要显示所有进程,请使用-a选项。

# ps -A -o pid,min_flt,maj_flt,cmd
PID MINFL MAJFL CMD
1 2927 48 init [3]
2 0 0 [migration/0]
3 0 0 [ksoftirqd/0]
4 0 0 [watchdog/0]
5 0 0 [events/0]
6 0 0 [khelper]
---output truncated--

使用时间命令

GNU Time命令运行命令并通过该命令报告系统资源使用情况。
它还可以讲述主要和次要页面错误。

GNU时间命令必须作为"/usr/bin/time"运行,而不是仅仅只是"时间",因为'time'将运行绑定的时间命令,报告命令的执行时间。

$/usr/bin/time ls /etc/passwd
/etc/passwd
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3232maxresident)k
0inputs+0outputs (0major+260minor)pagefaults 0swaps

"-f"选项"可用于格式化输出。

$/usr/bin/time -f "(%Fmajor %Rminor)pagefaults" ls /etc/passwd
/etc/passwd
(0major 260minor)pagefaults

%f重型故障("在进程运行时的主要或者I/O需要的页数或者I/O需要的页面错误。
这些都是页面实际迁移超出主存储器的故障。
"从手动页面命令

%r次要页面错误("次要或者可恢复的页面错误,页面错误。
这些是无效的页面(因此它们的故障),但尚未被其他虚拟页面声明。
因此页面中的数据仍然有效但必须更新系统表。
"从时间命令的手动页面)

冗长输出也很有用:"-V"选项:

$/usr/bin/time -v ls /etc/passwd
/etc/passwd
Command being timed: "ls /etc/passwd"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 3216
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 261
Voluntary context switches: 1
Involuntary context switches: 3
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
$/usr/bin/time -v cp -r jvm/Documents/
Command being timed: "cp -r jvm/Documents/"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.37
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 3312
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 267
Voluntary context switches: 4
Involuntary context switches: 2
Swaps: 0
File system inputs: 24
File system outputs: 16
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

使用top命令

top命令是一个交互式命令,提供系统的实时视图。

击中f手动选择字段,例如:从上面列表中添加或者删除字段。

F显示以下屏幕:

Current Fields: AEHIOQTWKNMbcdfgjplrsuvyzX for window 1:Def
Toggle fields via field letter, type any other key to return
* A: PID = Process Id 0x00000040 PF_FORKNOEXEC
* E: USER = User Name 0x00000100 PF_SUPERPRIV
* H: PR = Priority 0x00000200 PF_DUMPCORE
* I: NI = Nice value 0x00000400 PF_SIGNALED
* O: VIRT = Virtual Image (kb) 0x00000800 PF_MEMALLOC
* Q: RES = Resident size (kb) 0x00002000 PF_FREE_PAGES (2.5)
* T: SHR = Shared Mem size (kb) 0x00008000 debug flag (2.5)
* W: S = Process Status 0x00024000 special threads (2.5)
* K: %CPU = CPU usage 0x001D0000 special states (2.5)
* N: %MEM = Memory usage (RES) 0x00100000 PF_USEDFPU (thru 2.4)
* M: TIME+ = CPU Time, hundredths
b: PPID = Parent Process Pid
c: RUSER = Real user name
d: UID = User Id
f: GROUP = Group Name
g: TTY = Controlling Tty
j: P = Last used cpu (SMP)
p: SWAP = Swapped size (kb)
l: TIME = CPU Time
r: CODE = Code size (kb)
s: DATA = Data+Stack size (kb)
u: nFLT = Page Fault count
v: nDRT = Dirty Pages count
y: WCHAN = Sleeping in Function

现在,页面错误的字段(列)是"NFLT",可以使用上述输出中指定的"U"键切换。
"NDRT"表示脏页数量,例如:自上次写入磁盘的页面已被修改的页数。
它可以切换到V键。

在切换这两个字段后,顶部显示屏如下:

top - 13:42:32 up 3:36, 2 users, load average: 0.00, 0.02, 0.05
Tasks: 148 total, 2 running, 145 sleeping, 0 stopped, 1 zombie
Cpu(s): 2.0%us, 1.7%sy, 0.0%ni, 96.2%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 3058016k total, 978396k used, 2079620k free, 73936k buffers
Swap: 4095996k total, 0k used, 4095996k free, 499432k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ nFLT nDRT COMMAND
1069 root 20 0 88628 24m 11m S 3 0.8 1:15.12 54 0 Xorg
3093 raghu 20 0 94044 14m 10m S 2 0.5 0:02.34 1 0 gnome-terminal
1903 raghu 20 0 126m 37m 18m S 1 1.3 1:26.27 17 0 plugin-containe
3177 raghu 20 0 2660 1132 836 R 1 0.0 0:00.09 0 0 top
1573 raghu 20 0 74740 16m 9m S 0 0.6 0:20.45 35 0 compiz
1843 raghu 20 0 465m 155m 31m S 0 5.2 1:00.59 43 0 firefox
1847 raghu 20 0 77084 30m 10m S 0 1.0 0:11.58 16 0 ubuntuone-syncd
2331 root 20 0 0 0 0 R 0 0.0 0:02.13 0 0 kworker/0:0
1 root 20 0 3044 1848 1284 S 0 0.1 0:00.86 23 0 init
2 root 20 0 0 0 0 S 0 0.0 0:00.00 0 0 kthreadd
3 root 20 0 0 0 0 S 0 0.0 0:03.11 0 0 ksoftirqd/0

文件/proc/vmstat

"/proc/vmstat"中的PGFault值报告虚拟内存统计信息。
页面错误值可以使用grep命令提取。

$grep pgfault /proc/vmstat
pgfault 5229281

文件/proc/pid/stat

可以查看流程信息/proc目录。

此目录包含每个进程的目录,其中每个进程名称为该进程。
在该目录下,Stat文件包含该进程的统计信息。

以下字段非常感兴趣:

Field 1 
Field 2 - filename of the executable
Field 10 - number of minor page faults
Field 12 - number of major page faults

可以使用CUT命令提取这些字段:

$cut -d " " -f 1,2,10,12 /proc/1/stat
1 (init) 6798 22
$cut -d " " -f 1,2,10,12 /proc/1874/stat
1874 (firefox) 840829 67
$cut -d " " -f 1,2,10,12 /proc/4691/stat
4691 (bash) 2146 0