4 个 Linux 命令用于查看页面错误统计信息
您可以使用页面错误来提高 Linux 服务器的性能。请确保优化守护进程/程序以减少页面错误的数量。一旦页面错误的数量减少,守护进程和整个 Linux 操作系统的性能就会提高。
Linux(以及大多数类 Unix)系统使用虚拟内存进入物理地址空间。Linux 内核使用“按需”技术在需要时管理此映射。当进程访问映射到虚拟地址空间但未加载到物理内存中的页面时,会发生页面错误。在大多数情况下,页面错误不是错误。它们用于增加使用虚拟内存的 Linux 和类 Unix 操作系统中程序可用的内存量。虚拟内存不过是 Linux 和许多其他现代操作系统使用的一种内存管理技术,它将磁盘驱动器(硬盘/固态硬盘)上的活动 RAM 和非活动内存组合起来,形成大范围的连续地址。
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 是的 |
要求 | 附言,顶部,sar |
预计阅读时间 | 5 分钟 |
- 当需要访问磁盘时,会发生重大错误。例如,启动一个名为 Firefox 的应用程序。Linux 内核将在物理内存和 CPU 缓存中搜索。如果数据不存在,Linux 会发出重大页面错误。
- 由于页面分配而发生小故障。
您可以使用标准 Linux 命令(例如 ps、top、time 和 sar)查看所有进程或特定进程的页面错误。
例如:ps 命令
使用 ps 命令查看 PID #1 的页面错误,输入:
ps -o min_flt,maj_flt 1
示例输出:
MINFL MAJFL 3104 36
在哪里,
- min_flt:轻微页面错误的数量。
- maj_flt:主要页面错误的数量。
您可能想要查看 PID # 1 的其他详细信息,例如用户、组、命令及其参数,请输入:
# ps -o min_flt,maj_flt,cmd,args,uid,gid 1
示例输出:
MINFL MAJFL CMD COMMAND UID GID 3104 36 /sbin/init /sbin/init 0 0
要查看系统上的每个进程:
# ps -eo min_flt,maj_flt,cmd,args,uid,gid | less
例如:top 命令
输入以下top 命令(您也可以使用 atop 和 htop):
# top
或者以延迟时间间隔启动 top 命令:
# top -d 1
输入F查看排序菜单,然后输入u按故障排序。最后,按 [Enter] 键。
示例:sar 命令
sar程序可用于提供包括页面活动在内的统计数据。输入以下命令:
示例输出:
# sar -B
# sar -B 1 10
Linux 2.6.32-279.el6.x86_64 (server1.example.com) Monday 05 November 2012 _x86_64_ (8 CPU) 12:46:48 CST pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 12:46:49 CST 0.00 460.61 68.69 0.00 452.53 0.00 0.00 0.00 0.00 12:46:50 CST 0.00 276.00 170.00 0.00 642.00 0.00 0.00 0.00 0.00 12:46:51 CST 0.00 460.00 47.00 0.00 550.00 0.00 0.00 0.00 0.00 12:46:52 CST 0.00 228.00 49.00 0.00 705.00 0.00 0.00 0.00 0.00 12:46:53 CST 0.00 320.00 146.00 0.00 420.00 0.00 0.00 0.00 0.00 12:46:54 CST 0.00 164.00 69.00 0.00 479.00 0.00 0.00 0.00 0.00 12:46:55 CST 0.00 501.01 1144.44 0.00 991.92 0.00 0.00 0.00 0.00 12:46:56 CST 0.00 220.00 65.00 0.00 503.00 0.00 0.00 0.00 0.00 12:46:57 CST 0.00 280.00 156.00 0.00 514.00 0.00 0.00 0.00 0.00 12:46:58 CST 0.00 160.00 941.00 0.00 949.00 0.00 0.00 0.00 0.00 Average: 0.00 306.61 284.97 0.00 620.44 0.00 0.00 0.00 0.00
来自 sar 手册页:
-B Report paging statistics. Some of the metrics below are available only with post 2.5 kernels. The following values are dis- played: pgpgin/s Total number of kilobytes the system paged in from disk per second. Note: With old kernels (2.2.x) this value is a num- ber of blocks per second (and not kilobytes). pgpgout/s Total number of kilobytes the system paged out to disk per second. Note: With old kernels (2.2.x) this value is a number of blocks per second (and not kilobytes). fault/s Number of page faults (major + minor) made by the system per second. This is not a count of page faults that generate I/O, because some page faults can be resolved without I/O. majflt/s Number of major faults the system has made per second, those which have required loading a memory page from disk. pgfree/s Number of pages placed on the free list by the system per second. pgscank/s Number of pages scanned by the kswapd daemon per second. pgscand/s Number of pages scanned directly per second. pgsteal/s Number of pages the system has reclaimed from cache (pagecache and swapcache) per second to satisfy its memory demands. %vmeff Calculated as pgsteal / pgscan, this is a metric of the efficiency of page reclaim. If it is near 100% then almost every page coming off the tail of the inactive list is being reaped. If it gets too low (e.g. less than 30%) then the virtual memory is having some difficulty. This field is displayed as zero if no pages have been scanned during the interval of time.
示例:时间命令
使用/usr/bin/time命令(不要使用 shell 内置的 time 命令)运行程序并汇总系统资源使用情况(包括页面错误)。首先,找出实时命令的路径:
# type -a time
示例输出:
time is a shell keyword time is /usr/bin/time
现在,输入以下命令来查看 ls 命令页面错误:
$ /usr/bin/time -v ls /etc/resolv.conf
示例输出:
/etc/resolv.conf
Command being timed: "ls /etc/resolv.conf"
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): 3456
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 280
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
在这个例子中,我运行了xclock程序两次(记下输出):
$ /usr/bin/time -v xclock Major (requiring I/O) page faults: 4 Minor (reclaiming a frame) page faults: 1083 $ /usr/bin/time -v xclock Major (requiring I/O) page faults: 0 Minor (reclaiming a frame) page faults: 1087
第一次启动 xclock 时,会出现许多重大故障。但是第二次启动 xclock 时,Linux 内核不会发出任何重大故障,因为 xclock 已经在内存中了。
如果发现特定进程存在大量页面错误,请尝试以下建议来改善情况:
- 优化服务器流程。
- 通过调整配置文件(例如 php.ini 或 httpd.conf 或 lighttpd.conf)中的参数来减少内存过程。
- 为系统添加更多 RAM。
- 使用更好的页面替换算法,可以减少页面错误的发生。
推荐阅读:
- 操作方法:使用 kSar 创建 sar 图表 [ 识别 Linux 瓶颈 ]
- Linux:找出哪些东西耗尽了所有虚拟内存
- 有关更多信息,请参阅 top、sar 和 ps 命令的手册页。