如何解決TCP?socket的阻塞問題
解決TCP socket的阻塞問題
大家知道,tcp的讀和寫是阻塞的,即讀的時(shí)候不知道什么時(shí)候讀完,寫的時(shí)候不知道什么時(shí)候?qū)懲辏虼司€程就一直暫停在哪里,一般tcp程序用在上位機(jī)下位機(jī)之間對(duì)吧!
下位機(jī)一些設(shè)備一般會(huì)發(fā)心跳報(bào)文給我們機(jī)器,假設(shè)為10s發(fā)一次吧,當(dāng)機(jī)器超過10s沒接收到數(shù)據(jù),那么我們就要考慮把socket斷開,因?yàn)椴粩嚅_的話設(shè)備重新連接可能又會(huì)建立新的socket,這樣如果設(shè)備反復(fù)斷開連接的話,將產(chǎn)生大量的socket,占用大量系統(tǒng)資源,這里我們用socket.setSoTimeout(500)方法解決read方法的阻塞問題,同時(shí)設(shè)定一個(gè)標(biāo)志位
在異常處理程序當(dāng)中退出socket連接
public void run(){ InputStream is = null; OutputStream os = null; int flag = 0; try { socket.setSoTimeout(500); // 0.5秒就退出read()方法的阻塞 is = socket.getInputStream(); os = socket.getOutputStream(); } catch (Exception e2) { e2.printStackTrace(); } while (true) { try { // 讀取數(shù)據(jù) int readlen = is.read(buff); if (readlen > 0) { flag = 0; } byte data[] = Arrays.copyOfRange(buff, 0, readlen); resolveData(data); } catch (IOException e) { try { flag++; if (flag == 200) { is.close(); os.close(); socket.close(); } } catch (Exception e1) { e1.printStackTrace(); } } } }
TCP連接阻塞的監(jiān)控和處理
那么,什么樣的TCP連接屬于上述發(fā)生阻塞的異常連接呢?結(jié)合線上運(yùn)維經(jīng)驗(yàn)
我們整理出符合該類異常的特征如下
- 該連接的Recv_Q的值特別大(超過3M)
- 該連接的Recv_Q的值持續(xù)上漲,造成堆積(在一定滑動(dòng)時(shí)間窗口內(nèi))
- 服務(wù)端進(jìn)程已長(zhǎng)時(shí)間不再處理該連接的請(qǐng)求(超過90秒)
其中Recv_Q的值可以通過netstat或ss系統(tǒng)工具即可進(jìn)行Recv_Q隊(duì)列大小的采樣,從而進(jìn)行閥值判斷。
netstat 的結(jié)果是讀取/proc/net/tcp文件而來的.
如何查看一個(gè)連接的創(chuàng)建時(shí)間
1.nestat -apn | grep xxx查看到對(duì)應(yīng)的連接的進(jìn)程pid和端口
2. 將上下游端口,轉(zhuǎn)換為16進(jìn)制xxxa xxxb
3.然后cat /proc/net/tcp | grep -i xxxa | grep -i xxxb找到該socket連接的inode inodex
4.ls -al /proc/pid/fd | grep inodex即可看見該socket文件的創(chuàng)建時(shí)間.
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
簡(jiǎn)單易懂的java8新特性之lambda表達(dá)式知識(shí)總結(jié)
一直想針對(duì)lambda表達(dá)式作一個(gè)總結(jié),借助于這次公司安排的考試作一個(gè)入門式的總結(jié),對(duì)正在學(xué)習(xí)java的小伙伴們非常有幫助,需要的朋友可以參考下2021-05-05解析Java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的方法詳解
本篇文章是對(duì)Java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼功能的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05詳解JSON與?Java對(duì)象之間的轉(zhuǎn)化
在現(xiàn)在的日常開發(fā)中,不管前端還是后端,JSON?格式的數(shù)據(jù)是用得比較多的,甚至可以說無處不在。所以本文主要來講講JSON?格式的數(shù)據(jù)與?Java?對(duì)象之間的轉(zhuǎn)化吧2023-03-03