在Linux上丢失内存 – 不缓存,而不是缓冲区

前端之家收集整理的这篇文章主要介绍了在Linux上丢失内存 – 不缓存,而不是缓冲区前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的Ubuntu 12服务器是神秘地丢失/浪费内存.它有64GB的RAM.即使关闭了我所有的应用程序,大约46GB也被显示为使用.这个内存不报告用于缓​​冲区或缓存.

顶部的结果(我的应用程序正在运行;应用程序使用约9G):

top - 21:22:48 up 46 days,10:12,1 user,load average: 0.01,0.09,0.12
Tasks: 635 total,1 running,633 sleeping,1 stopped,0 zombie
cpu(s):  0.2%us,0.2%sy,0.0%ni,99.6%id,0.0%wa,0.0%hi,0.0%si,0.0%st
Mem:  65960100k total,55038076k used,10922024k free,271700k buffers
Swap:        0k total,0k used,0k free,4860768k cached

  PID USER      PR  NI  VIRT  RES  SHR S %cpu %MEM    TIME+  COMMAND                                                                                                                                         
  5303 1002      20   0 26.2g 1.2g  12m S    0  1.8   2:08.21 java                                                                                                                                             
  5263 1003      20   0  9.8g 995m 4544 S    0  1.5   0:19.82 MysqLd                                                                                                                                           
  7021 www-data  20   0 3780m  18m 2460 S    0  0.0   8:37.50 apache2                                                                                                                                          
  7022 www-data  20   0 3780m  18m 2540 S    0  0.0   8:38.28 apache2      
  .... (smaller processes)

请注意,顶级报告4.8G用于缓存,而不是48G,它是55G使用. free -m的结果:

total       used       free     shared    buffers     cached
Mem:         64414      53747      10666          0        265       4746
-/+ buffers/cache:      48735      15678
Swap:            0          0          0

什么是使用我的记忆?我已经尝试过我可以遇到的每一个诊断.由于Linux正在使用其ram用于缓冲区/缓存,所以论坛被人们询问相同的问题.这似乎不在这里.

系统是lxc容器的主机可能是相关的.上面报告的顶级和免费结果来自主机,但是在容器内报告类似的内存使用情况.停止所有容器不会释放内存.大约46G仍在使用中.但是,如果我重新启动主机,内存是免费的.一段时间以前没有达到46G. (我不知道需要几天或几个星期,需要几个小时的时间.)

系统正在使用zfs也可能是相关的. Zfs是有名的记忆饥饿,但不是那么多.该系统在两个raidz池中有两个zfs文件系统,一个是1.5T,一个是200G.我有另一台服务器显示完全相同的问题(46G没有使用),配置几乎相同,但使用3T阵列而不是1.5T.对于每个zfs文件系统,我有很多快照(100左右).我通常会在任何时候安装每个文件系统的一个快照.卸载那些不会让我回忆起我的记忆.

我可以看到上面截图中的VIRT数字与使用的内存大致相同,但即使在关闭这些应用程序之后,即使在关闭运行它们的容器之后,内存仍然使用.

编辑:我尝试添加一些交换,有趣的事情发生了.我补充了30G的互换.一段时间后,标记为顶部缓存的内存量从5G增加到25G. free -m表示大约有20G的可用内存.我增加了另外10G的交换,缓存内存升至33G.如果我添加另外10G的交换,我得到6G的更多的被认可缓存.所有这一次,仅使用几千字节的互换.就像内核需要对其识别或报告为缓存的每一个位置具有匹配的交换.这是40G交换的顶部输出

top - 23:06:45 up 46 days,11:56,2 users,0.12,0.13
Tasks: 586 total,585 sleeping,0 stopped,0 zombie
cpu(s):  0.0%us,0.0%sy,100.0%id,64356228k used,1603872k free,197800k buffers
Swap: 39062488k total,3128k used,39059360k free,33101572k cached

  PID USER      PR  NI  VIRT  RES  SHR S %cpu %MEM    TIME+  COMMAND                                                                                                                                         
 6440 1002      20   0 26.3g 1.5g  11m S    0  2.4   2:02.87 java                                                                                                                                             
 6538 1003      20   0  9.8g 994m 4564 S    0  1.5   0:17.70 MysqLd                                                                                                                                           
 4707 dbourget  20   0 27472 8728 1692 S    0  0.0   0:00.38 bash

任何建议高度赞赏.

编辑2:这是来自/ proc / spl / kstat / zfs / arcstats的arc *值

arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_Meta_used                   4    1531800648
arc_Meta_limit                  4    8654946304
arc_Meta_max                    4    8661962768

没有为ZFS激活L2ARC

解决方法

这个内存很可能被ZFS ARC缓存和其他存储在内核内存中的ZFS相关数据所使用. ARC缓存有点类似于缓冲区缓存,所以通常没有什么可担心的,因为如果有需求,这个内存是由ZFS发布的.

然而,缓冲区高速缓存和ARC缓存之间存在微妙的差异.第一个可以立即可用于分配,而ARC缓存不是. ZFS监视可用的可用RAM,如果太低,它会向其他消费者释放RAM.

这在大多数应用程序中运行正常,但是当报告的可用RAM量很少时,其中少数应用程序会被困惑,或者为释放过程分配太多/太快的内存以适应速度.

这就是ZFS允许减少允许使用ARC大小的最大大小的原因.
此设置在/etc/modprobe.d/zfs.conf文件中完成.

例如,如果您希望ARC从不超过32 GB,请添加以下行:

options zfs zfs_arc_max=34359738368

获取当前的ARC大小和各种其他ARC统计信息,请运行以下命令:

cat /proc/spl/kstat/zfs/arcstats

大小度量将显示ARC的当前大小.请注意,其他ZFS相关的内存区域也可能占用内存的一部分,即使不再使用也不会快速释放.最后,Linux上的ZFS肯定比Solaris本机实现成熟,因此您可能会遇到这样的错误,如one.

还要注意,由于共享存储池设计,卸载ZFS文件系统将不会释放任何资源.您需要导出一个池才能最终释放内存.

猜你在找的Linux相关文章