memcached 中的意外(?)高“浪费”内存

Nan*_*nne 18 memcached

已更新,请参阅冗长(抱歉)问题的底部。

查看我们的 memcached 统计数据,我想我发现了一个我以前不知道的问题。似乎我们有大量浪费的空间。我检查了phpmemcacheadmin是否有变化,发现这张图片正盯着我看:

memcached 缓存大小图形

现在我的印象是,最坏的情况是有 50% 的浪费,尽管我是第一个承认不了解所有细节的人。我已经阅读了 - 除其他外 -这个页面确实有点旧,但我们的 memcached 版本也是如此。我想我确实了解系统是如何工作的(例如)我相信,但我很难理解我们如何才能达到 76% 的空间浪费。

phpmemcacheadmin 显示的驱逐率是2 ev/s,所以这里有一些问题。

  • 主要问题是:我能做些什么来解决这个问题。我可以投入更多内存(我认为有一些额外的可用空间),也许我应该摆弄平板配置(这个版本甚至可能吗?),也许还有其他选择?升级 memcached 版本不是一个快速可用的选项。

  • 出于好奇,第二个问题当然是 75%(和上升)的空间浪费率是否是预期的,如果是,为什么。

系统:目前我对此无能为力,我知道memcached版本不是最新的,但这些是我处理过的牌。

  • 内存缓存 1.4.5
  • 阿帕奇 2.2.17
  • PHP 5.3.5

作为对@DavidSchwartz 的回答的回应:这里是 phpmemcacheadmin 生成的平板统计信息:(顺便说一句,还有更多的平板)

我还在此处以文本格式粘贴了稍后的统计数据

楼板细节

更新

我用 -f 1.5 重新启动了守护进程,它看起来非常好。经过一些变暖,我们使用/浪费了 50 / 50 。但是,和以前一样,我们一天中的时间越长(白天变得更忙),它就会开始回落到目前的水平:30 / 70,并且浪费仍在增加。除此之外,我仍然不知道“浪费”从何而来。我看到这个板块:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0
Run Code Online (Sandbox Code Playgroud)

它没有满,也没有被驱逐,但浪费了 117.3 MB。我做的快速计算(如果我错了请纠正我)是:

  • 前一个slab的块大小为328,所以最坏的情况是这个slab充满了329字节的块。
  • 这意味着每个使用的块浪费了 167 字节 = 12942834 字节 = 12.3 MB

那么剩下的105 MB是从哪里来的呢?旁边的大哥长这样:

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109
Run Code Online (Sandbox Code Playgroud)

小智 10

这个问题已经一年了,我不知道你是否找到了答案,但我要说你对“浪费”的看法是错误的。

浪费的内存分配在内存中,因此它不能被其他应用程序使用,但它仍然可用于 memcached。

为了简化解释,假设您有一个内存缓存,内存为 3MB,内存为 3 个 Slab:

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1
Run Code Online (Sandbox Code Playgroud)

执行一个 10k 大小的“集合”。你会在你的统计数据中看到(大致)你有:

0.03% used
66.6% free
33% wasted
Run Code Online (Sandbox Code Playgroud)

这是因为 memcached 从“slab class 1”中分配了一个块,并且该slab 的99% 的内存被“浪费”,1% 被“使用”。这并不意味着slab 和分配给该slab 的内存已经消失。

执行另一个 10k 大小的“集合”。这次你会看到:

0.06% used
66.6% free
32.7% wasted
Run Code Online (Sandbox Code Playgroud)

所以现在你在使用 100 个分配块中的 2 个块 1,“浪费”的统计数据下降,使用的统计数据增加。

使用百分比 + 浪费百分比等于 100% 没有错。这并不意味着你没有更多的内存,它只是意味着你从每个slab中至少分配了一个块。

要查看此问题,请使用 100k 大小的“集合”和另一个 1000k 大小的“集合”

现在你会看到

36.6% used
   0% free
63.3% wasted
Run Code Online (Sandbox Code Playgroud)


Dav*_*rtz 6

您可能有大量非常小的对象。通常,最小的平板包含 104 字节的条目。如果您有很多只将一个整数映射到另一个整数的条目,则浪费率可能高达 85%。

您可以在文章Memcached for small objects 中找到有关如何调整此问题的信息。