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 中删除页面,而无需向磁盘写入任何内容,从而节省时间。
分配给已读回内存的内容的交换将被释放
查找/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。
当然,您也可能在某处发生内存泄漏,但这并不是您所看到的行为的唯一解释。
| 归档时间: |
|
| 查看次数: |
21056 次 |
| 最近记录: |