目錄
1、linux核心參數注釋
2、兩種修改核心參數方法
3、核心優化參數生産配置
參數解釋由網絡上收集整理,常用優化參數對比了網上多個實際應用進行表格化整理,使檢視更直覺。
學習linux也有不少時間了,每次優化linux核心參數時,都是在網上拷貝而使用,甚至别人沒有列出來的參數就不管了,難道我就不需要了嗎?
參考文章:
linux核心TCP相關參數解釋
http://os.chinaunix.net/a2008/0918/985/000000985483.shtml
linux核心參數優化
http://blog.chinaunix.net/uid-29081804-id-3830203.html
linux核心調整和核心參數詳解
http://blog.csdn.net/cnbird2008/article/details/4419354
以下表格中紅色字型為常用優化參數
根據參數檔案所處目錄不同而進行分表整理
下列檔案所在目錄:/proc/sys/net/ipv4/
名稱 | 預設值 | 建議值 | 描述 |
tcp_syn_retries | 5 | 1 | 對于一個建立連接配接,核心要發送多少個 SYN連接配接請求才決定放棄。不應該大于255,預設值是5,對應于180秒左右時間。。(對于大負載而實體通信良好的網絡而言,這個值偏高,可修改為2.這個值僅僅是針對對外的連接配接,對進來的連接配接,是由tcp_retries1決定的) |
tcp_synack_retries | 對于遠端的連接配接請求SYN,核心會發送SYN +ACK資料報,以确認收到上一個 SYN連接配接請求包。這是所謂的三次握手( threeway handshake)機制的第二個步驟。這裡決定核心在放棄連接配接之前所送出的 SYN+ACK 數目。不應該大于255,預設值是5,對應于180秒左右時間。 | ||
tcp_keepalive_time | 7200 | 600 | TCP發送keepalive探測消息的間隔時間(秒),用于确認TCP連接配接是否有效。 防止兩邊建立連接配接但不發送資料的攻擊。 |
tcp_keepalive_probes | 9 | 3 | |
tcp_keepalive_intvl | 75 | 15 | 探測消息未獲得響應時,重發該消息的間隔時間(秒)。預設值為75秒。 (對于普通應用來說,這個值有一些偏大,可以根據需要改小.特别是web類伺服器需要改小該值,15是個比較合适的值) |
tcp_retries1 | 放棄回應一個TCP連接配接請求前﹐需要進行多少次重試。RFC 規定最低的數值是3 | ||
tcp_retries2 | 在丢棄激活(已建立通訊狀況)的TCP連接配接之前﹐需要進行多少次重試。預設值為15,根據RTO的值來決定,相當于13-30分鐘(RFC1122規定,必須大于100秒).(這個值根據目前的網絡設定,可以适當地改小,我的網絡内修改為了5) | ||
tcp_orphan_retries | 7 | 在近端丢棄TCP連接配接之前﹐要進行多少次重試。預設值是7個﹐相當于 50秒 - 16分鐘﹐視 RTO 而定。如果您的系統是負載很大的web伺服器﹐那麼也許需要降低該值﹐這類sockets 可能會耗費大量的資源。另外參的考tcp_max_orphans。(事實上做NAT的時候,降低該值也是好處顯著的,我本人的網絡環境中降低該值為3) | |
tcp_fin_timeout | 60 | 2 | 對于本端斷開的socket連接配接,TCP保持在FIN-WAIT-2狀态的時間。對方可能會斷開連接配接或一直不結束連接配接或不可預料的程序死亡。預設值為 60 秒。 |
tcp_max_tw_buckets | 180000 | 36000 | 系統在同時所處理的最大 timewait sockets數目。如果超過此數的話﹐time-wait socket會被立即砍除并且顯示警告資訊。之是以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS攻擊﹐不過﹐如果網絡條件需要比預設值更多﹐則可以提高它(或許還要增加記憶體)。(事實上做NAT的時候最好可以适當地增加該值) |
tcp_tw_recycle | 打開快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求﹐請不要随意修改這個值。(做NAT的時候,建議打開它) | ||
tcp_tw_reuse | 表示是否允許重新應用處于TIME-WAIT狀态的socket用于新的TCP連接配接(這個對快速重新開機動某些服務,而啟動後提示端口已經被使用的情形非常有幫助) | ||
tcp_max_orphans | 8192 | 32768 | 系統所能處理不屬于任何程序的TCP sockets最大數量。假如超過這個數量﹐那麼不屬于任何程序的連接配接會被立即reset,并同時顯示警告資訊。之是以要設定這個限制﹐純粹為了抵禦那些簡單的 DoS 攻擊﹐千萬不要依賴這個或是人為的降低這個限制。如果記憶體大更應該增加這個值。(這個值Redhat AS版本中設定為32768,但是很多防火牆修改的時候,建議該值修改為2000) |
tcp_abort_on_overflow | 當守護程序太忙而不能接受新的連接配接,就象對方發送reset消息,預設值是false。這意味着當溢出的原因是因為一個偶然的猝發,那麼連接配接将恢複狀态。隻有在你确信守護程序真的不能完成連接配接請求時才打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這類服務的時候,這個可以很快讓用戶端終止連接配接,可以給予服務程式處理已有連接配接的緩沖機會,是以很多防火牆上推薦打開它) | ||
tcp_syncookies | 隻有在核心編譯時選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢出時象對方發送syncookies。目的是為了防止syn flood攻擊。 | ||
tcp_stdurg | 使用 TCP urg pointer 字段中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解釋,是以如果您在 Linux 打開它﹐或會導緻不能和它們正确溝通。 | ||
tcp_max_syn_backlog | 1024 | 16384 | 對于那些依然還未獲得用戶端确認的連接配接請求﹐需要儲存在隊列中最大數目。對于超過128Mb 記憶體的系統﹐預設值是 1024 ﹐低于128Mb 的則為 128。如果伺服器經常出現過載﹐可以嘗試增加這個數字。警告﹗假如您将此值設為大于 1024﹐最好修改include/net/tcp.h裡面的TCP_SYNQ_HSIZE﹐以保持TCP_SYNQ_HSIZE*16(SYN Flood攻擊利用TCP協定散布握手的缺陷,僞造虛假源IP位址發送大量TCP-SYN半打開連接配接到目标系統,最終導緻目标系統Socket隊列資源耗盡而無法接受新的連接配接。為了應付這種攻擊,現代Unix系統中普遍采用多連接配接隊列處理的方式來緩沖(而不是解決)這種攻擊,是用一個基本隊列處理正常的完全連接配接應用(Connect()和Accept() ),是用另一個隊列單獨存放半打開連接配接。這種雙隊列處理方式和其他一些系統核心措施(例如Syn-Cookies/Caches)聯合應用時,能夠比較有效的緩解小規模的SYN Flood攻擊(事實證明) |
tcp_window_scaling | 該檔案表示設定tcp/ip會話的滑動視窗大小是否可變。參數值為布爾值,為1時表示可變,為0時表示不可變。tcp/ip通常使用的視窗最大可達到 65535 位元組,對于高速網絡,該值可能太小,這時候如果啟用了該功能,可以使tcp/ip滑動視窗大小增大數個數量級,進而提高資料傳輸的能力(RFC 1323)。(對普通地百M網絡而言,關閉會降低開銷,是以如果不是高速網絡,可以考慮設定為0) | ||
tcp_timestamps | Timestamps 用在其它一些東西中﹐可以防範那些僞造的 sequence 号碼。一條1G的寬帶線路或許會重遇到帶 out-of-line數值的舊sequence 号碼(假如它是由于上次産生的)。Timestamp 會讓它知道這是個 '舊封包'。(該檔案表示是否啟用以一種比逾時重發更精确的方法(RFC 1323)來啟用對 RTT的計算;為了實作更好的性能應該啟用這個選項。) | ||
tcp_sack | 使用 Selective ACK﹐它可以用來查找特定的遺失的資料報--- 是以有助于快速恢複狀态。該檔案表示是否啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的封包來提高性能(這樣可以讓發送者隻發送丢失的封包段)。(對于廣域網通信來說這個選項應該啟用,但是這會增加對CPU 的占用。) | ||
tcp_fack | 打開FACK擁塞避免和快速重傳功能。(注意,當tcp_sack設定為0的時候,這個值即使設定為1也無效)[這個是TCP連接配接靠譜的核心功能] | ||
tcp_dsack | 允許TCP發送"兩個完全相同"的SACK。 | ||
tcp_ecn | TCP的直接擁塞通告功能。 | ||
tcp_reordering | 6 | TCP流中重排序的資料報最大數量。 (一般有看到推薦把這個數值略微調整大一些,比如5) | |
tcp_retrans_collapse | 對于某些有bug的列印機提供針對其bug的相容性。(一般不需要這個支援,可以關閉它) | ||
tcp_wmem:mindefaultmax | 4096 131072 | 16777216 | 發送緩存設定 min:為TCP socket預留用于發送緩沖的記憶體最小值。每個tcp socket都可以在建議以後都可以使用它。預設值為4096(4K)。 default:為TCP socket預留用于發送緩沖的記憶體數量,預設情況下該值會影響其它協定使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。預設值為16384(16K)。 max: 用于TCP socket發送緩沖的記憶體最大值。該值不會影響net.core.wmem_max,"靜态"選擇參數SO_SNDBUF則不受該值影響。預設值為131072(128K)。(對于伺服器而言,增加這個參數的值對于發送資料很有幫助,在我的網絡環境中,修改為了51200 131072 204800) |
tcp_rmem:mindefaultmax | 87380 174760 | 接收緩存設定 同tcp_wmem | |
tcp_mem:mindefaultmax | 根據記憶體計算 | 786432 1048576 1572864 | low:當TCP使用了低于該值的記憶體頁面數時,TCP不會考慮釋放記憶體。即低于此值沒有記憶體壓力。(理想情況下,這個值應與指定給 tcp_wmem 的第 2 個值相比對 - 這第 2 個值表明,最大頁面大小乘以最大并發請求數除以頁大小 (131072 * 300 / 4096)。 ) pressure:當TCP使用了超過該值的記憶體頁面數量時,TCP試圖穩定其記憶體使用,進入pressure模式,當記憶體消耗低于low值時則退出pressure狀态。(理想情況下這個值應該是 TCP 可以使用的總緩沖區大小的最大值 (204800 * 300 / 4096)。 ) high:允許所有tcp sockets用于排隊緩沖資料報的頁面量。(如果超過這個值,TCP 連接配接将被拒絕,這就是為什麼不要令其過于保守 (512000 * 300 / 4096) 的原因了。 在這種情況下,提供的價值很大,它能處理很多連接配接,是所預期的 2.5 倍;或者使現有連接配接能夠傳輸 2.5 倍的資料。 我的網絡裡為192000 300000 732000) 一般情況下這些值是在系統啟動時根據系統記憶體數量計算得到的。 |
tcp_app_win | 31 | 保留max(window/2^tcp_app_win, mss)數量的視窗由于應用緩沖。當為0時表示不需要緩沖。 | |
tcp_adv_win_scale | 計算緩沖開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale BOOLEAN>0) | ||
tcp_low_latency | 允許 TCP/IP 棧适應在高吞吐量情況下低延時的情況;這個選項一般情形是的禁用。(但在建構Beowulf 叢集的時候,打開它很有幫助) | ||
tcp_westwood | 啟用發送者端的擁塞控制算法,它可以維護對吞吐量的評估,并試圖對帶寬的整體利用情況進行優化;對于 WAN 通信來說應該啟用這個選項。 | ||
tcp_bic | 為快速長距離網絡啟用 Binary Increase Congestion;這樣可以更好地利用以 GB 速度進行操作的連結;對于 WAN 通信應該啟用這個選項。 | ||
ip_forward | - | NAT必須開啟IP轉發支援,把該值寫1 | |
ip_local_port_range:minmax | 61000 | 65000 | 表示用于向外連接配接的端口範圍,預設比較小,這個範圍同樣會間接用于NAT表規模。 |
ip_conntrack_max | 65535 | 系統支援的最大ipv4連接配接數,預設65536(事實上這也是理論最大值),同時這個值和你的記憶體大小有關,如果記憶體128M,這個值最大8192,1G以上記憶體這個值都是預設65536 |
所處目錄/proc/sys/net/ipv4/netfilter/
檔案需要打開防火牆才會存在
65536 | 系統支援的最大ipv4連接配接數,預設65536(事實上這也是理論最大值),同時這個值和你的記憶體大小有關,如果記憶體128M,這個值最大8192,1G以上記憶體這個值都是預設65536,這個值受/proc/sys/net/ipv4/ip_conntrack_max限制 | ||
ip_conntrack_tcp_timeout_established | 432000 | 180 | 已建立的tcp連接配接的逾時時間,預設432000,也就是5天。影響:這個值過大将導緻一些可能已經不用的連接配接常駐于記憶體中,占用大量連結資源,進而可能導緻NAT ip_conntrack: table full的問題。建議:對于NAT負載相對本機的 NAT表大小很緊張的時候,可能需要考慮縮小這個值,以盡早清除連接配接,保證有可用的連接配接資源;如果不緊張,不必修改 |
ip_conntrack_tcp_timeout_time_wait | 120 | time_wait狀态逾時時間,超過該時間就清除該連接配接 | |
ip_conntrack_tcp_timeout_close_wait | close_wait狀态逾時時間,超過該時間就清除該連接配接 | ||
ip_conntrack_tcp_timeout_fin_wait | fin_wait狀态逾時時間,超過該時間就清除該連接配接 |
檔案所處目錄/proc/sys/net/core/
netdev_max_backlog | 每個網絡接口接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數目,對重負載伺服器而言,該值需要調高一點。 | ||
somaxconn | 128 | 用來限制監聽(LISTEN)隊列最大資料包的數量,超過這個數量就會導緻連結逾時或者觸發重傳機制。 web應用中listen函數的backlog預設會給我們核心參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG預設為511,是以有必要調整這個值。對繁忙的伺服器,增加該值有助于網絡性能 | |
wmem_default | 129024 | 預設的發送視窗大小(以位元組為機關) | |
rmem_default | 預設的接收視窗大小(以位元組為機關) | ||
rmem_max | 873200 | 最大的TCP資料接收緩沖 | |
wmem_max | 最大的TCP資料發送緩沖 |
2、兩種修改核心參數方法:
1、使用echo value方式直接追加到檔案裡如echo "1" >/proc/sys/net/ipv4/tcp_syn_retries,但這種方法裝置重新開機後又會恢複為預設值
2、把參數添加到/etc/sysctl.conf中,然後執行sysctl -p使參數生效,永久生效
3、核心生産環境優化參數
這兒所列參數是老男孩老師生産中常用的參數:
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 32768
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_wmem = 8192 131072 16777216
net.ipv4.tcp_rmem = 32768 131072 16777216
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 65536
net.ipv4.netfilter.ip_conntrack_max=65536
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
對比網上其他人的生産環境優化參數,需要優化的參數基本差不多,隻是值有相應的變化。具體優化值要參考應用場景,這兒所列隻是常用優化參數,是否适合,可在上面檢視該參數描述,了解後,再根據自己生産環境而設。
其它相關linux核心參數調整文章:
Linux核心參數優化
http://flandycheng.blog.51cto.com/855176/476769
優化linux的核心參數來提高伺服器并發處理能力