我正在对一台运行几天后因大量使用交换区而导致速度变慢的机器进行故障排除。该系统有 16 GB 的 RAM,一般情况下应该没问题,只是大量的 RAM 被缓存占用,需要时无法释放。持续使用会导致系统停止运行,因为多达 12 GB 的内存被占用在缓存中。
在你提到它之前,我很清楚Linux 占用了我的内存。
运行 3 - 4 天后典型的免费显示是:
total used free shared buff/cache available
Mem: 15G 4.4G 184M 280M 10G 116M
Swap: 15G 7.8G 8.1G
为了排除故障,我已将交换能力降至零。
$ cat /proc/sys/vm/swappiness
0
此外,我无法手动调用缓存刷新来实现任何有意义的效果。
$ sudo su -c "free -h && sync && echo 3 > /proc/sys/vm/drop_caches && free -h"
total used free shared buff/cache available
Mem: 15G 4.4G 166M 280M 10G 104M
Swap: 15G 7.8G 8.1G
total used free shared buff/cache available
Mem: 15G 4.4G 186M 280M 10G 115M
Swap: 15G 7.8G 8.1G
我想知道这是否与 Skylake 的板载视频有关。无论如何,我不确定如何继续分析这个问题,大多数互联网资源都说缓存使用正常,并将根据需要释放 - 但显然事实并非如此。我下一步应该去哪里找?
答案1
要了解“内存缓存”的使用情况slabtop
,使用-s
您可以对输出进行排序,并且c
是缓存大小,因此使用:
sudo slabtop -s c
对我来说,大多数缓存与inode_cache
关于“交换”,您可以使用status
每个进程目录中的文件来/proc
找出其中哪一个正在使用交换。
对于特定程序:
cd /proc/$(pgrep -x programname)
grep -i swap status
获取所有进程缓存大小的列表:
cd /proc
find -maxdepth 2 -iname status -exec grep -i -e name -e swap {} \; -exec echo "---" \;
输出类似于:
---
Name: atd
VmSwap: 0 kB
---
Name: rsyslogd
VmSwap: 0 kB
---
Name: cron
VmSwap: 0 kB
答案2
一个选项可能是检查以下命令的输出以查看是否有巨大的打开文件:
lsof -s | sort -nk7
关于缓存内存未被释放: