1. 程式人生 > >linux下修改核心引數進行Tcp效能調優 -- 高併發

linux下修改核心引數進行Tcp效能調優 -- 高併發

前言:
Tcp/ip協議對網路程式設計的重要性,進行過網路開發的人員都知道,我們所編寫的網路程式除了硬體,結構等限制,通過修改Tcp/ip核心引數也能得到很大的效能提升,
下面就列舉一些Tcp/ip核心引數,解釋它們的含義並通過修改來它們來優化我們的網路程式,主要是針對高併發情況。
這裡網路程式主要指的是伺服器端

1. fs.file-max

最大可以開啟的檔案描述符數量,注意是整個系統。
在伺服器中,我們知道每建立一個連線,系統就會開啟一個檔案描述符,所以,檔案描述符開啟的最大數量也決定了我們的最大連線數
select在高併發情況下被取代的原因也是檔案描述符開啟的最大值,雖然它可以修改但一般不建議這麼做,詳情可見unp select部分。

2.net.ipv4.tcp_max_syn_backlog

Tcp syn佇列的最大長度,在進行系統呼叫connect時會發生Tcp的三次握手,server核心會為Tcp維護兩個佇列,Syn佇列和Accept佇列,Syn佇列是指存放完成第一次握手的連線,Accept佇列是存放完成整個Tcp三次握手的連線,修改net.ipv4.tcp_max_syn_backlog使之增大可以接受更多的網路連線。
注意此引數過大可能遭遇到Syn flood攻擊,即對方傳送多個Syn報文端填充滿Syn佇列,使server無法繼續接受其他連線
可參考此文http://tech.uc.cn/?p=1790

我們看下 man 手冊上是如何說的:

  The  behavior  of  the  backlog argument on TCP sockets changed with Linux 2.2.  Now it specifies the queue length for com‐
   pletely established sockets waiting to be accepted, instead of the number of incomplete connection requests.   The  maximum
   length  of  the  queue for incomplete sockets can be set using /proc/sys/net/ipv4/tcp_max_syn_backlog.  When syncookies are
   enabled there is no logical maximum length and this setting is ignored.  See tcp(7) for more information.

  If the backlog argument is greater than the value in /proc/sys/net/core/somaxconn, then it is silently  truncated  to  that
   value; the default value in this file is 128.  In kernels before 2.4.25, this limit was a hard coded value, SOMAXCONN, with
   the value 128.

自 Linux 核心 2.2 版本以後,backlog 為已完成連線佇列的最大值,未完成連線佇列大小以 /proc/sys/net/ipv4/tcp_max_syn_backlog 確定,但是已連線佇列大小受 SOMAXCONN 限制,為 min(backlog, SOMAXCONN)

3.net.ipv4.tcp_syncookies

修改此引數可以有效的防範上面所說的syn flood攻擊
原理:在Tcp伺服器收到Tcp Syn包並返回Tcp Syn+ack包時,不專門分配一個數據區,而是根據這個Syn包計算出一個cookie值。在收到Tcp ack包時,Tcp伺服器在根據那個cookie值檢查這個Tcp ack包的合法性。如果合法,再分配專門的資料區進行處理未來的TCP連線。
預設為0,1表示開啟

4.net.ipv4.tcp_keepalive_time

Tcp keepalive心跳包機制,用於檢測連線是否已斷開,我們可以修改預設時間來間斷心跳包傳送的頻率。
keepalive一般是伺服器對客戶端進行傳送檢視客戶端是否線上,因為伺服器為客戶端分配一定的資源,但是Tcp 的keepalive機制很有爭議,因為它們可耗費一定的頻寬。
Tcp keepalive詳情見Tcp/ip詳解卷1 第23章

5.net.ipv4.tcp_tw_reuse

我的上一篇文章中寫到了time_wait狀態,大量處於time_wait狀態是很浪費資源的,它們佔用server的描述符等。
修改此引數,允許重用處於time_wait的socket。
預設為0,1表示開啟

6.net.ipv4.tcp_tw_recycle

也是針對time_wait狀態的,該引數表示快速回收處於time_wait的socket。
預設為0,1表示開啟

7.net.ipv4.tcp_fin_timeout

修改time_wait狀的存在時間,預設的2MSL
注意:time_wait存在且生存時間為2MSL是有原因的,見我上一篇部落格為什麼會有time_wait狀態的存在,所以修改它有一定的風險,還是根據具體的情況來分析。

8.net.ipv4.tcp_max_tw_buckets

所允許存在time_wait狀態的最大數值,超過則立刻被清楚並且警告。

9.net.ipv4.ip_local_port_range

表示對外連線的埠範圍。

10.somaxconn

前面說了Syn佇列的最大長度限制,somaxconn引數決定Accept佇列長度,在listen函式呼叫時backlog引數即決定Accept佇列的長度,該引數太小也會限制最大併發連線數,因為同一時間完成3次握手的連線數量太小,server處理連線速度也就越慢。伺服器端呼叫accept函式實際上就是從已連線Accept佇列中取走完成三次握手的連線。
Accept佇列和Syn佇列是listen函式完成建立維護的。
/proc/sys/net/core/somaxconn修改

上面每一個引數其實都夠寫一篇文章來分析了,這裡我只是概述下部分引數,注意在修改Tcp引數時我們一定要根據自己的實際需求以及測試結果來決定。

相關推薦

linux修改核心引數進行Tcp效能調 -- 併發

前言: Tcp/ip協議對網路程式設計的重要性,進行過網路開發的人員都知道,我們所編寫的網路程式除了硬體,結構等限制,通過修改Tcp/ip核心引數也能得到很大的效能提升, 下面就列舉一

Linux Oracle 核心引數優化

    資料庫的效能優化涉及到整個資料庫執行環境的方方面面,諸如作業系統,Oracle自身,儲存,網路等等幾個大塊。而作業系統則是Oracle穩定執行與最大化效能的基石。本文主要描述基於Linux系統下 Oracle 核心引數的配置。    校驗下面的列表中顯示的核心引數的值

Yarn 記憶體分配管理機制及相關引數配置(yarn效能調)

一、相關配置情況關於Yarn記憶體分配與管理,主要涉及到了ResourceManage、ApplicationMatser、NodeManager這幾個概念,相關的優化也要緊緊圍繞著這幾方面來開展。這裡還有一個Container的概念,現在可以先把它理解為執行map/redu

使用Jprofiler+jmeter進行JVM效能調

一、JProfiler簡介   JProfiler 是一個商業授權的Java剖析工具,由EJ技術有限公司,針對的Java EE和Java SE應用程式開發的。它把CPU、執行緒和記憶體的剖析組合在一個強大的應用中。JProfiler可提供許多IDE整合和應用伺服器整合

Tcp效能調 解決Tcp長延時

背景: 根據Tcp的理論計算,Tcp最佳狀態下傳輸是流水並行的,傳輸時間等於傳輸資料耗時+TTL,即千兆網絡卡的環境下 傳輸1MB資料需要:  1000ms/100MB*1MB+TTL=10ms+TTL,同機房傳輸1MB耗時10毫秒,跨機房理論耗時14毫秒 傳輸4

mysql學習筆記之--引數設定(效能調

MySQL效能調優之引數設定 命令 1.show processlist;  //檢視mysql的連線資訊 2.sel

Linux修改核心引數

Linux /proc/sys/kernel 和/proc/sys/vm下的檔案控制核心的執行,可以通過修改引數的方式來改變核心功能(立即生效) 修改引數方法: 方法一: echo value > /proc/sys/path [[email prot

Linux用火焰圖進行效能分析

1 火焰圖簡介 很多人感冒發燒的時候, 往往會模仿神農氏嘗百草的路子: 先嚐嘗抗病毒的藥, 再試試抗細菌的藥, 甭管家裡有什麼藥挨個試, 什麼中藥西藥, 瞎貓總會碰上死耗子, 如此做法自然是不可取的, 正確的做法應該是去醫院驗個血, 確診後再對症下藥. 讓我們回

linux檢視核心版本、gcc版本、作業系統多少位等引數

1. 檢視linux版本 cat/etc/issueLinaro 12.07 \n \l 2. 檢視核心版本 1)cat/proc/versionLinux version 2.6.38-13-generic([email protected]) (gcc version 4.5.2 (Ubunt

Linux利用Valgrind工具進行記憶體洩露檢測和效能分析

Valgrind通常用來成分析程式效能及程式中的記憶體洩露錯誤 一 Valgrind工具集簡紹 Valgrind包含下列工具:     1、memcheck:檢查程式中的記憶體問題,如洩漏、越界、非法指標等。     2、callgrind:檢測程式程式碼的執行

LinuxTomcat VM引數修改

不可行的方法 最初我直接修改catalina.sh, 將JAVA_OPTS變數加上了 -server -Xms1G -Xmx1G -XX:+UserG1GC 最初看起來沒啥問題,但是當伺服器執行幾天後,發現執行shutdown.sh無法關閉tomcat

Linux通過find命令進行rm文件刪除的小技巧

ase test sysconfig ger sdn tun 執行過程 fun alt 我們常常會通過find命令進行批量操作。如:批量刪除舊文件、批量改動、基於時間的文件統計、基於文件大小的文件統計等。在這些操作其中,因為rm刪除操作會導致文件夾結構變化,

linux修改文件後戳

linux 後戳 文件1、使用rename修改文件後戳修改前:[[email protected]/* */ ]# ll total 2548 -rw-r--r--. 1 root root 1282047 Jun 20 10:15 stu1.doc -rw-r--r--. 1 root ro

linux修改rm命令防止誤刪除

寫上 linu rm -rf 目錄權限 執行權限 一個 remove 但是 bsp 前言:相信很多朋友都遇到過在linux下用rm命令誤刪除文件的時候,此刻的心中仿佛有無數的羊駝在奔騰。那麽怎麽防止這種情況發生呢?當然是有方法的,我們可以寫一個shell腳本,改變一下rm命

Linux修改.bash_profile 文件改變PATH變量的值

oot 兩個 超級用戶 pat 設置 inux 需要 其中 lin Linux中含有兩個重要的文件 /etc/profile和$HOME/.bash_profile 每當系統登陸時都要讀取這兩個文件,用來初始化系統所用到的變量,其中/etc/profile是超級用戶所用,$

解決Linux server和client 通過TCP通訊:accept成功接收卻報錯的問題

ipv4 socket error 實例代碼 ... lis col argc 例子   今天在寫簡單的TCP通訊例子的時候,遇到了一個問題:server 和client能夠連接成功,並且client也能夠正常發送,但server就是接收不到,在網上搜索一番後,終於解決了問

linux nginx應用場景的tcp內核調

tcp調優vim /etc/profilenet.ipv4.tcp_syncookies=1——防範少量的syn攻擊net.ipv4.tcp_tw_reuse=1——開啟重用net.ipv4.tcp_tw_recycle=1——開啟tcp time_wait套接字的快速回收net.ipv4.ip_local_

Linux修改/設置環境變量JAVA_HOME

linux下修改/設置環境變量java_hom1. 永久修改,對所有用戶有效 # vi /etc/profile //按鍵盤[Shift + g], 在profile文件最後添加下面的內容:JAVA_HOME=/usr/local/java/jdk1.7.0_25 JRE_HOME=$JAVA_H

Linux修改Tomcat默認端口

目錄 var shutdown 修改端口 sta server star 保存 檢索 假設tomcat所在目錄為/usr/local/apache-tomcat/ 1、打開tomcat配置文件#vi /usr/local/apache-tomcat/conf/server.

修改密碼】Linux修改Mysql的用戶(root)的密碼

exit 用戶 mysql use 操作 -- 原來 都沒有 註意 修改的用戶都以root為列。一、擁有原來的myql的root的密碼;方法一:在mysql系統外,使用mysqladmin# mysqladmin -u root -p password "test123"E