在没有打开程序的情况下,我的电脑使用了大约 512M 的内存。昨天,我没有打开任何东西,但使用了 2 GB 内存(已使用 - 缓存 = 2153):
total used free shared buffers cached
Mem: 3261 2875 386 30 199 523
-/+ buffers/cache: 2153 1108
Swap: 8187 0 8187
Run Code Online (Sandbox Code Playgroud)
Top 显示没有处理此问题的进程:
top - 23:10:38 up 1 day, 14:35, 3 users, load average: 0,31, 0,94, 1,29
Tasks: 172 total, 3 running, 169 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6,5 us, 4,2 sy, 0,0 ni, 89,1 id, 0,1 wa, 0,0 hi, 0,1 si, 0,0 st
KiB Mem: 3340164 total, 2937728 …Run Code Online (Sandbox Code Playgroud) 我之前的问题显然有一个错误的前提。我认为文件系统元数据缓存在 inode 和 dentry 缓存中,但显然不是。
当我做:
# time find . > /dev/null
real 10m4.435s
user 0m3.904s
sys 0m15.505s
# time find . > /dev/null
real 0m5.681s
user 0m1.400s
sys 0m4.224s
Run Code Online (Sandbox Code Playgroud)
您可以看到第二次运行要快得多。但是,当我仅释放页面缓存时,它会恢复为 10 分钟:
echo 1 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
Slabtop 删除这些缓存后仍然显示一个大缓存:
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
1758897 1758713 99% 0.19K 83757 21 335028K dentry
1216908 1211861 99% 0.76K 57948 21 927168K ext3_inode_cache
Run Code Online (Sandbox Code Playgroud)
无论如何,我不明白它是如何工作的,因为在删除所有缓存 ( echo 3 > /proc/sys/vm/drop_caches) 之后,slabtop仍然报告了一个很大的缓存大小:
OBJS ACTIVE …Run Code Online (Sandbox Code Playgroud)