我正在寻找一种从 shell 脚本获取特定进程的交换使用情况的方法。Top 可以显示此信息,但只能在交互模式下显示。批处理模式仅在存在 .toprc 时才显示自定义,但您无法在命令行上指定特定的 .toprc。我发现这个脚本,但是我的服务器上的 /proc/*/smaps 中没有交换条目:
# find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' -exec grep -Hi swap '{}'/smaps \;
#
因此脚本只为每个进程输出 0。
有没有办法找到这些信息?我在 RHEL5.1 2.6.18-53.el5 x86_64 上。
编辑:
需要明确的是,当我询问“交换使用量”时,我指的是已分页到交换文件系统的进程使用的内存量(当前不在主内存中的内存量)。假设没有更好的方法,我将默认使用 (virtual - rss) 通过 中的值来计算它ps -o vsz,rss
。
答案1
这是一个有趣的问题,让我思考了一段时间。
首先,为什么没有 Swap 行:虽然理论上它是在内核 2.6.16 中添加的,但它直到 RHEL 5.3 左右(内核 2.6.18-99.el5)才出现。这是提交(不幸的是,在 RH Bugzilla 中无法访问;如果您恰好有一个具有适当权限的帐户,Bugzilla ID 是 443749)。 http://sophie2.aero.jussieu.fr/distrib/Scientific%20Linux/5x/i386/by-pkgid/351d529f9beeb4e5d936a6d5e3e7813a/files/645
其次,这意味着顶部数据不可靠,因为它不是从 smaps 读取的(即它是 virt - res):
case P_SWP:
MKCOL(scale_num(PAGES_TO_KB(p->size - p->resident), w, s));
第三,我很遗憾地说,内核是使用多少交换空间的唯一真实预言,据我所知,各种补丁使信息在 smaps 和 status 中可用,这是公开该信息的唯一方法。不幸的是,我认为更新内核是获取准确信息的唯一方法;要么自己修补源代码(样品补丁,无保修)或更新至内核2.6.18-99.el5。
我希望有一个更简单的答案;责怪 Linus。
答案2
往里看/proc/<pid>/status
。你会看到一条VmSwap
线。
答案3
看起来从附记(1)CentOS 5 的手册页(1),您可以指定 vsize(VSZ) 作为输出字段,因此会是这样的:
/bin/ps -p $pid -o vsize=
对你有用吗?这将提取“进程的虚拟内存大小(以 KiB 为单位,1024 字节为单位)”,并且 = 使其不包含在列标题中。