我有一个场景,我可以使用 .ubuntu 看到我的 Ubuntu 16.04 笔记本电脑上有分页活动vmstat 1 100
。
由于当前负载的巨大规模,预计进程或多或少会被换出到磁盘,这很好。但是,我想确定那些导致页面交换的因素每时每刻(如 所示vmstat
),因为这可能表明内存分配可以改进。
我的系统管理技能有点生疏,但我在 root shell 中很舒服。
我应该使用哪些命令来识别导致交换活动的进程?
答案1
对于性能问题(例如 CPU iowait 时间较长),通常最好监视这些事情随着时间的推移而不是事后,特别是当短期进程可能是罪魁祸首时。在 Linux 上,您可以交互使用的一种工具是iotop
(固定链接)(另请参阅以下问题的答案这个关于跟踪磁盘 I/O 的问题)。您可以编写此脚本(批处理模式)或以交互方式运行它top
,例如使用光标键按 SWAPIN 排序,或使用该-o
选项以使输出不那么混乱。您将需要 Python ≥2.7 并启用各种内核配置参数(请参阅iotop
'sREADME
或手册页)。
不是仅使用来自/proc
like 的数据vmstat
,而是iotop
使用taskstats
,这使用网联IPC有效地直接从内核到用户空间提供进程统计。
在大多数版本的 Linux 上,默认为“交换性“设置为 60,当系统适度繁忙时,看到分页活动是相当正常的:内核会先发制人地将很少使用的进程页面写入交换,而不是清除最近使用的磁盘缓存页面。(有一个相关参数vfs_cache_pressure
需要调整一些缓存行为。)如果您观察到持续不断的分页,那么可能不仅仅如此。
否则,如果您担心交换使用现在而不是随着时间的推移:内核跟踪 中每个进程的交换使用情况/proc/PID/status
。你可以使用gawk
(≥v4.0)快速做一些事情:
gawk '/^Name:/{nm=$2} /^Pid:/{pid=$2} /^VmSwap:/{sw=$2}
ENDFILE{printf("%-24s %6i %6ikiB\n",nm,pid,sw)}' /proc/[0-9]*/status |
sort -h -k 3
根据文档换出的 shmem(共享内存)此处不计算在内,但希望您不需要关心这一点。埃里克·永斯特罗姆的getswap.sh
剧本也可以使用,有更高级的版本这个答案。
答案2
尝试以下命令:
ps -eo pid,cmd,vsz
这将以进程 ID、执行的命令和进程的虚拟内存大小(以 KiB 为单位)列出进程