溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行Linux內(nèi)核參數(shù)優(yōu)化

發(fā)布時間:2021-10-14 15:47:13 來源:億速云 閱讀:141 作者:柒染 欄目:編程語言

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何進行Linux內(nèi)核參數(shù)優(yōu)化,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Linux內(nèi)核參數(shù)優(yōu)化

我的內(nèi)核心參數(shù)調(diào)整原則是,哪個遇到瓶頸調(diào)哪個,謹慎使用,不能憑想象亂調(diào)一氣。看下面例子,其中default是我們公司定做的系統(tǒng)默認的一些參數(shù)值。add
by yangjian2并非全部都要調(diào)整,我只挑幾個比較重要的參數(shù)說明一下,更多TCP方面的調(diào)優(yōu)請參見 man 7 tcp 。
#++++++++++++++++++default++++++++++++++++++++++++++++++
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 180000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
#++++++++++++++++++add by yangjian2++++++++++++++++++++++
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++

maxfd: 對于系統(tǒng)所能打開的最大文件描述符fd,可以通過以root啟動程序,setrlimit()設(shè)置maxfd后,再通過setuid()轉(zhuǎn)為普通用戶提供服務(wù),我用的 int set_max_fds(int maxfds); 函數(shù)是zhongying提供的。這比用ulimit來的方便的多,不曉得為什么那么多開源軟件都沒這樣用。

net.ipv4.tcp_max_syn_backlog = 65536 : 這個參數(shù)可以肯定是必須要修改的,默認值1024,我google了一下,幾乎是人云亦云,沒有說的明白的。 要講明白得從man listen說起,int listen(int sockfd, int backlog);  早期的網(wǎng)絡(luò)編程都中描述,int backlog 代表未完成隊列SYN_RECV狀態(tài)+已完成隊列ESTABLISHED的和。但是這個意義在Linux 2.2以后的實現(xiàn)中已經(jīng)被改變了,int
backlog只代表已完成隊列ESTABLISHED的長度,在AF_INET協(xié)議族中(我們廣泛使用的就是這個),當int backlog大于SOMAXCONN  (128 in Linux 2.0
& 2.2)的時候,會被調(diào)整為常量SOMAXCONN大小。這個常量可以通過net.core.somaxconn來修改。而未完成隊列大小可以通過net.ipv4.tcp_max_syn_backlog來調(diào)整,一般遭受syn flood攻擊的網(wǎng)站,都存在大量SYN_RECV狀態(tài),所以調(diào)大tcp_max_syn_backlog值能增加抵抗syn攻擊的能力。

net.ipv4.tcp_syncookies = 1 : 當出現(xiàn)syn等候隊列出現(xiàn)溢出時象對方發(fā)送syncookies。目的是為了防止syn flood攻擊 , 默認值是 0。 不過man listen說當啟用syncookies時候,tcp_max_syn_backlog的sysctl調(diào)整將失效,和這個描述不是很符合。參見下面兩個描述分別是man listen和man 7 tcp:
When syncookies are enabled there is no logical maximum length and this tcp_max_syn_backlog sysctl  setting  is  ignored.
Send out  syncookies  when the syn backlog queue of a socket overflows.
但我可以肯定的說這個選項對你的性能不會有提高,而且它嚴重的違背TCP協(xié)議,不允許使用TCP擴展,除非遭受攻擊,否則不推薦使用。

net.ipv4.tcp_synack_retries = 2 : 對于遠端的連接請求SYN,內(nèi)核會發(fā)送SYN + ACK數(shù)據(jù)報,以確認收到上一個 SYN連接請求包。這是所謂的三次握手( threeway handshake)機制的第二個步驟。這里決定內(nèi)核在放棄連接之前所送出的 SYN+ACK 數(shù)目。如果你的網(wǎng)站SYN_RECV狀態(tài)確實挺多,為了避免syn攻擊,那么可以調(diào)節(jié)重發(fā)的次數(shù)。

net.ipv4.tcp_syn_retries = 2 : 對于一個新建連接,內(nèi)核要發(fā)送多少個 SYN 連接請求才決定放棄。不應(yīng)該大于255,默認值是5,對應(yīng)于180秒左右。這個對防止syn攻擊其實是沒有用處的,也沒必要調(diào)節(jié)。

net.ipv4.tcp_max_orphans = 3276800 : 這個最好不要修改,因為每增加1,將消耗~64k內(nèi)存。即使報錯 TCP: too many of orphaned sockets 也有可能是由于你的net.ipv4.tcp_mem過小,導致的Out of socket memory,繼而引發(fā)的。

net.ipv4.tcp_wmem = 4096 16384 4194304 :  為自動調(diào)優(yōu)定義每個socket使用的內(nèi)存。第一個值是為socket的發(fā)送緩沖區(qū)分配的最少字節(jié)數(shù)。第二個值是默認值(該值會被 wmem_default覆蓋),緩沖區(qū)在系統(tǒng)負載不重的情況下可以增長到這個值。第三個值是發(fā)送緩沖區(qū)空間的最大字節(jié)數(shù)(該值會被wmem_max覆蓋)。

net.ipv4.tcp_rmem = 4096 87380 4194304 : 接收緩沖區(qū),原理同上。

net.ipv4.tcp_mem = 94500000 915000000 927000000 :
low:當TCP使用了低于該值的內(nèi)存頁面數(shù)時,TCP不會考慮釋放內(nèi)存。
pressure:當TCP使用了超過該值的內(nèi)存頁面數(shù)量時,TCP試圖穩(wěn)定其內(nèi)存使用,進入pressure模式,當內(nèi)存消耗低于low值時則退出pressure狀態(tài)。
high:允許所有tcp sockets用于排隊緩沖數(shù)據(jù)報的內(nèi)存頁數(shù)。

一般情況下這個值是在系統(tǒng)啟動時根據(jù)系統(tǒng)內(nèi)存數(shù)量計算得到的,如果你的dmesg報 Out of socket memory,你可以試著修改這個參數(shù),順便介紹3個修改方法:
1, echo “94500000 915000000 927000000″ > /proc/sys/net/ipv4/tcp_wmem
2, sysctl -w "net.ipv4.tcp_mem = 94500000 915000000 927000000"
3, net.ipv4.tcp_mem = 94500000 915000000 927000000 (vi /etc/sysctl.conf 然后 sysctl -p生效)

下面命令也許能提供些信息,在你修改tcp參數(shù)時做個參考:
[sports@xk-6-244-a8 nbahttpd_beta4.0]$ cat  /proc/net/sockstat
sockets: used 1195
TCP: inuse 1177 orphan 30 tw 199 alloc 1181 mem 216
UDP: inuse 0 mem 0
RAW: inuse 0
FRAG: inuse 0 memory 0

其他我就不多說了,知道這些基本就能解決絕大部分問題了。

上述就是小編為大家分享的如何進行Linux內(nèi)核參數(shù)優(yōu)化了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI