我试图释放所有页面缓存页面。首先,我检查了它的目前的规模.cat /proc/meminfo|head
显示:
MemTotal: 11703912 kB
MemFree: 5637568 kB
MemAvailable: 7114944 kB
Buffers: 136304 kB
Cached: 3184944 kB
SwapCached: 0 kB
Active: 2760572 kB
Inactive: 1424344 kB
Active(anon): 2271112 kB
Inactive(anon): 251312 kB
是的3,184,944 KB
。然后,我尝试清除使用以下命令来检查页面缓存:
sync; echo 3 > /proc/sys/vm/drop_caches
cat /proc/meminfo|head
改为:
MemTotal: 11703912 kB
MemFree: 6722340 kB
MemAvailable: 7062480 kB
Buffers: 3408 kB
Cached: 2271332 kB
SwapCached: 0 kB
Active: 2418432 kB
Inactive: 1938232 kB
Active(anon): 2277092 kB
Inactive(anon): 1535468 kB
快要1 GB
被释放了。为什么周围2 GB
仍然锁定在记忆中?
我还处理了sudo lsof
输出和全部的大小为1,586,536,501 B
。请注意,这是全部的尺寸,并RSS
应更小.这仍然是关于1 GB
更小比页面缓存内容的大小。我是否丢失的某物?任何欢迎提出猜测/建议!
更新:
假设所有2 GB
活动进程都需要。2 GB
从磁盘读取(至少在我较慢的硬盘上)应该需要一些时间。但页面缓存大小2 GB
几乎立即刷新到。
如果我们假设活动进程中的打开文件将被立即回收(即不会被释放并从磁盘重新读取),那么以下情况就不会发生:
/usr/lib/x86_64-linux-gnu/libcairo.so.2.11510.0
位于页面缓存中并应用于vmtouch -v
文件导致:
/usr/lib/x86_64-linux-gnu/libcairo.so.2.11510.0
[OOOOOOOOOOOOOOOOOOOOOOOOOOOoOOOOOoOOOOOoOoOOOOOOoo oOOO] 257/284
Files: 1
Directories: 0
Resident Pages: 257/284 1M/1M 90.5%
Elapsed: 9.1e-05 seconds
我打开了libcairo
,结果vmtouch
报告了100%
驻留。然后我释放了页面缓存。240
的284
页面驻留(而284
不是 的页面284
)。这意味着这些页面实际上是从磁盘访问的。否则(即,如果忽略了释放操作),驻留将保持 的页面284
驻留284
。
也许有些页面锁定在记忆中?!
答案1
如果不终止系统上运行的所有进程,您就无法释放页面缓存中的所有页面。页面缓存至少部分保存了来自磁盘的进程运行部分的支持页面,例如可执行页面和库。
或者,换句话说,您可以释放所有页面缓存,但其中一些会被立即恢复,因为这些页面仍然是需要的。
当您请求释放页面时,释放操作不会删除页面或立即将其标记为空闲。它会将其标记为立即可用。然后立即将其标记为已使用,因为内存中的内容仍然需要它们。
因此,当您读入文件时,所有页面现在都在内存中。然后您告诉系统释放页面,所有页面都会被释放,但实际使用的页面会立即被回收,很可能在实际刷新发生之前。您强制读入的页面仍处于释放状态。