在我的一台服务器上,我有一些内存/磁盘KV服务, 内存KV的行为类似于memcached,在初始化时要求大内存(10GB), 磁盘Kv的行为类似于leveldbd,它的随机读取和顺序写入,并且它经常读取大量文件。 内存全部使用libc malloc分配。
我的KV服务器进程不会消耗大量内存,如下所示(由于内存不足,我已经杀死内存KV,只留下磁盘KV,但可用内存仍然存在下降):
:~$top
PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20 0 5030m 3.9g 2772 S 8 6.1 10430:52 tair_server
20 0 4833m 3.9g 4560 S 8 6.1 10171:07 tair_server
20 0 4844m 3.9g 3844 S 38 6.1 10073:32 tair_server
20 0 4765m 3.8g 4144 S 8 6.0 10552:39 tair_server
20 0 2941m 2.4g 9.8m S 0 3.8 256:45.70 tair_server
20 0 2953m 2.4g 12m S 1 3.7 276:54.64 tair_server
但是,我的记忆消失了。
$free -m
total used free shared buffers cached
Mem: 64552 57778 6774 0 16 326
-/+ buffers/cache: 57435 7117
Swap: 0 0 0
我可以看到slab消耗了大量的记忆,而且无法恢复。
$cat /proc/meminfo
MemTotal: 66101892 kB
MemFree: 6816228 kB
Buffers: 17024 kB
Cached: 456640 kB
SwapCached: 0 kB
Active: 19697712 kB
Inactive: 3197312 kB
Active(anon): 19546504 kB
Inactive(anon): 2875632 kB
Active(file): 151208 kB
Inactive(file): 321680 kB
Unevictable: 48 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 6612 kB
Writeback: 72 kB
AnonPages: 22421152 kB
Mapped: 54408 kB
Shmem: 332 kB
Slab: 28870400 kB
SReclaimable: 213344 kB
SUnreclaim: 28657056 kB
KernelStack: 30000 kB
PageTables: 62776 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 33050944 kB
Committed_AS: 37517224 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 388624 kB
VmallocChunk: 34324313700 kB
HardwareCorrupted: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 5696 kB
DirectMap2M: 2082816 kB
DirectMap1G: 65011712 kB
这是平板信息。
$slabtop -s c
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
69842766 69838389 38% 0.19K 1663025 42 13304200K kmalloc-192
69314912 69314796 38% 0.12K 2166091 32 8664364K kmalloc-128
70866624 70866323 39% 0.06K 1107291 64 4429164K kmalloc-64
69299968 69299592 38% 0.03K 541406 128 2165624K kmalloc-32
128388 72434 56% 0.99K 4230 32 135360K ext4_inode_cache
208782 94112 45% 0.19K 4971 42 39768K dentry
我不明白是什么消耗了大量内存,为什么会这样做,以及如何解决这个问题。
这可能是间隔内核错误吗?
或者这是一个glibc问题,由于经常读取磁盘,它不会将内存返回系统?
答案 0 :(得分:1)
您的发行版似乎有点旧,但这没关系。不要听别人说您必须升级,然后再查看unmae -a
输出。但是,如果您提供它,那就太好了……
在较新版本的服务器和桌面发行版中,免费命令输出和/proc/meminfo
包含另外一行,目的是完全消除您所遇到的这种混乱。行名在/proc/meminfo
中为“ MemAvailable”,在free
输出中为“ available”。
free -m
中的“ free”列未以人类理解的方式显示空闲内存(因此/proc/meminfo
中的“ MemFree”行)。它不排除内核的页面缓存和其他人类无法理解的“缓存”缓存。
那是第一件事。如果您认为我错了,并且您正确理解了free
的输出,请尝试:echo 3 > /proc/sys/vm/drop_caches
,然后看看会发生什么,并使用内存。以root身份执行该命令后,请提供free
的输出。
如果仍然很糟,请阅读:https://www.linuxquestions.org/questions/linux-server-73/very-high-slab-usage-hard-to-understand-901323/。它说您的内核可能必须升级。
答案 1 :(得分:-1)
摘录为top,free,slabtop提供
看起来你的内核占用了内存 Slab:28870400 kB
找到这个的非常天真的方法是。
做一个Top,并做一个RES内存(RAM上的驻留内存)的总和,仅给出内存的用户视图。
做一个free -m,看看有多少内存是免费和使用的(给定内核+用户免费)。总内存之间的差异 - 顶部RES,以及在FREE命令中被命名为free的东西不应该多于1 GB
“是时候推动你的操作系统版本了”