通過屢次壓力測試,發現sphinx在高併發時出現負載忽然提高,而且響應速度明顯降低。通過多方面的排查,發現是因爲PHP與sphinx自帶的 searchd進行socket的鏈接以後,系統內存有大量的Time_Wait鏈接,因此咱們猜想爲searchd的socket鏈接未及時關閉,形成 大量請求堆積,使得PHP客戶端與sphinx的請求效率低下。因爲searchd是編譯好的,沒法進行OPT設置,故我作了內核調整,來優化 socket鏈接釋放時間,具體參數以下php
vi /etc/sysctl.confweb
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
說明:
net.ipv4.tcp_timestamps = 1 表示開啓對於TCP時間戳的支持,若該項設置爲0,則下面net.ipv4.tcp_tw_recycle的設置將不起做用;
net.ipv4.tcp_syncookies = 1 表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少許SYN攻擊,默認爲0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 表示開啓重用。容許將TIME-WAIT sockets從新用於新的TCP鏈接,默認爲0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啓TCP鏈接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。服務器
再執行如下命令,讓修改結果當即生效:
/sbin/sysctl -p
用如下語句看了一下服務器的TCP狀態:
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
雖然這樣修改以後仍是會有不少的TIME_WAIT鏈接,但性能已經比以前的提高不少。
如下爲修改以前的請求:cookie
#webbench -c 300 -t 30 http://192.168.1.29/sphinx/sphinx_nocache.php
Webbench – Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.併發
Benchmarking: GET http://192.168.1.29/sphinx/sphinx_nocache.php
300 clients, running 30 sec.socket
Speed=66986 pages/min, 290593 bytes/sec.
Requests: 33493 susceed, 0 failed.
如下爲修改以後的測試結果:tcp
#webbench -c 300 -t 30 http://192.168.1.29/sphinx/sphinx_nocache.php
Webbench – Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.高併發
Benchmarking: GET http://192.168.1.29/sphinx/sphinx_nocache.php
300 clients, running 30 sec.性能
Speed=91326 pages/min, 398190 bytes/sec.
Requests: 45663 susceed, 0 failed.
能夠明顯的看到效率的明顯提高測試
來源:http://blog.itphp.org/archives/107