在添加magent代理后,做memcached測試的發現,如果并發很高,數據庫的連接數居高不下,按理講隨著將key存入緩存中,連接數應該慢慢降下來才對,但是當并發低的時候卻很正常。
由于在啟動memcached時,加入了-vvv參數打印內部狀態信息,查看日志:
29: going from conn_parse_cmd to conn_write
29: going from conn_write to conn_new_cmd
29: going from conn_new_cmd to conn_waiting
29: going from conn_waiting to conn_read
28: going from conn_new_cmd to conn_waiting
28: going from conn_waiting to conn_read
28: going from conn_read to conn_closing
從日志中可以看出,memcached沒有接受命令就關閉連接了。
再從/var/log/messages日志中發現如下信息刷屏:
kernel: nf_conntrack: table full, dropping packet
這是iptables的報錯信息“連接跟蹤表已滿,開始丟包”,再想到網站那面將memcached的連接改為短連接,由于iptables會記錄每個連接的跟蹤信息,而連接關閉關閉過于頻繁導致連接跟蹤表滿,出現丟包。
解決方法:
首先將memcached的連接方法改為長鏈接,然后再針對nf_conntrack進行修改,主要有以下幾種方式:
1.關閉防火墻
chkconfig iptables off
chkconfig ip6tables off
service iptables stop
service ip6tables stop
注意:在防火墻關閉的狀態下,不要使用iptables -L -vnx來查看狀態!因為這樣會導致防火墻被啟動,而且規則為空。雖然不會有任何攔截效果,但所有連接狀態都會被記錄,浪費資源且影響性能并可能導致防火墻主動丟包!
2.加大iptables跟蹤表大小,調整對應的系統參數
3.使用裸表,不添加跟蹤標志
4.刪除連接跟蹤模塊
具體的修改過程請參考 http://www.linuxidc.com/Linux/2015-06/118685.htm ,這里說的比較詳細。