页面缓存未完全释放

页面缓存未完全释放

我试图释放所有页面缓存页面。首先,我检查了它的目前的规模.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%驻留。然后我释放了页面缓存。240284页面驻留(而284不是 的页面284)。这意味着这些页面实际上是从磁盘访问的。否则(即,如果忽略了释放操作),驻留将保持 的页面284驻留284

也许有些页面锁定在记忆中?!

答案1

如果不终止系统上运行的所有进程,您就无法释放页面缓存中的所有页面。页面缓存至少部分保存了来自磁盘的进程运行部分的支持页面,例如可执行页面和库。

或者,换句话说,您可以释放所有页面缓存,但其中一些会被立即恢复,因为这些页面仍然是需要的。

当您请求释放页面时,释放操作不会删除页面或立即将其标记为空闲。它会将其标记为立即可用。然后立即将其标记为已使用,因为内存中的内容仍然需要它们。

因此,当您读入文件时,所有页面现在都在内存中。然后您告诉系统释放页面,所有页面都会被释放,但实际使用的页面会立即被回收,很可能在实际刷新发生之前。您强制读入的页面仍处于释放状态。

相关内容