異常處理 api服務大量鏈結超時

2021-09-12 13:03:08 字數 2315 閱讀 8855

現象:大量訪問超時

跟進:定位log,有大量長耗時請求。

netstat -ant|awk '/^tcp/  end '

last_ack 14

syn_recv 348

established 5938

fin_wait1 229

fin_wait2 30

closing 33

time_wait 18122

closed:無連線是活動的或正在進行

listen:伺服器在等待進入呼叫

syn_recv:乙個連線請求已經到達,等待確認

syn_sent:應用已經開始,開啟乙個連線

established:正常資料傳輸狀態

fin_wait1:應用說它已經完成

fin_wait2:另一邊已同意釋放

itmed_wait:等待所有分組死掉

closing:兩邊同時嘗試關閉

time_wait:另一邊已初始化乙個釋放

last_ack:等待所有分組死掉

先來看看netstat:

netstat -n

active internet connections (w/o servers)

proto recv-q send-q local address foreign address state

tcp 0 0 123.123.123.123:80 234.234.234.234:12345 time_wait

你實際執行這條命令的時候,可能會得到成千上萬條類似上面的記錄,不過我們就拿其中的一條就足夠了。

再來看看awk:

/^tcp/

濾出tcp開頭的記錄,遮蔽udp, socket等無關記錄。

state相當於定義了乙個名叫state的陣列

nf表示記錄的字段數,如上所示的記錄,nf等於6

$nf表示某個欄位的值,如上所示的記錄,$nf也就是$6,表示第6個字段的值,也就是time_wait

state[$nf]表示陣列元素的值,如上所示的記錄,就是state[time_wait]狀態的連線數

++state[$nf]表示把某個數加一,如上所示的記錄,就是把state[time_wait]狀態的連線數加一

end表示在最後階段要執行的命令

for(key in state)

遍歷陣列

net.ipv4.tcp_syncookies = 1 表示開啟syn cookies。當出現syn等待佇列溢位時,啟用cookies來處理,可防範少量syn攻擊,預設為0,表示關閉;

net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將time-wait sockets重新用於新的tcp連線,預設為0,表示關閉;

net.ipv4.tcp_tw_recycle = 1 表示開啟tcp連線中time-wait sockets的快速**,預設為0,表示關閉。

net.ipv4.tcp_fin_timeout 修改系預設的 timeout 時間

然後執行 /sbin/sysctl -p 讓引數生效.

/etc/sysctl.conf是乙個允許改變正在執行中的linux系統的介面,它包含一些tcp/ip堆疊和虛擬記憶體系統的高階選項,修改核心引數永久生效。

簡單來說,就是開啟系統的timewait重用和快速**。

如果以上配置調優後效能還不理想,可繼續修改一下配置:

vi /etc/sysctl.conf

net.ipv4.tcp_keepalive_time = 1200

#表示當keepalive起用的時候,tcp傳送keepalive訊息的頻度。預設是2小時,改為20分鐘。

net.ipv4.ip_local_port_range = 1024 65000

#表示用於向外連線的埠範圍。預設情況下很小:32768到61000,改為1024到65000。

net.ipv4.tcp_max_syn_backlog = 8192

#表示syn佇列的長度,預設為1024,加大佇列長度為8192,可以容納更多等待連線的網路連線數。

net.ipv4.tcp_max_tw_buckets = 5000

#表示系統同時保持time_wait套接字的最大數量,如果超過這個數字,time_wait套接字將立刻被清除並列印警告資訊。

預設為180000,改為5000。對於apache、nginx等伺服器,上幾行的引數可以很好地減少time_wait套接字數量,但是對於 squid,效果卻不大。此項引數可以控制time_wait套接字的最大數量,避免squid伺服器被大量的time_wait套接字拖死。

JedisPool異常Jedis鏈結處理

問題現象 jedis 2.1.0.jar 問題現象 jedis 2.1.0.jar 基於jedispool管理jedis物件,通過get方法獲取值,出現key對應的value值錯誤,例如 k va a b bjedis.get a b 通過獲取key為a的值,但獲取了值b來。同一套 的專案,分別部署...

linux 編譯鏈結libcurl異常處理

strerror.c text 0x3f3 undefined reference to idna strerror libcurl libcurl.a libcurl la timeval.o in function curlx tvnow timeval.c text 0x8f undefine...

linux c tcp服務帶超時處理的c s

1.server deepfuture deepfuture laptop private mytest testtcps server wait.server read deepfuture.iteye.com server send hello server read deepfuture.it...