Memcached:检索所有键时如何打破限制
Memcached: How to break the limitation when retrieving all keys
由于我无法在网络中找到任何可靠的程序,一旦 slab 中的键数 > 500k 就会检索所有内存缓存键,我想在 PHP 中编写自己的程序。
然后我意识到所有的程序都不能真正适用于如此多的键是有原因的。
当我用 stats cachedump <slab-id> <limit>
读取密钥时,它 returns 只有一定数量的密钥结束 - 在我的情况下 - 大约 30k。
我怎样才能至少得到这 500k 可能在一个 slab 中?
所有建议使用memdump
的"posts"和"answers"都不行。他们也有这个限制。
我正在使用memcached 1.4.25
调试 memcached
源代码后,我意识到限制在 items.c
/ item_cachedump()
中,由这一行引起:
unsigned int memlimit = 2 * 1024 * 1024; /* 2MB max response size */
由于此分配,分配的缓冲区限制了返回键的数量,因为所有键的总长度[包括每个键名后的 \r\n
] 不得 超过这个尺寸。
我可以通过将其更改为以下方式来解决我的问题:
unsigned int memlimit = 128 * 1024 * 1024;
并重新编译 memcached
。现在我可以读取大约 700k 个键[我没有更多的键来最大化功能]。
我发现一个非常高的值会使系统不稳定。值为 500 * 1024 * 1024
[e.q。 500MB] 我的系统差点因为这条信息崩溃:
shell-init: error retrieving current directory: getcwd: cannot access
parent directories: No such file or directory
即使我的服务器有 5GB RAM 我也不太明白为什么,但最终 128MB 的值是一个可用值。
我要求 memcached
developer team 添加一个可以在命令行中设置值的开关。
由于我无法在网络中找到任何可靠的程序,一旦 slab 中的键数 > 500k 就会检索所有内存缓存键,我想在 PHP 中编写自己的程序。
然后我意识到所有的程序都不能真正适用于如此多的键是有原因的。
当我用 stats cachedump <slab-id> <limit>
读取密钥时,它 returns 只有一定数量的密钥结束 - 在我的情况下 - 大约 30k。
我怎样才能至少得到这 500k 可能在一个 slab 中?
所有建议使用memdump
的"posts"和"answers"都不行。他们也有这个限制。
我正在使用memcached 1.4.25
调试 memcached
源代码后,我意识到限制在 items.c
/ item_cachedump()
中,由这一行引起:
unsigned int memlimit = 2 * 1024 * 1024; /* 2MB max response size */
由于此分配,分配的缓冲区限制了返回键的数量,因为所有键的总长度[包括每个键名后的 \r\n
] 不得 超过这个尺寸。
我可以通过将其更改为以下方式来解决我的问题:
unsigned int memlimit = 128 * 1024 * 1024;
并重新编译 memcached
。现在我可以读取大约 700k 个键[我没有更多的键来最大化功能]。
我发现一个非常高的值会使系统不稳定。值为 500 * 1024 * 1024
[e.q。 500MB] 我的系统差点因为这条信息崩溃:
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
即使我的服务器有 5GB RAM 我也不太明白为什么,但最终 128MB 的值是一个可用值。
我要求 memcached
developer team 添加一个可以在命令行中设置值的开关。