个人memcached服务器系统配置及相关编译启动参数以下:php
系统硬件:IBM HS20 , 内存8G,无磁盘 操做系统:Centos 5.2 64位 无盘系统,其中4G作为系统内存盘 使用memcached版本:memcached-1.4.10 使用libevent版本:libevent-2.0.15-stable 编译参数:./configure --prefix=/data/update/20111114/memcached --enable-64bit --with-libevent=../libevent-2.0.15 memcached启动参数:/opt/memcache-1.4.10/bin/memcached -vv -o hashpower=24 -p 10091 -U 0 -f 1.001 -n 256 -m 3072 -c 2048 -u appl -d
用gdb -p ,发现memcached 除了网络线程工做正常,其它的四个工做线程都处于死锁状态。
用-vv参数,打开memcached的日志,发现memcached当出现上面的状况前,日志结尾部分老是会报:Hash table expansion starting,而后就卡在那里了。出错信息以下:算法
Hash table expansion starting <62 get 1379035377@qq.com_MJSG_protected <53 get 1379035377@qq.com_0f3f9cc9c88b91b92f0931e518d99020 <50 get 479650897@qq.com_basic Too many open connections
查了一下memcached的hash算法的说明,发现当哈希表中的item数大于表的大小的3/2时,则哈希表进行扩张。而每次作hash表自动扩张操做时,memcached程序就会产生死锁。让写C的同事看了一下,一时也找不出具体卡住的缘由。服务器
解决方法是:查看memcached的命令行参数,发现有一个-o 参数,能够设置hashpower,系统默认大小是16,也就是2的16次方,也就是说,如可memcached中item的数量大于65536*3/2=98304时,就会作hash表的扩张。能够把这个值设置得大一点,也就是设置默认hash表的大小大一点,就不会进行扩张了。
个人设置参数是:网络
-o hashpower=24, #hash表能够容纳2400W的item,而不须要进行hash表的自动扩张
进上面的的设置后,memcached死锁的问题解决,但具体memcached 为何会在自动进行hash表扩张时,会产生死锁的缘由仍是没有找到。可能的缘由是
一、使用的无盘系统
二、把memcached的增涨因子 -f 1.001 设置的过小。app