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


18

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

查看我们的内存缓存统计信息,我认为我发现了一个以前未曾意识到的问题。看来我们有一个奇怪的大量浪费空间。我检查了phpmemcacheadmin的更改,发现该图像盯着我:

memcached缓存大小图形

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

phpmemcacheadmin显示的逐出率为2 ev/s,因此这里存在一些问题。

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

  • 第二个问题是出于好奇,当然是,是否期望75%(并且还在不断增加)的浪费空间的比率是预期的,如果是这样,为什么。

系统:目前,这是我无能为力的事情,我知道内存缓存版本不是最新的,但是这些都是我所处理的。

  • 内存缓存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

它不完整,没有被逐出,但是浪费了117.3 MB。我所做的快速计算(如果我错了,请纠正我)是:

  • 前一个平板的块大小为328,因此最坏的情况是此平板上装有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

问题在于,其他平板中有大量未使用的空间,而平板3已满100%,并且有逐出现象。
David Schwartz 2012年

好的一点是,这可以解释驱逐事件,尽管我不确定如何计算“浪费”数字。如果平板8仅使用了13.9%,那么肯定有一定的“可用”空间吗?
Nanne 2012年

是的,该楼板中有可用空间。但是,如果要逐出的对象不在该平板中,那将无济于事。
David Schwartz 2012年

这就是我从您的答案中得出的结论,但是为什么没有列出可用空间?应该是饼图白色的某些部分(因为它在我的测试安装),如果还有剩余空间,至少,这就是我想通
Nanne

Answers:


10

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

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

为了简化说明,假设您拥有3MB内存,3MB内存的内存缓存:

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

执行一个大小为10k的“设置”。您会在统计资料中大致看到:

0.03% used
66.6% free
33% wasted

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

执行另一个大小为10k的“设置”。这次您将看到:

0.06% used
66.6% free
32.7% wasted

因此,现在您正在使用平板1中100个已分配块中的2个,“浪费”的统计信息已删除,而已使用的统计信息则有所增加。

已用百分比+浪费百分比等于100%没什么错。这并不意味着您没有剩余的内存,而只是意味着您从每个平板分配了至少一个块。

要查看此问题,请设置一个大小为100k的“集合”,另一个大小为1000k的“集合”

现在你会看到

36.6% used
   0% free
63.3% wasted

听起来不错!您是否有任何链接可以备份此内容?如果是这样,则意味着我的内存缓存服务器的性能更好,那么我们认为:)。如果我理解正确,那是浪费的意思是它已经分配了,但仍然可以使用。这意味着,如果没有什么是免费的,虽然您不能分配更多的平板,但是这不意味着您本身就有问题吗?
Nanne 2013年

1
我的头上没有链接,但是测试自己非常容易。点击您的命令行并创建一个示例小型服务器以测试其工作方式。您可以对详细的调试消息使用-vv选项,这将向您显示最初创建的平板,即:“ memcached -vv -p 11500 -m 3 -n 10000 -f 10”将为您创建3个平板,块大小分别为10k 100k和1000k。并继续发出“集合”,并查看您的浪费/使用过的统计信息的变化与我上面所述的完全一样。
卡利2013年

好点子。现在了解如何为您提供更多关注:)
Nanne 2013年

6

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

您可以在针对小型对象的Memcached文章中找到有关如何进行调整的信息。


如果我正确阅读了统计信息页面,则不是这种情况。大多数浪费都放在480.0字节块的平板中。让我检查一下是否可以显示一些统计信息……
Nanne 2012年

哦,那很好,很正常,没什么好担心的。现在那里的数据更少了。(例如,注意该板仅使用了14%。)
David Schwartz 2012年

但是75%的正常浪费情况如何?这个数字是否包括未使用的空间?我希望将其视为“免费”。同样,随着时间的流逝,浪费的数量会增加,//所占用的内存会减少,而站点变得更加繁忙。那,以及我们确实有迁离的事实,让我想知道可以做什么。
Nanne 2012年

拥有更少的平板可以帮助避免过多的内存卡在错误的平板上的问题。例如,-f 1.5 -I 2800可能有帮助。
David Schwartz 2012年

手册页不太清楚:-I 2800,表示2800K,而不是默认的1M?
Nanne 2012年

-1

我遇到了这个问题,并从memcached转移到redis(没有基于磁盘的保存)。我知道这可能无法实现,但是您可以尝试将其作为一种选择,并密切注意内存碎片。您甚至可以打开持久性来修复重启时的“旧缓存”问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.