之前寫過一篇關于apache的并發請求的文章,如今更深入的研究了一下,給大家分享,自己也做個筆記了。
上次說到這個牛逼的語句
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
FIN_WAIT_1 286
FIN_WAIT_2 960
SYN_SENT 3
LAST_ACK 32
CLOSING 1
CLOSED 36
SYN_RCVD 144
TIME_WAIT 2520
ESTABLISHED 352
返回參數的說明如下:
CLOSED:無連接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個連接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個連接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
TIME_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉
TCP變遷圖:
pache服務器的fin_wait1過多time_wait過多問題解決
1、fin_wait1狀態過多。fin_wait1狀態是在server端主動要求關閉tcp連接,并且主動發送fin以后,等待client端回復ack時候的狀態。fin_wait1的產生原因有很多,需要結合netstat的狀態來分析。
上面的命令可以幫助分析哪種tcp狀態數量異常
則可以幫助你將請求80服務的client ip按照連接數排序。
2、time_wait狀態過多。
通常表現為apache服務器負載高,w命令顯示load average可能上百,但是web服務基本沒有問題。同時ssh能夠登陸,但是反應非常遲鈍。
原因:最可能的原因是httpd.conf里面keepalive沒有開,導致每次請求都要建立新的tcp連接,請求完成以后關閉,增加了很多time_wait的狀態。另,keepalive可能會增加一部分內存的開銷,但是問題不大。
分析:如果發現fin_wait1狀態很多,并且client ip分布正常,那可能是有人用肉雞進行ddos攻擊、又或者最近的程序改動引起了問題。一般說來后者可能性更大,應該主動聯系程序員解決。
但是如果有某個ip連接數非常多,就值得注意了,可以考慮用iptables直接封了他。
查IP的關于80端口的連接數可以用:
netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n
可以看到目前IP的連接數。太多的,就要注意了。
此外再分享一個實時查看apache并發數的:
watch -n 1 -d "pgrep httpd|wc -l",冒號里的語句可以自己調啦~
當然目前我還有幾個沒搞清楚的問題,希望大家能教教我哈~
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
