在 Linux 中不断增加交换大小并且交换空间没有被回收?

Zen*_*nil 10 java swap virtual-memory

我有一个 8GB RAM 的 linux 盒子,上面运行着 4 个 tomcat 服务器。其中之一设置为 3000MB 内存(jvm -Xms 和 -Xmx 设置),其他设置为 1500MB。交换分区也设置为 8Gigs。当我启动这些服务器时,交换文件使用率很低。但是在一段时间内以及在一个/所有服务器处于活动高峰期的某些时间段内,交换使用量开始增加。这是典型的 sar -r 输出。

kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad

48260 8125832 99.41 196440 2761852 7197688 1190912 14.20 316044

75504 8098588 99.08 198032 2399460 7197688 1190912 14.20 316032

它显示当前使用了 14.2% 的交换。有趣的是这 % 永远不会减少它继续增加并达到30-40%。我们每周重新启动我们的服务器。

我会假设%swpused在活动高峰期会增加,而在活动低潮期会减少……或者至少保持不变。这看起来交换空间永远不会被操作系统回收..

free 的输出:free -m 缓存的已用空闲共享缓冲区总数:7982 7937 45 0 32 2088 -/+ 缓冲区/缓存:5816 2166 交换:8191 1163 7028

所以至少有 2g 的免费 Ram。所以问题是为什么交换空间继续增加而没有被操作系统回收?或者如何调试它以弄清楚发生了什么..

Dav*_*ett 12

如果信息被换出到磁盘,然后再读回内存,它通常会留在交换区中,直到交换空间不足为止。这意味着如果稍后需要再次换出相同的信息并且没有改变,操作系统可以直接从分配的 RAM 中删除页面,而无需向磁盘写入任何内容,从而节省时间。

分配给已读回内存的内容的交换将被释放

  1. 当根本不再需要相关页面时(即被应用程序释放)
  2. 当相关页面更改时(因此光盘上的副本不再是最新的)
  3. 机器的交换空间不足,因此清除 RAM 中已有的一些内容以腾出空间

查找/proc/meminfo名为“SwapCached”的行。此条目计算在 RAM 和交换分区中找到的页面。例如,随机选择一个小型 VM /proc/meminfo,我的其中一个 VM的虚拟文件显示:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB
Run Code Online (Sandbox Code Playgroud)

表明分配了 74268K 的交换空间,但这些页面中价值 17232K 的页面当前也映射到 RAM 中(因此如果其他东西需要空间,可以立即从交换中释放)。

毫无疑问,那里的页面在很久以前就被换掉了,从那以后就再也没有被使用过。内核不会仅仅因为有一些空闲 RAM 可以将其读回而从交换中重新加载页面,因为该空闲 RAM 可能更好地用于缓存或缓冲区 - 写入交换的页面通常仅在下次需要时才重新读取。

如果您想清除交换中的内容,只要您有足够的空闲和/或可空闲(即空闲+缓存+缓冲区(减去不可释放的 c+b 计数的那些部分 RightThisInstant)),只需将其打开关闭并重新打开swapoff -a && swapon -a

当然,您也可能在某处发生内存泄漏,但这并不是您所看到的行为的唯一解释。