一个具有 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 统计信息。它将告诉您每个进程产生了多少个页面错误。