 |
去年的一個項目中,我設計了一個多線程的UDP通訊程式,由我方一臺主機,分別對應四地發(fā)送接收數(shù)據(jù)包。 在生產(chǎn)環(huán)境已經(jīng)非常穩(wěn)健的運行了1年。 最近,隨著業(yè)務的增加,連接的遠端增加到了12個,也就是一個IP向12個IP發(fā)送接收數(shù)據(jù)包。 我在主線程中,管理這12個獨立的通訊線程,互不干擾,由于服務器是2U4核,所以該程式的設計具有一定可伸縮性。 但是,最近維護人員告訴,發(fā)現(xiàn)會發(fā)生某地業(yè)務停頓。一檢查,線程exception terminate。居然報的是:port already bind這個最常見的exception。但是在console里面,重啟這個線程,它又可以正常啟動,并穩(wěn)定的運行。而且它每次發(fā)生的幾率很隨機,有時候死掉1個,有時死掉3個,或者全部正常。 去年,該程式做過多次壓力測試,并沒發(fā)現(xiàn)這個問題,現(xiàn)在唯一導致它發(fā)生的原因就是線程增加了3倍。 仔細分析,發(fā)現(xiàn)多線程的啟動方式,是在spring里面進行管理和注冊jmx,每個線程都事先配置成mbean。啟動的時候,注入一個map里,再循環(huán)啟動。而udp通訊的方式是,隨機的由OS分配端口,會不會是線程的request太快,而OS沒有l(wèi)ock port cache的strategy,我想到這里于是在循環(huán)啟動bean的方法里面,加了一個Thread.sleep(100)。再次測試,解決。 最后,我認為os在分配隨機端口的時候,可能沒有鎖定機制,如果線程的request是高conconrent,就有可能出現(xiàn)重疊,而引發(fā)port lready bind 這個最簡單的錯誤。要解決這個問題,第一就是盡量延長啟動間隔,尤其是多路并發(fā)的server上,第二,人為的控制port的分配。
|
作者:未知 | 文章來源:未知 | 更新時間:2008-1-15 16:39:39
|
|
 |
 |
最新文章 |
|
|
 |