最近发现 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 使用情况。

总结

通过使用 smempmap 等工具,可以快速确认哪些进程正在使用 Swap,从而帮助深入分析和排查问题。

References

最后修改:2024 年 12 月 13 日
如果觉得我的文章对你有用,请随意赞赏