公司的一臺(tái)服務(wù)器升級,原先運(yùn)行正常的一個(gè)服務(wù)經(jīng)常會(huì)跳出,于是予以分析解決。
該服務(wù)是一個(gè)tcp的服務(wù)端程序,被動(dòng)接收客戶端連接處理數(shù)據(jù),升級后當(dāng)客戶端連接到一定量后程序會(huì)自動(dòng)跳出。
使用netstat查看各個(gè)狀態(tài)的數(shù)量
netstat -na |awk ‘{print $6}’|sort |uniq -c |sort -nr
發(fā)現(xiàn)很多的CLOSE_WAIT,并且還在不斷增加中。
覺得可能是CLOSE_WAIT得不到釋放,占用很多資源,
于是修改sysctl.conf中關(guān)于tcp連接的連接時(shí)間等設(shè)置,結(jié)果問題依舊。
懷疑收到攻擊,使用
netstat -na |grep CLOSE_WAIT|awk ‘{print $5}’|awk -F”:” ‘{print $1}’|sort |uniq -c |sort -nr |wc -l 查看連接過來的地址,發(fā)現(xiàn)都是地址來源都是正常的
首先檢查
使用 ps -fe |grep programname 查看獲得進(jìn)程的pid
再使用 ps -Lf pid 查看對應(yīng)進(jìn)程下的線程數(shù),發(fā)現(xiàn)數(shù)值為303,遠(yuǎn)小于實(shí)際應(yīng)該的數(shù)量。于是初步判斷是由于線程數(shù)不夠造成的原因。查找資料發(fā)現(xiàn)可以通過設(shè)置 ulimit -s 來增加每進(jìn)程線程數(shù)。
每進(jìn)程可用線程數(shù) = VIRT上限/stack size
其中 VIRT 上限: 32位x86 = 3G 64位x64=64G
statck size 默認(rèn)是 10240 因此在默認(rèn)情況下
32位系統(tǒng)上單進(jìn)程最多可以創(chuàng)建300個(gè)線程,
64系統(tǒng)在內(nèi)存充足的情況下最多可以創(chuàng)建 6400 個(gè)線程。
在機(jī)器硬件固定的情況下,可以通過 ulimit -s 降低stack size 的設(shè)置值來獲得更多的每進(jìn)程線程數(shù)。