在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文件系统将不会释放任何资源.您需要导出一个池才能最终释放内存.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Linux日志文件中列属性的详细解析
在Linux系统中没有duf命令,如何有效地管理磁盘空间?
深入探讨EncryptPad在Linux操作系统中的功能和优势
原理和应用场景:Linux中ttyload工具的工作原理和实际用途
深度解析SELinux的三种策略类型
评估Linux系统性能的ttyload工具使用效果
分享在Linux系统中检测SSH版本的方法
介绍Linux平台上的数据加密工具EncryptPad
在Linux系统中,如何查看和诊断块设备信息?
在Linux环境下如何查看块设备信息?
探索Linux操作系统下的数据加密工具EncryptPad
学会在Linux系统中查看硬盘信息
分析SELinux:原理与实践
掌握SELinux策略类别
技巧:有效解读和管理Linux日志文件
查看Linux系统中的所有用户
了解Linux系统中各种不同类型的日志文件
深入理解Linux PS命令
方法:在Linux操作系统中查看用户
检查Linux上SSH的版本的步骤