确定内存缓存使用的来源

Div*_*Vox 6 cache ram 16.04

由于在运行几天后大量使用交换,我正在对一台机器进行故障排除。系统有 16 GB 的 ram,一般应该没问题,除了大量的 ram 被缓存使用而不是在需要时释放。持续使用会使系统陷入停顿,而缓存中会占用多达 12 GB 的空间。

在你提到它之前,我很清楚Linux Ate My Ram

运行 3 - 4 天后免费的典型显示是:

              total        used        free      shared  buff/cache   available
Mem:            15G        4.4G        184M        280M         10G        116M
Swap:           15G        7.8G        8.1G
Run Code Online (Sandbox Code Playgroud)

为了排除故障,我已将交换率降至零。

$ cat /proc/sys/vm/swappiness 
0
Run Code Online (Sandbox Code Playgroud)

此外,我无法手动调用具有任何有意义效果的缓存刷新。

$ 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
Run Code Online (Sandbox Code Playgroud)

我想知道这是否与 Skylake 的车载视频有关。无论如何,我不确定如何继续分析这个问题,大多数互联网资源都说缓存使用是正常的,并且会根据需要免费 - 显然不是。我接下来应该看哪里?

Rav*_*ina 7

要了解“内存缓存”使用slabtop,使用-s您可以对输出进行排序并c用于缓存大小,因此请使用:

sudo slabtop -s c
Run Code Online (Sandbox Code Playgroud)

对我来说,大部分缓存都与 inode_cache


关于“交换”,您可以使用status 每个进程目录中的文件/proc来找出其中哪个正在使用交换。

对于特定程序:

cd /proc/$(pgrep -x programname)
grep -i swap status
Run Code Online (Sandbox Code Playgroud)

要获取所有进程缓存大小的列表:

cd /proc
find -maxdepth 2 -iname status -exec grep -i -e name -e swap {} \; -exec echo "---" \;
Run Code Online (Sandbox Code Playgroud)

输出将类似于:

---
Name:   atd
VmSwap:        0 kB
---
Name:   rsyslogd
VmSwap:        0 kB
---
Name:   cron
VmSwap:        0 kB
Run Code Online (Sandbox Code Playgroud)