有没有什么办法可以找出 Linux 操作系统中哪个进程使用了​​交换内存?

有没有什么办法可以找出 Linux 操作系统中哪个进程使用了​​交换内存?

一个具有 125GB RAM 且定义交换内存为 6GB、交换量为 30 的 Linux 节点。

在过去的几天里,注意到交换使用量已达到 4.8GB。交换可能是导致应用程序性能问题的原因吗?

答案1

可能是应用程序性能问题的原因吗?

有可能,是的...但如果没有更多信息,我们无法透露更多。


有没有什么办法可以找出 Linux 操作系统中哪个进程使用了​​交换内存?

我使用以下管道来显示有关每个使用交换的进程的信息:

grep '^VmSwap:' /proc/*/status \
    | grep -v '0 kB$' \
    | sed -re 's#^/proc/([0-9]+)/status:VmSwap:[ \t]+([0-9]+) kB$#\1 \2#' \
    | sort -nrk2 \
    | while read pid swap; do \
        printf "%10s kB    %-6s    " ${swap} ${pid}; \
        cat /proc/${pid}/cmdline | xargs -0 | fold -sw160 | sed -re '/^$/d; 1!s/^/\t\t\t\t/;'; \
      done \
    | less -cRS

输出如下所示(用法、PID、命令行):

233256 kB    31326     mysqld
 24968 kB    32424     /usr/local/bin/ruby bin/rails server -b 0.0.0.0
 17232 kB    15256     /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
  8972 kB    15405     /usr/lib/virtualbox/VBoxHeadless --startvm acdb10c9-00fa-4514-a836-b9e3554214f3
  8664 kB    14551     /usr/bin/containerd
  5972 kB    22984     /usr/sbin/named -f -u bind -c /etc/bind/named.conf
[...]
  • grep '^VmSwap:' /proc/*/status
    • /proc/*/status有记录这里- 该行开始VmSwap:表示该进程正在使用多少交换空间。
  • grep -v '0 kB$'
    • 忽略未使用交换的进程
  • sed -re 's#^/proc/([0-9]+)/status:VmSwap:[ \t]+([0-9]+) kB$#\1 \2#'
    • 截取PID和尺寸信息
  • sort -nrk2
    • 按数字排序,按键 2 反向排序(即:交换使用情况)
  • printf "%10s kB %-6s " ${swap} ${pid}
    • 格式化输出的前两列
  • cat /proc/${pid}/cmdline | xargs -0 | fold -sw160 | sed -re '/^$/d; 1!s/^/\t\t\t\t/;'
    • 获取进程的命令行
    • 折叠至160个字符
    • 删除空行,然后
    • 为附加行添加缩进
  • less -cRS
    • 使用它less来轻松审查

答案2

是的,交换很可能是罪魁祸首。

运行“top”查看进程列表及其使用的资源。同样,使用 vmstat 检查交换量。如果交换量很大,请尝试进一步降低 vm.swapiness - 可能降低到 5。

答案3

ps -e v 将为您提供所有进程的 vm 统计信息。它将告诉您每个进程产生了多少个页面错误。

相关内容