最近发现 ArchLinux 的 32G 内存经常出现 OOM,分配 SWAP 后分多少就占多少,很奇怪,就想办法排查一下,找到了 smem
.
smem 是一款能提供大量 Linux 系统内存使用报告的工具。与现有工具不同,smem 可以报告比例集大小 (PSS),这对虚拟内存系统中库和应用程序使用的内存量来说更有意义。
-- smem memory reporting tool
安装
# Debian/Ubuntu
sudo apt install smem
# CentOS/RHEL
sudo yum install smem
# Archlinux
yay -S smem
查看 SWAP 占用排行
$ smem -r -k -s swap
PID User Command Swap USS PSS RSS
1634 songtianlun /usr/bin/remmina -i 1.9G 623.9M 625.1M 634.9M
1260193 songtianlun /usr/bin/pycharm-profession 749.4M 2.0G 2.0G 2.0G
1166595 songtianlun /opt/goland/bin/goland 417.3M 2.8G 2.8G 2.8G
1665 songtianlun /usr/lib/firefox/firefox -- 244.0M 610.8M 637.9M 801.6M
1327 songtianlun /usr/bin/plasmashell --no-r 181.6M 293.4M 300.9M 353.5M
62871 songtianlun /usr/lib/firefox/firefox -c 136.3M 121.5M 122.6M 166.4M
2636 songtianlun /usr/lib/electron32/electro 131.4M 410.7M 417.2M 433.
...
其他用法
使用 pmap
查看特定进程的内存映射
如果您已经知道某个特定进程的 PID,并想查看它的具体内存使用情况,包括 Swap 使用量,可以使用 pmap
:
使用 pmap
命令:
pmap -x <PID>
其中 <PID>
是进程的 ID。输出将显示该进程的内存映射情况,包括每个映射的大小。
使用 grep
直接查看 /proc/[pid]/smaps
您还可以通过查看 /proc
文件系统中的信息来获取某个特定进程的详细信息:
获取进程的 PID,假设为 1234
,使用:
grep -i swap /proc/1234/smaps
这将输出关于这个进程的 Swap 使用情况。
总结
通过使用 smem
和 pmap
等工具,可以快速确认哪些进程正在使用 Swap,从而帮助深入分析和排查问题。