2013-04-11 27 views
9

在我的一台服务器上,我有一些内存/磁盘KV服务, 内存KV的行为与memcached类似,初始化时请求大内存(10GB), 磁盘Kv的行为与leveldbd类似,它的随机读取和顺序写入,并且它经常读取很多文件。 内存都是使用libc malloc分配的。linux high slab高速缓存使用

我的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 

我可以看到石板消耗了大量的记忆,它是不可报废的。

$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 

这是slab信息。

$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

通常,当有人问“我的所有Linux内存都在哪里去了“的答案是”磁盘缓存,这不是问题“,但我不知道这是否是这种情况。服务器故障可能是一个更好的地方要问。也许看看这个问题:http://serverfault.com/questions/240277/slab-uses-88gb-of-128gb-available-what-c​​ould-cause-this – 2013-04-11 15:44:23

+0

Serverfault问题引用涉及高SReclaimable,这是一个漂亮来自SUnreclaimable的不同的野兽 - 这似乎是这里的问题。我现在正在研究一个类似的问题,其中64,128和192字节的SOA分配似乎在“泄漏”。这是一个古老的问题,但如果我想出任何东西,我会报告回来。同时,如果有人知道如何在Linux中泄漏SOA分配,我会喜欢你的想法。 – 2014-05-27 14:09:29

+0

@ J.Paulding我也在研究类似的问题。任何你找到的东西。 – Joe 2014-11-06 16:18:10

回答

-1

随着顶,免费的摘录,slabtop提供

看起来像乌尔内核是吃了内存 板:28870400 KB

发现这一点非常naice的方式是。

  1. 做一个顶部,并做一个RES内存(RAM上的驻留内存),顶部只给出内存的用户视图。

  2. 做一个免费的-m,看看有多少内存是空闲和使用(免费的内核+用户)。总内存之间的差异 - 顶部RES,什么是免费的命令clamined免费不应该是没有多少〜1 GB

“它的时候碰到乌尔OS版本”