使用memdump转储密钥时,“每个slab类的一页”限制是什么意思?

时间:2017-01-04 07:21:18

标签: memcached

出于调试目的,我想计算内存缓存服务器中的密钥数量,所以我做了一些研究,最后使用了memdump实用程序,它似乎附带了libmemcached。

在命令的描述中,它说:

  

memdump从被告知要获取的所有服务器中转储“密钥”列表。因为memcached不保证提供所有密钥,所以无法获得完整的“转储”。

另外在另一个网站(Memcached Cheat Sheet)上我读到了:

  

[...] memcache协议提供了一些命令来查看由slabs组织的数据(给定大小范围的数据类别)。但是有一些重大的限制:

     
      
  1. 每个slab类只能转储键(内容大小大致相同的键)

  2.   
  3. 每个slab类只能转储一页(1MB数据)

  4.   
  5. 这是一个非官方的功能,可能会随时删除。

  6.         

    [...]

那么You can only dump one page per slab class (1MB of data)在实践中意味着什么?一兆字节的数据是什么?如果一个slab包含超过1 MB的数据(包括密钥?),那么剩余的数据将不会被提取,我可能会错过一些密钥?

作为一个例子,我有3个密钥A和500 KB的数据,B有另外600 KB的数据和C有300 KB的数据,它们都是相同的板。然后在转储密钥时,只有A和B将被转储数据(这可能也会被切断?)

1 个答案:

答案 0 :(得分:0)

memdump实用程序使用memcache协议未记录的命令stats cachedump来获取slab id的密钥列表。您可以在memcached源代码items.c中查看stats cachedump <slabs_id> <limit>实现:

char *item_cachedump(const unsigned int slabs_clsid, const unsigned int limit, unsigned int *bytes) {
        unsigned int memlimit = 2 * 1024 * 1024;   /* 2MB max response size */

    while (it != NULL && (limit == 0 || shown < limit)) {
    // ... key copying occurs here
    if (bufcurr + len + 6 > memlimit)  /* 6 is END\r\n\0 */
                break;
    // ...
    }

因此,如果没有重新编译memcached就不可能为每个slab提供超过2 Mb的密钥。值不会复制到响应缓冲区,响应大小限制仅适用于键。