AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 397532
Accepted
Nanne
Nanne
Asked: 2012-06-12 02:16:37 +0800 CST2012-06-12 02:16:37 +0800 CST 2012-06-12 02:16:37 +0800 CST

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

  • 772

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

查看我们的 memcached 统计数据,我想我发现了一个我以前没有意识到的问题。似乎我们有大量浪费的空间。我检查了phpmemcacheadmin是否有更改,发现这张图片正盯着我看:

memcached 缓存大小图形

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

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

  • 主要问题是:我能做些什么来解决这个问题。我可以给它更多的内存(我认为有一些额外的可用内存),也许我应该摆弄 slab 配置(这个版本甚至可能吗?),也许还有其他选择?升级 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

它没有满,没有被逐出,但它浪费了 117.3 兆字节。我所做的快速计算(如果我错了请纠正我)是:

  • 前一个 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
memcached
  • 3 3 个回答
  • 8443 Views

3 个回答

  • Voted
  1. Best Answer
    kali
    2013-07-06T05:34:14+08:002013-07-06T05:34:14+08:00

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

    浪费的内存分配在内存中,因此它不能被其他应用程序使用,但它仍然可用于 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
    

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

    0.03% used
    66.6% free
    33% wasted
    

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

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

    0.06% used
    66.6% free
    32.7% wasted
    

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

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

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

    现在你会看到

    36.6% used
       0% free
    63.3% wasted
    
    • 10
  2. David Schwartz
    2012-06-12T02:55:54+08:002012-06-12T02:55:54+08:00

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

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

    • 6
  3. pedigree
    2012-06-24T15:43:19+08:002012-06-24T15:43:19+08:00

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

    • -1

相关问题

  • 应该使用哪个 PHP(操作码)缓存,为什么?

  • 使用多台服务器为网站提供服务的速度缺点是什么?

  • 快速查询大型数据集:MySQL MEMORY (HEAP) 引擎、MyISAM 或其他东西(例如 MemCached)

  • nginx 和 memcached 协同工作的效果如何?

  • “<service_name> 已死,但子系统已锁定”是什么意思?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve