如何在Linux中检查页面错误
虚拟内存是当我们实现超过物理内存的内存时的概念。
虚拟内存的大问题是页面错误。
基本传输单元是一个称为页面的固定长度块。
当一个过程没有在主内存中获取页面时,硬件将异常(称为页面错误)提升到软件。
当页面已被映射到地址空间但未加载到物理内存中时会发生。
如果请求的页面不驻留在主内存或者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