個人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