最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

linux上TCP connection timeout問題解決辦法

 更新時間:2017年04月14日 09:49:25   投稿:lqh  
這篇文章主要介紹了 linux上TCP connection timeout問題解決辦法的相關資料,需要的朋友可以參考下

 linux上TCP connection timeout問題解決辦法

最近在產線上經常出現connection timeout的問題,先看看Java 中關于connection timeout 的異常如何產生

JAVA中的timeout

java.net.SocketTimeoutException: connect timed out 
客戶端異常:connect timed out 
  at java.net.PlainSocketImpl.socketConnect(Native Method) 
  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
  at java.net.Socket.connect(Socket.java:589) 

我們能經常看到的connect timed out異常產生,看一下java 是如何生成這個異常

plainsocketimpl.c 中

while (1) { 
        jlong newTime; 
#ifndef USE_SELECT 
        { 
          struct pollfd pfd; 
          pfd.fd = fd; 
          pfd.events = POLLOUT; 
 
          errno = 0; 
          connect_rv = NET_Poll(&pfd, 1, timeout); 
        } 
#else 
        { 
          fd_set wr, ex; 
          struct timeval t; 
 
          t.tv_sec = timeout / 1000; 
          t.tv_usec = (timeout % 1000) * 1000; 
 
          FD_ZERO(&wr); 
          FD_SET(fd, &wr); 
          FD_ZERO(&ex); 
          FD_SET(fd, &ex); 
 
          errno = 0; 
          connect_rv = NET_Select(fd+1, 0, &wr, &ex, &t); 
        } 
#endif 
 
        if (connect_rv >= 0) { 
          break; 
        } 
        if (errno != EINTR) { 
          break; 
        } 
 
        /* 
         * The poll was interrupted so adjust timeout and 
         * restart 
         */ 
        newTime = JVM_CurrentTimeMillis(env, 0); 
        timeout -= (newTime - prevTime); 
        if (timeout <= 0) { 
          connect_rv = 0; 
          break; 
        } 
        prevTime = newTime; 
 
      } /* while */ 
 
      if (connect_rv == 0) { 
        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketTimeoutException", 
              "connect timed out"); 
 
        /* 
         * Timeout out but connection may still be established. 
         * At the high level it should be closed immediately but 
         * just in case we make the socket blocking again and 
         * shutdown input & output. 
         */ 
        SET_BLOCKING(fd); 
        JVM_SocketShutdown(fd, 2); 
        return; 
      } 

這里可以看到在做connect的時候,是調用 NET_Poll 或者 NET_Select, 在linux 上就是使用 poll/select

當發(fā)生timeout的時候connect_rv=0  ,這里有個注意點雖然在poll/select 是傳入timeout的時間,但是這是會被打斷的,connect_rv返回的值為-1 ,所以jvm里面重新計算了timeout , 確保timeout 的時間片已經運行完了,才推出循環(huán)。

newTime = JVM_CurrentTimeMillis(env, 0); 
        timeout -= (newTime - prevTime); 
        if (timeout <= 0) { 
          connect_rv = 0; 
          break; 
        } 

同時設置connect_rv 為0, 也是下面只有當connect_rv為0的時候才拋出connect timeout

什么是connect timeout ?

也就是client 發(fā)出 syn 包,server端在你指定的時間內沒有回復ack,poll/select 返回0

server 端為什么沒有回復ack, 因為syn包的回復是內核層的,要么網絡層丟包,要么就是內核層back_log的queue滿了,關于backlog在本片中就不詳細描述了。

當時查看產線上的連接最高能到1000多,同時查看了backlog 的queue的大小

cat /proc/sys/net/ipv4/tcp_max_syn_backlog 

有8192 在產線上沒有這么多的客戶端的連接,不可能backlog queue會滿,雖然syn_backlog 的設置是8192 但并不代表服務器啟動的時候設置成了8192,所以必須查這個端口所設置的backlog大小

ss -lt 

看到Send-Q在8080端口是128 ,原來在服務器端啟動listen 的時候設置了128的backlog

查看tomcat 的配置,默認bio的設置

<Connector executor="tomcatThreadPool" 
      port="8080"  
        protocol="HTTP/1.1" 
          acceptCount="5000" 
          connectionTimeout="25000" 
          maxHttpHeaderSize="8192" 
          useBodyEncodingForURI="true" 
          enableLookups="false"  
          redirectPort="8443"  
          URIEncoding="UTF-8"  
          maxThreads="500" 
          maxKeepAliveRequests="1000" 
          keepAliveTimeout="30000" 
        /> 

產線上已經設置了acceptCount, 默認是100 但是這里設置了是5000 ,這與通過ss看到的send-q的結果嚴重不符合
通過內核代碼分析,發(fā)現原來內核參數不僅僅是通過tcp_max_syn_backlog控制,同時也受somaxconn控制
查看

cat /proc/sys/net/core/somaxconn 

發(fā)現值是128, OK 原因找到了,修改/etc/sysctl.conf 添加

net.core.somaxconn = 8192 

sysctl -f /etc/sysctl.conf 重新加載一下,這樣就能改變全局了

問題:是1000多個連接,500個工作線程,因為backlog的大小是受socket.accept控制的,我們通常境況下會單獨起一個線程去serversocket.accept(),而當前server的load并不高,不因該會出現back_log queue出現滿的情況,更何況只有1000多個連接,代碼就是真相,查看tomcat的源碼。

原來accptor 線程在accept 之前,會去countUpOrWaitConnection 發(fā)現接受到的的socket數目大于設置的work線程數目的時候,會停止accept.

<strong>countUpOrAwaitConnection</strong>(); 
 
         Socket socket = null; 
         try { 
           // Accept the next incoming connection from the server 
           // socket 
           socket = serverSocketFactory.acceptSocket(serverSocket); 
         } catch (IOException ioe) { 
           countDownConnection(); 
           // Introduce delay if necessary 
           errorDelay = handleExceptionWithDelay(errorDelay); 
           // re-throw 
           throw ioe; 
         } 

也就是說當并發(fā)超過628個連接以上,就有可能出現backlog queue滿的情況,而出現connect timeout的情況,一切皆清楚了。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • linux封鎖IP簡單防御UDP攻擊

    linux封鎖IP簡單防御UDP攻擊

    這篇文章主要介紹了linux使用封鎖IP的辦法簡單防御UDP攻擊,需要的朋友可以參考下
    2015-01-01
  • ubuntu19.04安裝教程(圖文步驟)

    ubuntu19.04安裝教程(圖文步驟)

    這篇文章主要介紹了ubuntu19.04安裝教程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-10-10
  • KLOXO重置管理員登陸密碼的方法分享

    KLOXO重置管理員登陸密碼的方法分享

    今天準備整理面板的配置問題的,登陸密碼忘記了,郁悶不已。我們只有通過SSH來重置KLOXO初始密碼
    2012-09-09
  • vsftpd用戶禁止ssh登陸的實現方法

    vsftpd用戶禁止ssh登陸的實現方法

    這篇文章主要給大家介紹了關于vsftpd用戶禁止ssh登陸的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • apache性能測試工具ab使用詳解

    apache性能測試工具ab使用詳解

    這篇文章主要介紹了apache性能測試工具ab使用詳解,需要的朋友可以參考下
    2015-01-01
  • Ubuntu下開啟php調試模式報錯信息解決辦法

    Ubuntu下開啟php調試模式報錯信息解決辦法

    這篇文章主要介紹了Ubuntu下開啟php調試模式報錯信息解決辦法的相關資料,需要的朋友可以參考下
    2016-12-12
  • 使用VSCode和SSH進行遠程開發(fā)

    使用VSCode和SSH進行遠程開發(fā)

    這篇文章主要介紹了使用VSCode和SSH進行遠程開發(fā),文中通過圖文以及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • linux下統(tǒng)計appche站點IP訪問量的shell腳本

    linux下統(tǒng)計appche站點IP訪問量的shell腳本

    這篇文章主要介紹了linux下統(tǒng)計appche站點IP訪問量的幾種shell腳本以及執(zhí)行結果
    2014-06-06
  • Linux Centos7系統(tǒng)端口占用問題的解決方法

    Linux Centos7系統(tǒng)端口占用問題的解決方法

    這篇文章主要給大家介紹了關于Linux Centos7系統(tǒng)端口占用問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01
  • centos7 mysql數據庫安裝和配置

    centos7 mysql數據庫安裝和配置

    本篇文章主要介紹了centos7 mysql數據庫安裝和配置 ,非常具有實用價值,希望對大家實用mysql能夠有所幫助
    2017-01-01

最新評論

凤庆县| 扬州市| 金门县| 桃源县| 焉耆| 吉水县| 乳山市| 莫力| 三台县| 鹤山市| 边坝县| 藁城市| 临颍县| 富川| 长子县| 新闻| 吴江市| 雅江县| 福海县| 廊坊市| 随州市| 凤庆县| 聂拉木县| 玛多县| 田林县| 东台市| 沧源| 鸡东县| 松原市| 思南县| 涞水县| 北海市| 平利县| 花莲县| 丰镇市| 古丈县| 金川县| 赤壁市| 衡东县| 拜城县| 朔州市|