成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從一起丟包故障來談?wù)?nginx 中的 tcp keep-alive

Shihira / 2477人閱讀

摘要:猜測原因是一端異常關(guān)閉了連接卻沒有通知對(duì)端,或者通知了對(duì)端但對(duì)端沒有收到。序號(hào)請(qǐng)求設(shè)置了超時(shí)時(shí)間為,因此發(fā)送包。之后繼續(xù)測試,沒有發(fā)現(xiàn)丟包。序號(hào)空閑分鐘后,主動(dòng)發(fā)起報(bào)文,關(guān)閉連接。

一、故障

基本架構(gòu)如圖所示,客戶端發(fā)起 http 請(qǐng)求給 nginx,nginx 轉(zhuǎn)發(fā)請(qǐng)求給網(wǎng)關(guān),網(wǎng)關(guān)再轉(zhuǎn)發(fā)請(qǐng)求到后端微服務(wù)。

故障現(xiàn)象是,每隔十幾分鐘或者幾個(gè)小時(shí)不等,客戶端就會(huì)得到一個(gè)或者連續(xù)多個(gè)請(qǐng)求超時(shí)錯(cuò)誤。查看 nginx 日志,對(duì)應(yīng)請(qǐng)求返回 499;查看網(wǎng)關(guān)日志,沒有收到對(duì)應(yīng)的請(qǐng)求。

從日志分析,問題應(yīng)該處在 nginx 或者 spring-cloud-gateway 上。

nginx 版本:1.14.2,spring-cloud 版本:Greenwich.RC2。

nginx 主要配置如下:

[root@wh-hlwzxtest1 conf]# cat nginx.conf

worker_processes  8;

events {
    use epoll;
    worker_connections  10240;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;

    keepalive_timeout  65;
    #gzip  on;

    upstream dbg2 {
        server 10.201.0.27:8888;
        keepalive 100;
    }

   server {
        listen       80;
        server_name  localhost;

        charset utf-8;

        location /dbg2/ {
            proxy_pass         http://dbg2/;
            proxy_http_version  1.1;
            proxy_set_header    Connection "";
         }
    }
}

為了提高性能,nginx 發(fā)送給網(wǎng)關(guān)的請(qǐng)求為 http 1.1,可以復(fù)用 tcp 連接。

二、排查 1、查看 tcp 連接
[[email protected] logs]# ss -n | grep 10.201.0.27:8888
tcp    ESTAB      0      0      10.197.0.38:36674              10.201.0.27:8888
tcp    ESTAB      0      0      10.197.0.38:40106              10.201.0.27:8888

[[email protected] opt]# ss -n | grep 10.197.0.38
tcp    ESTAB      0      0        ::ffff:10.201.0.27:8888                 ::ffff:10.197.0.38:40106
tcp    ESTAB      0      0        ::ffff:10.201.0.27:8888                 ::ffff:10.197.0.38:39266

可以看到 nginx 和網(wǎng)關(guān)之間建立的 socket 連接為 (10.201.0.27:8888,10.197.0.38:40106),另外的 2 條記錄就很可疑了。猜測原因是:一端異常關(guān)閉了 tcp 連接卻沒有通知對(duì)端,或者通知了對(duì)端但對(duì)端沒有收到。

2、抓包分析

先看下 nginx 的抓包數(shù)據(jù):

序號(hào) 8403:轉(zhuǎn)發(fā) http 請(qǐng)求給網(wǎng)關(guān);

序號(hào) 8404:在 RTT 時(shí)間內(nèi)沒有收到 ack 包,重發(fā)報(bào)文;

序號(hào) 8505:RTT 約等于 0.2s,tcp 重傳;

序號(hào) 8506:0.4s 沒收到 ack 包,tcp 重傳;

序號(hào) 8507:0.8s 沒收到 ack 包,tcp 重傳;

序號(hào) 8509:1.6s 沒收到 ack 包,tcp 重傳;

...

序號(hào)8439:28.1s(128RTT)沒收到 ack 包,tcp 重傳。

序號(hào) 8408:請(qǐng)求設(shè)置了超時(shí)時(shí)間為 3s,因此發(fā)送 FIN 包。

再看下網(wǎng)關(guān)的抓包數(shù)據(jù):

序號(hào) 1372:17:24:31 收到了 nginx 發(fā)過來的 ack 確認(rèn)包,對(duì)應(yīng) nginx 抓包圖中的序號(hào) 1348(nginx 那臺(tái)服務(wù)器時(shí)間快了差不多 1 分 30 秒);

序號(hào) 4221:2 小時(shí)后,發(fā)送 tcp keep-alive 心跳報(bào)文,(從 nginx 抓包圖中也可以看出這 2 小時(shí)之內(nèi)該 tcp 連接空閑);

序號(hào) 4253:75s 后再次發(fā)送 tcp keep-alive 心跳;

序號(hào) 4275:75s 后再次發(fā)送心跳;

連續(xù) 9 次;

序號(hào) 4489:發(fā)送 RST 包,通過對(duì)端重置連接。

2 小時(shí),75s, 9 次,系統(tǒng)默認(rèn)設(shè)置。

[root@eureka2 opt]# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
[root@eureka2 opt]# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
[root@eureka2 opt]# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9

具體這幾個(gè)參數(shù)的作用,參考文章:為什么基于TCP的應(yīng)用需要心跳包

3、分析

通過以上抓包分析,基本確認(rèn)了問題出在 nginx 上。19:25 時(shí),網(wǎng)關(guān)發(fā)送 tcp keep-alive 心跳包給 nginx 那臺(tái)服務(wù)器,此時(shí)那臺(tái)服務(wù)器上保留著該 tcp 連接,卻沒有回應(yīng);22:20 時(shí),nginx 發(fā)送 http 請(qǐng)求給網(wǎng)關(guān),而網(wǎng)關(guān)已經(jīng)關(guān)閉該 tcp 連接,因此沒有應(yīng)答。

三、解決 1、proxy_send_timeout

nginx 中與 upstream 相關(guān)的超時(shí)配置主要有如下參數(shù),參考:Nginx的超時(shí)timeout配置詳解

proxy_connect_timeout:nginx 與 upstream server 的連接超時(shí)時(shí)間;

proxy_read_timeout:nginx 接收 upstream server 數(shù)據(jù)超時(shí), 默認(rèn) 60s, 如果連續(xù)的 60s 內(nèi)沒有收到 1 個(gè)字節(jié), 連接關(guān)閉;

proxy_send_timeout:nginx 發(fā)送數(shù)據(jù)至 upstream server 超時(shí), 默認(rèn) 60s, 如果連續(xù)的 60s 內(nèi)沒有發(fā)送 1 個(gè)字節(jié), 連接關(guān)閉。

這幾個(gè)參數(shù),都是針對(duì) http 協(xié)議層面的。比如 proxy_send_timeout = 60s,并不是指如果 60s 沒有發(fā)送 http 請(qǐng)求,就關(guān)閉連接;而是指發(fā)送 http 請(qǐng)求后,在兩次 write 操作期間,如果超過 60s,就關(guān)閉連接。所以這幾個(gè)參數(shù),顯然不是我們需要的。

2、upstream 模塊的 keepalive_timeout 參數(shù)

查看官網(wǎng)文檔,Module ngx_http_upstream_module,

Syntax:    keepalive_timeout timeout;
Default:    
keepalive_timeout 60s;
Context:    upstream
This directive appeared in version 1.15.3.

Sets a timeout during which an idle keepalive connection to an upstream server will stay open.

設(shè)置 tcp 連接空閑時(shí)間超過 60s 后關(guān)閉,這正是我們需要的。

為了使用該參數(shù),升級(jí) nginx 版本到 1.15.8,配置文件如下:

http {
    upstream dbg2 {
        server 10.201.0.27:8888;
        keepalive 100;
        keepalive_requests 30000;
        keepalive_timeout 300s;
    }
    ...
}

設(shè)置 tcp 連接上跑了 30000 個(gè) http 請(qǐng)求或者空閑 300s,那么就關(guān)閉連接。

之后繼續(xù)測試,沒有發(fā)現(xiàn)丟包。

序號(hào) 938:空閑 5 分鐘后,nginx 主動(dòng)發(fā)起 FIN 報(bào)文,關(guān)閉連接。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40322.html

相關(guān)文章

  • Nginx 配置學(xué)習(xí)筆記

    摘要:上面的代碼中定義了一個(gè)名為的負(fù)載均衡器,里面有三個(gè)后端服務(wù),他們是按的方式進(jìn)行輪詢的。在模塊中,可以設(shè)置后端服務(wù)器的信息,同時(shí)還可以設(shè)定每個(gè)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。常用的狀態(tài)有表示當(dāng)前的暫時(shí)不參與負(fù)載均衡。 最近在學(xué)習(xí)如何對(duì) Nginx 進(jìn)行配置,故而對(duì) Nginx 的配置文件的結(jié)構(gòu)功能有了一些新的認(rèn)識(shí)。剛開始接觸 Nginx 時(shí),感覺它的配置十分高深、難以理解,需要配置什么...

    wuyumin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Shihira

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<