亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 急~~~~~~~~~lsof 顯示socket資源未釋放,但是我是正常關閉了的 [打印本頁]

作者: korpus    時間: 2013-08-23 16:48
標題: 急~~~~~~~~~lsof 顯示socket資源未釋放,但是我是正常關閉了的
本帖最后由 korpus 于 2013-08-27 11:08 編輯

現(xiàn)在有兩臺機器  在A機器編譯運行程序完全正常,socket關閉后,lsof -c ufs查看到?jīng)]有socket異常的情況

把程序考到B機器上去編譯,測試后,用lsof -c ufs發(fā)現(xiàn)有下面的,這太多了就會占用文件句柄資源,導致最后無法打開文件。
ufs     16617 cdadmin    8u  sock       0,6      0t0 406587399 can't identify protocol

實在不明白這是怎么回事? 有人能幫忙一下嗎?

A機器 Linux DEV1 2.6.32-131.0.15.el6.x86_64
B機器 Linux UAT1 2.6.32-131.0.15.el6.x86_64

ulimit 查看兩個機器的配置都一樣
作者: korpus    時間: 2013-08-23 17:09
觀察到A機器上偶爾也會有 can't identify protocol  但是一會兒就消失了
作者: myworkstation    時間: 2013-08-23 21:19
回復 1# korpus


    通常出現(xiàn)這個錯誤都是由于程序的bug導致沒有正常關閉socket引起的。比如說mongo db就有在connect失敗時沒有正常關閉socket的總是。
作者: Aquester    時間: 2013-08-23 21:47
可能兩種情況:
1.BUG漏close()了
2.引用計數(shù)原因

有沒有父子進程?
這個問題用valgrind工具測試一下就知道了,另外如果是被動關閉一方,會有個timed_wait狀態(tài),在未消失之前,會繼續(xù)占用資源。
作者: korpus    時間: 2013-08-23 22:11
回復 3# myworkstation


    謝謝您的關注哈。

我開始也是這么想的。同樣的代碼在兩個機器上分別編譯,運行。第一個機器上面有錯誤,第二個上面沒有。在第二個機器上面我連續(xù)跑壓力測試沒問題。但是第一個機器上面就有。太奇怪了。

在第一個機器里面,socket我都檢查了都關了。而且netstat 狀態(tài)看了也沒有異常狀態(tài),但是就是有 can't identify protocol ...
作者: korpus    時間: 2013-08-23 22:13
回復 4# Aquester


    close都關了的,netstat -na |grep 端口號 ; lsof  -c 程序看   都沒有了異常連接。。

但是我在另一個機器上都是正常的,偶爾出現(xiàn) can't identify protocol  ,不過一會兒就沒有了
作者: Aquester    時間: 2013-08-23 22:43
korpus 發(fā)表于 2013-08-23 22:13
回復 4# Aquester


會正常消失,也說明了close()沒有漏調(diào)用,會不會是因為句柄數(shù)超過了進程允許最大的?ulimit -a看看。
作者: korpus    時間: 2013-08-24 00:03
回復 7# Aquester


    看過 ulimit -a 都是1024,但是機器A上面的文件句柄是沒有超過1024的,超過1024會報open too many files
作者: cxytz01    時間: 2013-08-24 02:23
lsof沒用過,但是lsof是通過掃描/proc/$pid/fd/來確定打開的文件描述符的,樓主的程序打開了多少個fd全在這個文件里面得到體現(xiàn)。
具體你進去ls -lp一下就一目了然了。

另外,兩臺機器的體系結(jié)構是否一樣,干脆你就把另一臺機器的binary直接考到第二臺機器運行看看。


作者: korpus    時間: 2013-08-25 14:12
回復 9# cxytz01


    硬件都是虛擬機安裝的,一個操作系統(tǒng)版本,但是其他設置不知道是否一樣。
作者: korpus    時間: 2013-08-27 11:05
我的架構是這樣的,  程序是個多線程。

啟動一個監(jiān)聽線程,監(jiān)聽socket連接。socket讀取到數(shù)據(jù)后,將socket描述符及信息地址發(fā)送到消息隊列中去。
啟動線程池,這些線程池不斷的從消息隊列中讀取數(shù)據(jù)。

當其中有一個線程從消息隊列中取到數(shù)據(jù)時,解析報文,并實時給剛才的socket套接字返回報文,然后關閉。中途可能會給其他服務器發(fā)送報文。


大致的邏輯就是這樣的。這2天用strace也跟蹤看了下,發(fā)現(xiàn)套接字都關了的啊。!~

這到底是腫么回事呢  ?  

求高手指導~~~
作者: korpus    時間: 2013-08-27 11:14
自己用了db2 client ,做的是sqc程序,會不會和db2有關?
作者: myworkstation    時間: 2013-08-27 11:14
回復 11# korpus


    “將socket描述符及信息地址發(fā)送到消息隊列中去”你用dup之類的方法了嗎?
作者: korpus    時間: 2013-08-27 11:17
回復 13# myworkstation


    沒有用dup

    一個進程維護一張文件描述表,這個還需要dup嗎 ?
作者: myworkstation    時間: 2013-08-27 11:36
回復 14# korpus


    不用,我的意思是如果你用dup就有問題了,因為是fd是引用計數(shù)的,如果dup了,那么close一次是釋放不掉資源的
作者: korpus    時間: 2013-08-27 11:53
回復 15# myworkstation


    恩。

    昨天跑了一個晚上出現(xiàn)過!,F(xiàn)在又在跑測試,又沒得這個現(xiàn)象。。我(粗口) 氣死了。。。。 萬一上線有問題,就死翹翹了,悲劇。。。


    還有我的測試客戶端 和服務端 是在一臺機器上,照例來說應該沒影響啊 。。。5秒并發(fā)50.。。發(fā)現(xiàn)time_wait到時蠻多的有2000多個
作者: korpus    時間: 2013-08-28 09:08
我去,昨天一直沒有,昨晚繼續(xù)跑了一晚上。。今天來就看見一大推的 can't identify protocol  

沒有一個人知道嗎?




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2