![当有这么多的缓冲区/缓存可用时,为什么 Linux 要使用交换空间?](https://linux22.com/image/1613876/%E5%BD%93%E6%9C%89%E8%BF%99%E4%B9%88%E5%A4%9A%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%2F%E7%BC%93%E5%AD%98%E5%8F%AF%E7%94%A8%E6%97%B6%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20Linux%20%E8%A6%81%E4%BD%BF%E7%94%A8%E4%BA%A4%E6%8D%A2%E7%A9%BA%E9%97%B4%EF%BC%9F.png)
Linux 何时会选择换出而不是使用可用内存或 buff/cache 空间?
以下是我电脑上的数据:
$ free
total used free shared buff/cache available
Mem: 528011992 51967272 43464000 1285108 432580720 472048004
Swap: 30769148 780 30768368
我们可以看到,我仍有 43Gb 的可用 RAM 和 432Gb 的缓冲/缓存。为什么 Linux 会在这种情况下决定使用 780Kb 的交换空间?
我以为我了解 Linux 中的内存管理,但在这种情况下我却不知所措。
可能有用的信息:我正在运行几个 VPS,我很确定它们的内存默认没有被占用(我很确定,因为我有一个 VPS 设置了 32Gb RAM,重启后我没有看到内存被用完)。保留的 43Gb 可能与此有关吗?
另一点需要注意的是:我的电脑有两个 CPU,RAM 使用 NUMA,这对我来说是新鲜事。虽然我可以想象这会产生影响,但 43Gb 的可用 RAM... 内核决定交换...
另外,我读过这些答案为什么当我还有未使用的 RAM 时,部分交换空间却被使用了?但它并没有真正起到什么帮助。我很确定我理解了基础知识。
我在搜索中找到的一些命令如下:
free
如上所示,该free
命令显示部分交换空间正在使用中。
grep
的/proc/*/status
正如许多答案所示,我检查了每个进程状态文件。我的进程均未以这种方式使用交换空间(全部显示0 Kb
)。
ipcs
-- 用于进程间通信(IPC)的共享内存
IPC 显然没有使用交换区:
$ ipcs -mu
------ Shared Memory Status --------
segments allocated 144
pages allocated 5775722
pages resident 1174430
pages swapped 0
Swap performance: 0 attempts 0 successes
mount
检查tmpfs
这是收集的输出,但我真的没有看到任何暗示其中一个或多个当前正在使用交换空间的内容:
$ mount | grep tmpfs
udev on /dev type devtmpfs (rw,nosuid,relatime,size=263958560k,nr_inodes=65989640,mode=755)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=52801160k,mode=755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
tmpfs on /run/user/125 type tmpfs (rw,nosuid,nodev,relatime,size=52801160k,mode=700,uid=125,gid=126)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=52801160k,mode=700,uid=1000,gid=1004)
tmpfs on /run/snapd/ns type tmpfs (rw,nosuid,noexec,relatime,size=52801160k,mode=755)
虽然我在这里看不到任何东西,但我仍然认为它应该是tmpfs
系统利用了一些交换空间。
所以我现在的问题是:如何才能知道系统tmpfs
当前使用了多少交换空间?