java linux 調用32位so_Linux上TCP的幾個內核參數調優

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

調優清單

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

序號內核參數值備注1.1/proc/sys/net/ipv4/tcp_max_syn_backlog20481.2/proc/sys/net/core/somaxconn20481.3/proc/sys/net/ipv4/tcp_abort_on_overflow12.1/proc/sys/net/ipv4/tcp_tw_recycle0NAT環境必須為02.2/proc/sys/net/ipv4/tcp_tw_reuse13.1/proc/sys/net/ipv4/tcp_syn_retries33.2/proc/sys/net/ipv4/tcp_retries253.3/proc/sys/net/ipv4/tcp_slow_start_after_idle0

tcp_max_syn_backlog,somaxconn,tcp_abort_on_overflow

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

1bcd144badb6077a7058b05772c4c03d.png

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

ce3b20ba2c77cb82f0e5d9cddf87299a.png

就如圖中所示,第二次握手的SYNACK發送給client端了。所以就會出現client端認為連接成功,而Server端確已經丟棄了這個連接的現象!由于無法感知到Server已經丟棄了連接。 所以如果沒有心跳的話,只有在發出第一個請求后,Server才會發送一個reset端通知這個連接已經被丟棄了,建立連接后第二天再用,也會報錯!所以我們要調大Backlog隊列!

echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlogecho 2048 > /proc/sys/net/core/somaxconn

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

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

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

f90d7a64ce7bc717ca8f6ef25cc41892.png

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

06f6e4d83b561f4c7a739b1f07a6f3c2.png

注意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會經常導致下面這種現象。

c3d8920169b4e1848b04c192705f564e.png

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

e2c5574c47571d567e566d0ffd16c757.png

在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_retriestimeout1min(so_sndtimeo,3s)2min(so_sndtimeo,7s)3min(so_sndtimeo,15s)4min(so_sndtimeo,31s)5min(so_sndtimeo,63s)

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

1beb0ff91fb6003b4337c3ddd45bf048.png

當然了,不同內核版本的超時時間可能不一樣,因為初始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_retries2這個參數表面意思是在傳輸過程中tcp的重傳次數。但在某個版本之后Linux內核僅僅用這個tcp_retries2來計算超時時間,在這段時間的重傳次數純粹由RTO等環境因素決定,重傳超時時間在5/15下的表現為:

tcp_retries2對端無響應525.6s-51.2s根據動態rto定15924.6s-1044.6s根據動態rto定

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

a8d7315e1f97583761fbab3188bd0399.png

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

a6da2da305dcffeb6ef450eeeccc65d5.png

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

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

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

7e5e3ec6a685f946c5ce288af1db48f2.png

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

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

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

8562a8192ef05143b386cd45e40550f1.png

僅僅進程宕而內核存活,那么內核會立馬發送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));}
a6343940430917d60ba1b326fca1c606.png

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

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_CWND10

原文:https://my.oschina.net/alchemystar/blog/4312312

作者:無毀的湖光-Al

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455679.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jquery中的選擇器

jquery選擇器 jquery用法思想 選擇某個網頁元素,然后對它進行某種操作 jquery選擇器 jquery選擇器可以快速地選擇元素,選擇規則和css樣式相同 基礎選擇器 //通過id來獲取元素 document.getElementById(); // $(#logo).css(border,solid 2px red); //…

【好文收藏】【持續更新】今天你機器學習了嗎

?數學建模常用模型23:馬爾可夫預測方法_HaLosec_Wei-CSDN博客_馬爾可夫模型預測法 ?simhash算法及原理簡介_lengye7的博客-CSDN博客_simhash ?👍使用機器學習構建簡單金融風控反欺詐模型(一)EDAXGBOOST - 知乎 Python機器學…

H.264碼率控制機制

H.264標準碼率控制算法步驟如下:1.計算當前幀的目標碼字,并將其限定到HRD的邊界中。2.通過線性模型(式4.5)預測當前幀中基本單元的MAD。 3.為未編碼基本單元分配碼字。4.通過二次R&a…

[dp]最長單調遞增子序列LIS

https://www.51nod.com/tutorial/course.html#!courseId12 解題關鍵: 如果將子序列按照長度由短到長排列,將他們的最大元素放在一起,形成新序列$B\left\{ {{b_1},{b_2}, \ldots \ldots ,{b_j}} \right\}$,則序列$B$滿足${b_1} &l…

jQuery中的元素操作

jQuery元素操作 通過jQuery可以操作控制元素的樣式,文本,屬性等 jquery樣式操作 css操作行內樣式 // 獲取div的樣式 $("div").css("width"); $("div").css("color");//設置div的樣式 $("div").css("width",&q…

指針結構體函數-事實上能夠這樣具體理解

今天一大早登了下QQ空間,看到本科的一個學弟發表一篇日志。寫關于西電微軟俱樂部面試題的解答,寫的非常不 錯。我也一下子起興了,由于我以前也是被指針困惑非常久。搞不清頭緒,本科到研究生。我也筆試面試不下二十次 了。每次面試…

【python畢業設計】Django框架實現學生信息管理系統

Django框架實現學生信息管理系統 演示視頻:Django學生信息管理系統_騰訊視頻 演示界面內容如下 總體概括 注冊流程 首先進行輸入用戶名(郵箱)、密碼以及驗證碼,輸入完之后點擊注冊按鈕。如果輸入的不正確,提示錯誤信…

python中continue只結束本次循環_循環(while,break,continue),轉義字符

Apple iPhone 11 (A2223) 128GB 黑色 移動聯通電信4G手機 雙卡雙待 4999元包郵 去購買 >01. 程序的三大流程 在程序開發中,一共有三種流程方式: 順序 —— 從上向下,順序執行代碼 分支 —— 根據條件判斷,決定執行代碼的 分支 …

碼率控制技術原理

引起編碼器的輸出比特碼率波動的原因主要有兩個。首先,數字視頻信號中包含了大量的時域和空域冗余,編碼器的主要任務就是去除這些冗余。由于時間冗余和空間冗余是隨機的,從而造成編碼器輸出比特率波動。另一個原因是變長編碼,變長…

python如何安裝pip

pip的安裝操作 pip簡介 pip 是一個現代的,通用的 Python 包管理工具。提供了對Python 包的查找、下載、安裝、卸載的功能。 環境搭建 安裝pip首先要安裝python,可以參考python安裝教程 安裝完python后,可以在cmd中輸入pip list 測試一下pip是否默認附帶著安裝,若…

【排序算法】python 十大經典排序算法(全網最詳)

排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序…

最新海康攝像機、NVR、流媒體服務器、回放取流RTSP地址規則說明

本文檔主要介紹海康威視設備預覽、回放、流媒體取流的RTSP URL和IE直接預覽、回放的HTTP URL。RTSP為取流協議,取到碼流后需要解碼顯示,可以通過VLC播放器進行測試,IE等瀏覽器網頁不支持RTSP協議直接取流預覽或者回放。網頁上需要跳過登錄界面…

pug模板引擎(原jade)

前面的話 為什么要引入pug,pug有什么特別之處呢?有一些嵌套層次較深的頁面,可能會出現巢狀嵌套,如下圖所示 在后期維護和修改時,一不小心少了一個尖括號,或者某個標簽的開始和閉合沒有對應上,就…

python安裝環境傻瓜式安裝_前后端分離——前端開發環境傻瓜式一步到位 nodejs ruby python nginx 安裝搭建配置...

前端開發環境一步到位 一、準備工作 nodejs安裝 安裝:next->next.... Ruby安裝 安裝:next->next.... 需要配置到path:將安裝目錄復制到環境變量中,跟jdk環境變量配置一樣。 注意下一步:Python安裝 安裝&#xff…

【Python】Python學到什么程度可以面試工作?------持續更新 ...

前言: 從事python學習,有爬蟲、web后臺、深度學習相關經驗, 坐標北京歡迎騷擾。 本答案力求簡潔和直擊重點,代碼部分使用Python3,更詳細的解釋請Google,回答有誤請務必提醒答主,我將及時改正。…

H.264的碼率控制算法

H.264的碼率控制算法采用了多種技術,其中包括自適應基本單元層(Adaptive Basic Unit Layer)、流量往返模型(Fluid Traffic Model)、線性MAD模型、二次率失真模型等。并且采用了分層碼率控制策略,共分為三層:GOP層、幀層和基本單元…

消息中間件Client模塊劃分

上圖是之間討論確定的系統架構(后續內容會按照這個架構來敘述),其中: 客戶端包含Producer和Consumer兩大塊 客戶端需要和NameServer交互來獲取元數據 客戶端需要和Broker交互來讀寫消息 Client模塊劃分 1. 網絡模塊 第一個仍然是…

詳解HashMap數據結構實現

HashMap的設計是由數組加鏈表的符合數據結構,在這里用自己的語言以及結合源碼去總結一下,如果有不對的地方希望評論指正,先拱手謝謝。 HashMap是日常中非常常用的一種數據結構,我們要想深入了解學習任何一門技術,都是要…

java web開發學習手冊_Java 人必備學習手冊開發下載!

今天給大家分享一套 5000 頁的 Java 學習手冊,新鮮出爐!此手冊內容專注 Java技術,包括 JavaWeb,SSM,Linux,Spring Boot,MyBatis,MySQL,Nginx,Git,…

Django初次體驗

Django初次體驗 關于django的安裝,寶寶們可以參考django簡介以及安裝 Django框架的搭建 在終端中進入需要建立項目的目錄 執行: django-admin startproject mysite其中,mysite是項目目錄名,可以自定義 我們來看看startprojec…