Linux每程式執行緒數問題處理

mrhaozi發表於2010-07-01

Linux每程式執行緒數問題處理

公司的一臺伺服器升級,原先執行正常的一個服務經常會跳出,於是予以分析解決。
該服務是一個tcp的服務端程式,被動接收客戶端連線處理資料,升級後當客戶端連線到一定量後程式會自動跳出。

使用netstat檢視各個狀態的數量
netstat -na |awk ‘{print $6}’|sort |uniq -c |sort -nr
發現很多的CLOSE_WAIT,並且還在不斷增加中。
覺得可能是CLOSE_WAIT得不到釋放,佔用很多資源,
於是修改sysctl.conf中關於tcp連線的連線時間等設定,結果問題依舊。

懷疑收到攻擊,使用
netstat -na |grep CLOSE_WAIT|awk ‘{print $5}’|awk -F”:” ‘{print $1}’|sort |uniq -c |sort -nr |wc -l 檢視連線過來的地址,發現都是地址來源都是正常的

首先檢查
使用 ps -fe |grep programname 檢視獲得程式的pid
再使用 ps -Lf pid 檢視對應程式下的執行緒數,發現數值為303,遠小於實際應該的數量。於是初步判斷是由於執行緒數不夠造成的原因。查詢資料發現可以透過設定 ulimit -s 來增加每程式執行緒數。

每程式可用執行緒數 = VIRT上限/stack size
其中 VIRT 上限: 32位x86 = 3G 64位x64=64G
statck size 預設是 10240 因此在預設情況下
32位系統上單程式最多可以建立300個執行緒,
64系統在記憶體充足的情況下最多可以建立 6400 個執行緒。

在機器硬體固定的情況下,可以透過 ulimit -s 降低stack size 的設定值來獲得更多的每程式執行緒數。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16396910/viewspace-1034818/,如需轉載,請註明出處,否則將追究法律責任。

相關文章