笔记 by 车东

启用MEMCACHE_COMPRESSED压缩,“扩容”MemCached

· 缓存|Cache

📌 TLDR

给 Memcached 开 MEMCACHE_COMPRESSED(写入时压缩、memcache_get 自动解压):同样 2G 容量能存的对象数约翻倍,命中率 50% → 60%,内存加两倍后到 90%。三条前提:命中率的提升值得投入、memcached 确实已经用满(memcached-tool 看)、缓存对象别太小(100 字节以下的键值对会膨胀,好在最小块 88B 影响有限)。压缩的 CPU 开销远小于省下的数据库访问。

尝试: 启用了PHP memcache_set()函数中的 MEMCACHE_COMPRESSED压缩选项,而memcache_get()可以在后续读取过程中自动对压缩的缓存对象进行解压缩。

效果: 测试了一下,对于博客大巴目前的应用来说,启用压缩后,相同的容量(2G)存储的对象数量增加了约一倍,缓存命中率从50%左右,提高到了60%左右。进一步提高命中率硬件投入还是必须的,又增加了2倍的内存后终于做到了缓存命中率提高到90%;

前提0: 内存缓存有用,且命中率值得提升; 从60%提高到90%,还是从90%提高到95%,要看hit后的性能能够提升是否值得;

前提1:MemCached已经用满 先用memcached-tool查看一下memcached的容量统计,看memcached是不是已经用满了。如果充分运行时MemCached的空间尚未用满,启用一下压缩是没有意义的; 而且:发现没有用满的MemCached,最好减少相应MemCached的容量,空余出更多内存给其他服务做缓存;

前提2: 压缩率 缓存的数据的确有大于几百字节的,如果都是小于100字节的键值对,压缩可能反而带来膨胀。由于缓存对象的大小在Memcached中都是按照固定大小分块存储的,最小也要88 B。所以对于过小数据带来的压缩膨胀并不是太大的问题;

前台应用的CPU损耗: 对数据的额外压缩CPU损耗远远低于缓存命中率提升减少后台数据库访问带来的性能提升,和http的gzip/deflate压缩类似,压缩后数据一般为原数据大小的30%左右,节省了70%的传输性能消耗所得会大于文件压缩带来的性能损耗;

以下是启用压缩后的一个MemCached的数据块分布:

#  Item_Size   Max_age  1MB_pages Count   Full?
 1     104 B   342694 s      60  604918     yes<==原先最小大部分分布在88 B看来还是有些膨胀的
 2     136 B   344213 s      39  300690     yes
 3     176 B   324647 s     145  863765     yes
 4     224 B   347049 s      52  243412     yes
 5     280 B   332911 s      47  175968     yes
 6     352 B   257080 s     114  339491     yes
 7     440 B   330976 s      39   92934     yes
 8     552 B   310225 s      51   96849     yes
 9     696 B   305251 s      68  102407     yes
10     872 B   298607 s      74   88947     yes
11     1.1 kB  276463 s      70   66919     yes
12     1.3 kB  279819 s      79   60198     yes
13     1.7 kB  293690 s      97   59073     yes
14     2.1 kB  304436 s     116   56492     yes
15     2.6 kB  298020 s     102   39576     yes
16     3.3 kB  324546 s     100   31000     yes
17     4.1 kB  321757 s      97   24056     yes
18     5.2 kB  320132 s      91   18018     yes
19     6.4 kB  332232 s      89   14062     yes
20     8.1 kB  330696 s      81   10287     yes
21    10.1 kB  329582 s      76    7676     yes
22    12.6 kB  337278 s      72    5832     yes
23    15.8 kB  348626 s      66    4224     yes
24    19.7 kB  345881 s      56    2856     yes
25    24.6 kB  345825 s      44    1804     yes
26    30.8 kB  333460 s      31    1023     yes
27    38.5 kB  335782 s      22     572     yes
28    48.1 kB  302109 s      17     357     yes
29    60.2 kB  358674 s      18     306     yes
30    75.2 kB  396573 s      17     221     yes
31    94.0 kB  431605 s      11     110     yes
32   117.5 kB  418652 s       7      56     yes
33   146.9 kB  408422 s       3      17      no
34   183.6 kB  277529 s       2       7      no
35   229.5 kB  139156 s       1       3      no
36   286.9 kB  232221 s       1       1      no
37   358.6 kB    1059 s       3       6     yes

💬 历史评论

以下 2 条评论从旧版 Movable Type 博客迁移而来。 原始评论时间:2002–2016 年。

avenger · 2008-04-14 09:58

Count Full 如果大部分都是 yes 的话,是否代表要加大 memcached 可使用的内存了?


guest · 2009-11-07 17:43

“发现没有用满的MemCached,最好减少相应MemCached的容量,空余出更多内存给其他服务做缓存;”

笔误么?memcached实际占用内存并不是memcached -m X指定的最大可用内存…