成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux上TCP的幾個內核參數調優

系統 Linux
Linux作為一個強大的操作系統,提供了一系列內核參數供我們進行調優。光TCP的調優參數就有50多個。在和線上問題斗智斗勇的過程中,筆者積累了一些在內網環境應該進行調優的參數。

Linux作為一個強大的操作系統,提供了一系列內核參數供我們進行調優。光TCP的調優參數就有50多個。在和線上問題斗智斗勇的過程中,筆者積累了一些在內網環境應該進行調優的參數。在此分享出來,希望對大家有所幫助。

調優清單

好了,在這里先列出調優清單。請記住,這里只是筆者在內網進行TCP內核參數調優的經驗,僅供參考。同時,筆者還會在余下的博客里面詳細解釋了為什么要進行這些調優!

序號

內核參數

備注

1.1

/proc/sys/inet/ipv4/tcp_max_syn_backlog

2048


1.2

/proc/sys/net/core/somaxconn

2048


1.3

/proc/sys/net/ipv4/tcp_abort_on_overflow

1


2.1

/proc/sys/net/ipv4/tcp_tw_recycle

0

NAT環境必須為0

2.2

/proc/sys/net/ipv4/tcp_tw_reuse

1


3.1

/proc/sys/net/ipv4/tcp_syn_retries

3


3.2

/proc/sys/net/ipv4/tcp_retries2

5


3.3

/proc/sys/net/ipv4/tcp_slow_start_after_idle

0


當然了,這里只列出TCP的部分內核參數,更多web性能上的建議,請看

tcp_max_syn_backlog,somaxconn,tcp_abort_on_overflow

tcp_max_syn_backlog,somaxconn,tcp_abort_on_overflow這三個參數是關于

內核TCP連接緩沖隊列的設置。如果應用層來不及將已經三次握手建立成功的TCP連接從隊列中取出,溢出了這個緩沖隊列(全連接隊列)之后就會丟棄這個連接。如下圖所示:

從而產生一些詭異的現象,這個現象詭異之處就在于,是在TCP第三次握手的時候丟棄連接

就如圖中所示,第二次握手的SYNACK發送給client端了。所以就會出現client端認為連接成功,而Server端確已經丟棄了這個連接的現象!由于無法感知到Server已經丟棄了連接。

所以如果沒有心跳的話,只有在發出第一個請求后,Server才會發送一個reset端通知這個連接已經被丟棄了,建立連接后第二天再用,也會報錯!所以我們要調大Backlog隊列!

echo 2048 > /proc/sys/inet/ipv4/tcp_max_syn_backlog
echo 2048 > /proc/sys/net/core/somaxconn

當然了,為了盡量避免第一筆調用失敗問題,我們也同時要設置

echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow

設置這個值以后,Server端內核就會在這個連接被溢出之后發送一個reset包給client端。

如果我們的client端是NIO的話,就可以收到一個socket close的事件以感知到連接被關閉!

注意Java默認的Backlog是50

這個TCP Backlog的隊列大小值是min(tcp_max_syn_backlog,somaxconn,應用層設置的backlog),而Java如果不做額外設置,Backlog默認值僅僅只有50。C語言在使用listen調用的時候需要傳進Backlog參數。

tcp_tw_recycle

tcp_tw_recycle這個參數一般是用來抑制TIME_WAIT數量的,但是它有一個副作用。即在tcp_timestamps開啟(Linux默認開啟),tcp_tw_recycle會經常導致下面這種現象。

也即,如果你的Server開啟了tcp_tw_recycle,那么別人如果通過NAT之類的調用你的Server的話,NAT后面的機器只有一臺機器能正常工作,其它情況大概率失敗。具體原因呢由下圖所示:

在tcp_tw_recycle=1同時tcp_timestamps(默認開啟的情況下),對同一個IP的連接會做這樣的限制,也即之前后建立的連接的時間戳必須要大于之前建立連接的最后時間戳,但是經過NAT的一個IP后面是不同的機器,時間戳相差極大,就會導致內核直接丟棄時間戳較低的連接的現象。由于這個參數導致的問題,高版本內核已經去掉了這個參數。如果考慮TIME_WAIT問題,可以考慮設置一下

echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

tcp_syn_retries

這個參數值得是client發送SYN如果server端不回復的話,重傳SYN的次數。對我們的直接影響呢就是connet建立連接時的超時時間。當然Java通過一些C原生系統調用的組合使得我們可以進行超時時間的設置。在Linux里面默認設置是5,下面給出建議值3和默認值5之間的超時時間。


tcp_syn_retries

timeout

1

min(so_sndtimeo,3s)

2

min(so_sndtimeo,7s)

3

min(so_sndtimeo,15s)

4

min(so_sndtimeo,31s)

5

min(so_sndtimeo,63s)

下圖給出了,重傳和超時情況的對應圖:

當然了,不同內核版本的超時時間可能不一樣,因為初始RTO在內核小版本間都會有細微的變化。所以,有時候在抓包時候可能會出現(3,6,12……)這樣的序列。當然Java的API有超時時間:

java:
// 函數調用中攜帶有超時時間
public void connect(SocketAddress endpoint, int timeout) ;

所以,對于Java而言,這個內核參數的設置沒有那么重要。但是,有些代碼可能會有忘了設置timeout的情況,例如某個版本的Kafka就是,所以它在我們一些混沌測試的情況下,容災恢復的時間會達到一分多鐘,主要時間就是卡在connect上面-_-!,而這時我們的tcp_syn_retries設置的是5,也即超時時間63s。減少這個恢復時間的手段就是:

echo 3 > /proc/sys/net/ipv4/tcp_syn_retries

tcp_retries2

這個參數表面意思是在傳輸過程中tcp的重傳次數。但在某個版本之后Linux內核僅僅用這個tcp_retries2來計算超時時間,在這段時間的重傳次數純粹由RTO等環境因素決定,重傳超時時間在5/15下的表現為:

tcp_retries2

對端無響應

5

25.6s-51.2s根據動態rto定

15

924.6s-1044.6s根據動態rto定

如果我們在應用層設置的Socket所有ReadTimeout都很小的話(例如3s),這個內核參數調整是沒有必要的。但是,筆者經常發現有的系統,因為一兩個慢的接口或者SQL,所以將ReadTimeout設的很大的情況。

平常這種情況是沒有問題的,因為慢請求頻率很低,不會對系統造成什么風險。但是,物理機突然宕機時候的情況就不一樣了,由于ReadTimeOut設置的過大,導致所有落到這臺宕機的機器都會在min(ReadTimeOut,(924.6s-1044.6s)(Linux默認tcp_retries2是15))后才能從read系統調用返回。假設ReadTimeout設置了個5min,系統總線程數是200,那么只要5min內有200個請求落到宕機的server就會使A系統失去響應!

但如果將tcp_retries2設置為5,那么超時返回時間即為min(ReadTimeOut 5min,25.6-51.2s),也就是30s左右,極大的緩解了這一情況。

echo 5 > /proc/sys/net/ipv4/tcp_retries2

但是針對這種現象,最好要做資源上的隔離,例如線程上的隔離或者機器級的隔離。

golang的goroutine調度模型就可以很好的解決線程資源不夠的問題,但缺點是goroutine里面不能有阻塞的系統調用,不然也會和上面一樣,但僅僅對于系統之間互相調用而言,都是非阻塞IO,所以golang做微服務還是非常Nice的。當然了我大Java用純IO事件觸發編寫代碼也不會有問題,就是對心智負擔太高-_-!

物理機突然宕機和進程宕不一樣

值得注意的是,物理機宕機和進程宕但內核還存在表現完全不一樣。

僅僅進程宕而內核存活,那么內核會立馬發送reset給對端,從而不會卡住A系統的線程資源。

tcp_slow_start_after_idle

還有一個可能需要調整的參數是tcp_slow_start_after_idle,Linux默認是1,即開啟狀態。開啟這個參數后,我們的TCP擁塞窗口會在一個RTO時間空閑之后重置為初始擁塞窗口(CWND)大小,這無疑大幅的減少了長連接的優勢。對應Linux源碼為:

static void tcp_event_data_sent(struct tcp_sock *tp,
struct sk_buff *skb, struct sock *sk){
// 如果開啟了start_after_idle,而且這次發送的時間-上次發送的時間>一個rto,就重置tcp擁塞窗口
if (sysctl_tcp_slow_start_after_idle &&
(!tp->packets_out && (s32)(now - tp->lsndtime) > icsk->icsk_rto))
tcp_cwnd_restart(sk, __sk_dst_get(sk));
}

關閉這個參數后,無疑會提高某些請求的傳輸速度(在帶寬夠的情況下)。

echo 0 > /proc/sys/net/ipv4/tcp_slow_start_after_idle

當然了,Linux啟用這個參數也是有理由的,如果我們的網絡情況是時刻在變化的,例如拿個手機到處移動,那么將擁塞窗口重置確實是個不錯的選項。但是就我們內網系統間調用而言,是不太必要的了。

初始CWND大小

毫無疑問,新建連接之后的初始TCP擁塞窗口大小也直接影響到我們的請求速率。在Linux2.6.32源碼中,其初始擁塞窗口是(2-4個)mss大小,對應于內網估計也就是(2.8-5.6K)(MTU 1500),這個大小對于某些大請求可能有點捉襟見肘。

在Linux 2.6.39以上或者某些RedHat維護的小版本中已經把CWND

增大到RFC 6928所規定的的10段,也就是在內網里面估計14K左右(MTU 1500)。

Linux 新版本/* TCP initial congestion window */#define TCP_INIT_CWND 10

總結

Linux提供了一大堆內參參數供我們進行調優,其默認設置的參數在很多情況下并不是最佳實踐,所以我們需要潛心研究,找到最適合當前環境的組合。


責任編輯:武曉燕 來源: 解Bug之路
相關推薦

2025-05-27 08:20:00

Linux內核參數調優系統

2009-08-07 10:28:03

2011-03-31 13:40:34

2013-03-20 17:30:18

2010-09-25 15:52:27

JVM內存JVM

2011-03-18 11:21:48

2023-11-10 11:23:20

JVM內存

2025-01-17 09:23:31

2019-09-18 08:53:55

2020-01-06 11:22:06

TCPLinux內核

2010-03-04 10:56:52

JVM參數

2010-09-25 13:05:07

JVM參數

2021-03-26 06:05:17

Tomcat

2013-11-20 10:48:47

Linux內核GRUB內核參數

2021-01-22 11:18:58

Python機器學習超參數

2011-03-10 14:40:54

LAMPMysql

2012-01-10 14:35:08

JavaJVM

2024-07-16 16:13:14

2010-09-17 17:02:24

JVM參數

2025-06-09 02:10:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 作爱视频免费观看 | 亚洲va欧美va天堂v国产综合 | 国产日韩久久 | 久久大香 | 日韩欧美一区二区三区四区 | 91麻豆精品国产91久久久资源速度 | 欧美精品在线一区 | www.婷婷| 精品1区 | 久久亚洲一区二区 | 亚洲国产午夜 | 亚洲精品久久久蜜桃网站 | 日本韩国欧美在线观看 | 国产99久久 | 欧美日本在线观看 | 中国一级大毛片 | 国产精品久久久久久久久久 | 亚洲区一 | www.久久.com | 国产精品亚洲综合 | 成人在线免费视频 | 精品一区二区免费视频 | 欧美激情精品久久久久久 | 亚洲美女av网站 | 99久久国产 | 一级黄色夫妻生活 | 国产一区欧美 | 久久久久电影 | 99综合在线 | 久久精品天堂 | 国产精品久久影院 | 国产精品乱码一区二区三区 | 麻豆久久久9性大片 | 亚洲在线一区 | 四虎精品在线 | 久草视频网站 | 日本高清视频在线播放 | 在线黄色网 | 81精品国产乱码久久久久久 | 精品国产乱码久久久 | 久色视频在线观看 |