顶部的结果(我的应用程序正在运行;应用程序使用约9G):
top - 21:22:48 up 46 days,10:12,1 user,load average: 0.01,0.09,0.12Tasks: 635 total,1 running,633 sleePing,1 stopped,0 zombIEcpu(s): 0.2%us,0.2%sy,0.0%ni,99.6%ID,0.0%wa,0.0%hi,0.0%si,0.0%stMem: 65960100k total,55038076k used,10922024k free,271700k buffersSwap: 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 cachedMem: 64414 53747 10666 0 265 4746-/+ buffers/cache: 48735 15678Swap: 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.13Tasks: 586 total,585 sleePing,0 stopped,0 zombIEcpu(s): 0.0%us,0.0%sy,100.0%ID,64356228k used,1603872k free,197800k buffersSwap: 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 0arc_tempreserve 4 0arc_loaned_bytes 4 0arc_prune 4 0arc_Meta_used 4 1531800648arc_Meta_limit 4 8654946304arc_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上丢失内存 – 不缓存,而不是缓冲区全部内容,希望文章能够帮你解决在Linux上丢失内存 – 不缓存,而不是缓冲区所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)