是否不断回收Linux和交换空间中不断增加的交换大小?


10

我有一个运行4个tomcat服务器的8GB RAM linux机器。其中之一设置为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已使用的总可用共享缓冲区已缓存Mem:7982 7937 45 0 32 2088-/ + buffers / cache:5816 2166交换:8191 1163 7028

因此,至少有2克免费Ram。因此,问题是交换空间为什么会继续增加而不被OS回收?或如何调试此方法以找出问题。

Answers:


12

如果将信息换出到磁盘上,然后再读回内存,则通常会将其分配在交换区域中,直到交换空间用尽。这意味着,如果以后需要再次交换相同的信息并且没有更改,则OS可以从分配的RAM中删除页面,而无需写入任何内容以节省磁盘时间。

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

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

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

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

表示已分配了74268K的交换空间,但当前也将这些价值17232K的页面也映射到了RAM中(因此,如果其他空间需要该交换空间,可以在瞬间通知从交换中释放出来)。

同样毫无疑问,那里坐着的页面早已被交换掉了,从那以后就再也没有被使用过。内核不会仅仅因为有一些可用的RAM将其重新读取而从交换中重新加载页面,因为可用的RAM可能更适合用于高速缓存或缓冲区-写入交换的页面通常仅在下一次需要它们时才重新读取。

如果您想清除交换中的内容,只要您有足够的可用空间和/或可释放空间(即,free + cache + buffers(减去c + b计数中不可释放的RightThisInstant的那些部分)),就将其打开关闭,然后再次打开swapoff -a && swapon -a

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


很好的答案。谢谢。因此,我的系统当前显示SwapTotal:8388600 kB SwapFree:7197688 kB SwapCached:595724 kB因此,实际无交换= 7197688 + 595724 =7793412。已使用的Actul Swap = 8388600-7793412 = 595188 == 581MB。我认为对于运行4个应用程序的8GB系统,使用581MB的交换文件是合理的。让我在接下来的几天中进行监视,并查看swapCached的数字是否继续与%swapUsed相称。
Zenil 2010年

2

基本上,您不需要关心这一点。重要的是要知道有多少IO用于交换(请查看'vmstat'命令)。在交换中拥有更多东西不会花费任何费用。唯一的成本是将东西放入交换区(页面移入)或取出(交换页面)。因此,操作系统让交换增长是完全合理的。


1
重要的是要弄清楚交换为什么会增长而从未减少。.如果我们允许服务器继续运行数周怎么办?交换是否会超出限制并导致内存问题?掉期/掉期看起来“合理”。.在高峰活动期间,掉期/掉期率很高(而且%掉期的增加)。.在正常时期里掉期/掉期很小,但%掉期没有减少
Zenil 2010年

0

只要您有可用的交换空间,就不需要os释放交换空间。如果没有剩余空间,它将被释放。但是,当您遇到这种情况时,您肯定会遇到问题。


0

除非您运行足够长的服务器以查看它是否会成为问题,否则无法确定这最终是否会成为问题。

基本上,如果有新程序启动,则操作系统会一直交换未用完的东西以始终保留一些内存。交换空间直到需要时才被释放,这意味着您可以使用100%的交换空间,而不会出现性能问题。担心的是这是否是由内存泄漏引起的。它不一定是内存泄漏,而可能是。

Java不太容易发生内存泄漏,但是特别是在复杂的应用程序中可能会发生。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.