新聞中心
作為一款開源的操作系統(tǒng),Linux由于其高性能、高效穩(wěn)定性以及安全性等優(yōu)勢(shì),已經(jīng)在服務(wù)器領(lǐng)域得到了廣泛的應(yīng)用。作為日常使用最廣泛的服務(wù)器操作系統(tǒng),Linux的網(wǎng)絡(luò)性能對(duì)于許多企業(yè)來(lái)說(shuō)顯得尤為重要。而要想優(yōu)化Linux的網(wǎng)絡(luò)性能,就要對(duì)其網(wǎng)絡(luò)內(nèi)核進(jìn)行深入分析和調(diào)整。

五臺(tái)網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
Linux內(nèi)核網(wǎng)絡(luò)配置
在Linux系統(tǒng)中,內(nèi)核網(wǎng)絡(luò)配置是使用內(nèi)核命令進(jìn)行設(shè)置和調(diào)整的。這些配置文件或命令的含義和功能是非常詳細(xì)和復(fù)雜的,一旦配置不當(dāng),就會(huì)對(duì)整個(gè)網(wǎng)絡(luò)性能產(chǎn)生負(fù)面影響。因此,我們?cè)谂渲肔inux內(nèi)核網(wǎng)絡(luò)時(shí)需要特別注意以下幾點(diǎn):
1. 推薦使用高級(jí)網(wǎng)絡(luò)協(xié)議
Linux支持多種網(wǎng)絡(luò)協(xié)議,但是不同的協(xié)議具有不同的性能特征。比如TCP協(xié)議在網(wǎng)絡(luò)傳輸?shù)目煽啃苑矫姹憩F(xiàn)非常出色,但是在處理高并發(fā)時(shí)的性能卻受到了一定的影響。而對(duì)于高并發(fā)的網(wǎng)絡(luò)應(yīng)用來(lái)說(shuō),選擇對(duì)性能友好的高級(jí)網(wǎng)絡(luò)協(xié)議如UDP則更為合適。
2. 合理調(diào)整內(nèi)核并發(fā)參數(shù)
內(nèi)核并發(fā)參數(shù)對(duì)于網(wǎng)絡(luò)性能影響非常大,可以調(diào)整的并發(fā)參數(shù)包括更大文件描述符、更大進(jìn)程數(shù)、更大線程數(shù)等。這些參數(shù)默認(rèn)配置可能不夠合理,需要根據(jù)實(shí)際的應(yīng)用需求進(jìn)行調(diào)整。建議將這些參數(shù)設(shè)置到應(yīng)用和系統(tǒng)的更大值。
3. 網(wǎng)絡(luò)緩存設(shè)置
網(wǎng)絡(luò)緩存是Linux內(nèi)核中實(shí)現(xiàn)網(wǎng)絡(luò)性能優(yōu)化的重要參數(shù)。在大型網(wǎng)絡(luò)應(yīng)用中,通過(guò)調(diào)整內(nèi)核網(wǎng)絡(luò)緩存大小可以顯著提高網(wǎng)絡(luò)性能。在進(jìn)行內(nèi)核網(wǎng)絡(luò)緩存設(shè)置時(shí),需要考慮網(wǎng)絡(luò)延遲、數(shù)據(jù)處理能力等因素。
4. TCP連接性能優(yōu)化
Linux系統(tǒng)默認(rèn)的TCP連接,可能會(huì)使連接成功率降低??梢酝ㄟ^(guò)在內(nèi)核當(dāng)中改變TCP的基礎(chǔ)參數(shù),將巨大的并發(fā)TCP連接管理更加協(xié)調(diào),避免因?yàn)門CP連接數(shù)量過(guò)大,造成系統(tǒng)性能下降的問(wèn)題。
性能測(cè)試和性能優(yōu)化
優(yōu)化網(wǎng)絡(luò)性能,必須首先得知它的瓶頸在哪里。所以,我們需要對(duì)系統(tǒng)的網(wǎng)絡(luò)性能進(jìn)行測(cè)試。而要想得到比較準(zhǔn)確和可靠的測(cè)試結(jié)果,需要注意以下幾點(diǎn):
1. 測(cè)試時(shí)間和負(fù)載條件
網(wǎng)絡(luò)性能測(cè)試時(shí)間及負(fù)載條件應(yīng)該盡可能接近實(shí)際應(yīng)用環(huán)境的負(fù)載條件,否則測(cè)試結(jié)果可能會(huì)失去準(zhǔn)確性,無(wú)法反映實(shí)際情況。在進(jìn)行測(cè)試時(shí),需要注意選擇合適的測(cè)試工具,如Iperf、Netperf等。
2. 數(shù)據(jù)收集和分析
在進(jìn)行網(wǎng)絡(luò)性能測(cè)試時(shí),需要保證測(cè)試數(shù)據(jù)的可靠性??梢赃x擇將測(cè)試數(shù)據(jù)記錄到日志文件中,并在測(cè)試結(jié)束后進(jìn)行分析,以找出網(wǎng)絡(luò)性能出現(xiàn)問(wèn)題的原因。
對(duì)于測(cè)試結(jié)果的反饋,我們可以著手進(jìn)行性能優(yōu)化。性能優(yōu)化的主要任務(wù)是優(yōu)化系統(tǒng)資源的使用、提高系統(tǒng)吞吐量和降低系統(tǒng)延遲。在進(jìn)行性能優(yōu)化時(shí),我們需要掌握一些方法和技巧,例如:
1. 合理選擇內(nèi)核調(diào)度算法
內(nèi)核調(diào)度算法是決定系統(tǒng)性能的重要因素之一。Linux內(nèi)核調(diào)度算法包括CFS、O(1)和Deadline等,不同的算法對(duì)系統(tǒng)的性能會(huì)產(chǎn)生不同的影響。因此,在進(jìn)行性能優(yōu)化時(shí),需要根據(jù)應(yīng)用負(fù)載情況,合理選擇調(diào)度算法以實(shí)現(xiàn)優(yōu)化系統(tǒng)性能的目的。
2. 合理配置網(wǎng)絡(luò)參數(shù)
網(wǎng)絡(luò)參數(shù)的配置對(duì)于優(yōu)化系統(tǒng)性能非常重要。以TCP/IP協(xié)議為例,可以通過(guò)控制擁塞窗口大小、調(diào)整滑動(dòng)窗口、關(guān)閉不必要的狀態(tài)等來(lái)優(yōu)化系統(tǒng)性能。
3. 資源的合理分配
系統(tǒng)內(nèi)部的不同資源,即CPU、內(nèi)存、磁盤等,它們的使用分配也會(huì)影響系統(tǒng)的性能。在進(jìn)行性能優(yōu)化時(shí),需要合理地分配每個(gè)資源的使用率,以實(shí)現(xiàn)更好的系統(tǒng)性能。
綜合來(lái)講,linux網(wǎng)絡(luò)內(nèi)核的優(yōu)化對(duì)于優(yōu)化系統(tǒng)網(wǎng)絡(luò)性能有著重要的作用。在實(shí)際應(yīng)用中,架構(gòu)設(shè)計(jì)師和開發(fā)人員需要針對(duì)實(shí)際應(yīng)用需求對(duì)網(wǎng)絡(luò)內(nèi)核進(jìn)行合理配置和調(diào)整,才能最終達(dá)到優(yōu)化網(wǎng)絡(luò)性能的目的。
相關(guān)問(wèn)題拓展閱讀:
- 一般優(yōu)化linux的內(nèi)核,需要優(yōu)化什么參數(shù)
一般優(yōu)化linux的內(nèi)核,需要優(yōu)化什么參數(shù)
方法只對(duì)擁有大量TIME_WAIT狀態(tài)的連接導(dǎo)致系統(tǒng)資源消耗有效,如果不是這種情況下,效果可能不明顯??梢允褂?/p>
netstat命令
去查TIME_WAIT狀態(tài)的連接狀態(tài),輸入下面的組合命令,查看當(dāng)前TCP連接的狀態(tài)和對(duì)應(yīng)的連接數(shù)量:
#netstat -n | awk ‘/^tcp/ {++S} END {for(a in S) print a, S}’
這個(gè)命令會(huì)輸出類似下面的結(jié)果:
LAST_ACK 16
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18098
我們只用關(guān)心TIME_WAIT的個(gè)數(shù),在這里可以看到,有18000多個(gè)TIME_WAIT,這樣就占用了18000多個(gè)端口。要知道端口的數(shù)量只有65535個(gè),占用一個(gè)少一個(gè),會(huì)嚴(yán)重的影響到后繼的新連接。這種情況下,我們就有必要調(diào)整下Linux的TCP內(nèi)核參數(shù),讓系統(tǒng)更快的釋放TIME_WAIT連接。
用vim打開
配置文件
:#vim /etc/sysctl.conf
在這個(gè)文件中,加入下面的幾行內(nèi)容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
輸入下面的命令,讓內(nèi)核參數(shù)生效:#sysctl -p
簡(jiǎn)單的說(shuō)明上面的參數(shù)的含義:
net.ipv4.tcp_syncookies = 1
#表示開啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1
#表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle = 1
#表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉鬧早;
net.ipv4.tcp_fin_timeout
#修改系統(tǒng)默認(rèn)的 TIMEOUT 時(shí)間。
在經(jīng)過(guò)這樣的調(diào)整之后,除了會(huì)進(jìn)一步提升服務(wù)器的負(fù)載能力之外,還能夠防御小流量程度的DoS、CC和SYN攻擊。
此外,如果你的連接數(shù)本身就很多,我們可以再優(yōu)化一下TCP的可使用端口范圍,進(jìn)一步提升服務(wù)器的并發(fā)能力。依然是往上面的參數(shù)文件中,加入下面這些配置:
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range =
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
#這幾個(gè)參數(shù),建議只在流量非常大的服務(wù)器上開啟,會(huì)有顯著的效果。一般的流量小的服務(wù)器上,沒(méi)有必要去設(shè)置這幾個(gè)參數(shù)。
net.ipv4.tcp_keepalive_time = 1200
#表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí),改為20分鐘。
net.ipv4.ip_local_port_range =
#表示用于向外連接的端口范圍。缺省情況下很?。?2768到61000,改滾舉為10000到65000。(注意:這里不要將更低值設(shè)的太低,否則可能會(huì)占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN隊(duì)列的長(zhǎng)度,默認(rèn)為1024,加大隊(duì)列長(zhǎng)度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。
net.ipv4.tcp_max_tw_buckets = 6000
#表示系統(tǒng)同時(shí)液備雀保持TIME_WAIT的更大數(shù)量,如果超過(guò)這個(gè)數(shù)字,TIME_WAIT將立刻被清除并打印警告信息。默 認(rèn)為180000,改為6000。對(duì)于Apache、Nginx等服務(wù)器,上幾行的參數(shù)可以很好地減少TIME_WAIT
套接字
數(shù)量,但是對(duì)于Squid,效果卻不大。此項(xiàng)參數(shù)可以控制TIME_WAIT的更大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT拖死。
內(nèi)核其他TCP參數(shù)說(shuō)明:
net.ipv4.tcp_max_syn_backlog = 65536
#記錄的那些尚未收到客戶端確認(rèn)信息的連接請(qǐng)求的更大值。對(duì)于有128M內(nèi)存的系統(tǒng)而言,缺省值是1024,小內(nèi)存的系統(tǒng)則是128。
net.core.netdev_max_backlog = 32768
#每個(gè)網(wǎng)絡(luò)接口接收
數(shù)據(jù)包
的速率比內(nèi)核處理這些包的速率快時(shí),允許送到隊(duì)列的數(shù)據(jù)包的更大數(shù)目。
net.core.somaxconn = 32768
#web應(yīng)用中l(wèi)isten函數(shù)的backlog默認(rèn)會(huì)給我們內(nèi)核參數(shù)的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認(rèn)為511,所以有必要調(diào)整這個(gè)值。
net.core.wmem_default =
net.core.rmem_default =
net.core.rmem_max = #更大socket讀buffer,可參考的優(yōu)化值:873200
net.core.wmem_max = #更大socket寫buffer,可參考的優(yōu)化值:873200
net.ipv4.tcp_timestps = 0
#時(shí)間戳可以避免序列號(hào)的卷繞。一個(gè)1Gbps的鏈路肯定會(huì)遇到以前用過(guò)的序列號(hào)。時(shí)間戳能夠讓內(nèi)核接受這種“異常”的數(shù)據(jù)包。這里需要將其關(guān)掉。
net.ipv4.tcp_synack_retries = 2
#為了打開對(duì)端的連接,內(nèi)核需要發(fā)送一個(gè)SYN并附帶一個(gè)回應(yīng)前面一個(gè)SYN的ACK。也就是所謂
三次握手
中的第二次握手。這個(gè)設(shè)置決定了內(nèi)核放棄連接之前發(fā)送SYN+ACK包的數(shù)量。
net.ipv4.tcp_syn_retries = 2
#在內(nèi)核放棄建立連接之前發(fā)送SYN包的數(shù)量。
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1
# 開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接。
net.ipv4.tcp_wmem =73200
# TCP寫buffer,可參考的優(yōu)化值:73200
net.ipv4.tcp_rmem =873200
# TCP讀buffer,可參考的優(yōu)化值:873200
net.ipv4.tcp_mem =
# 同樣有3個(gè)值,意思是:
net.ipv4.tcp_mem:低于此值,TCP沒(méi)有內(nèi)存壓力。
net.ipv4.tcp_mem:在此值下,進(jìn)入內(nèi)存壓力階段。
net.ipv4.tcp_mem:高于此值,TCP拒絕分配socket。
上述內(nèi)存單位是頁(yè),而不是字節(jié)??蓞⒖嫉膬?yōu)化值是:
net.ipv4.tcp_max_orphans =
#系統(tǒng)中最多有多少個(gè)TCP套接字不被關(guān)聯(lián)到任何一個(gè)用戶文件句柄上。
如果超過(guò)這個(gè)數(shù)字,連接將即刻被復(fù)位并打印出警告信息。
這個(gè)限制僅僅是為了防止簡(jiǎn)單的DoS攻擊,不能過(guò)分依靠它或者人為地減小這個(gè)值,
更應(yīng)該增加這個(gè)值(如果增加了內(nèi)存之后)。
net.ipv4.tcp_fin_timeout = 30
#如果套接字由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時(shí)間。對(duì)端可以出錯(cuò)并永遠(yuǎn)不關(guān)閉連接,甚至意外
當(dāng)機(jī)
。缺省值是60秒。2.2 內(nèi)核的通常值是180秒,你可以按這個(gè)設(shè)置,但要記住的是,即使你的機(jī)器是一個(gè)輕載的
WEB服務(wù)器
,也有因?yàn)榇罅康乃捞捉幼侄?/p>
內(nèi)存溢出
的風(fēng)險(xiǎn),F(xiàn)IN- WAIT-2的危險(xiǎn)性比FIN-WAIT-1要小,因?yàn)樗疃嘀荒艹缘?.5K內(nèi)存,但是它們的生存期長(zhǎng)些。
深入學(xué)習(xí)linux看下《linux就該這么學(xué)》
Sysctl命令及l(fā)inux內(nèi)核參數(shù)調(diào)整
一、Sysctl命令用來(lái)配置與顯示在/proc/sys目錄中的內(nèi)核參數(shù).如果想使參數(shù)長(zhǎng)期保存,可以通過(guò)編輯/etc/sysctl.conf文件來(lái)實(shí)現(xiàn)。
命令格式:
sysctl -w variable=value
sysctl -p (default /etc/sysctl.conf)
sysctl –a
常用參數(shù)的意義:
-w 臨時(shí)改變某個(gè)指定參數(shù)的值,如
# sysctl -w net.ipv4.ip_forward=1
-a 顯示所有的系統(tǒng)參數(shù)
-p從指定的文件加載系統(tǒng)參數(shù),默認(rèn)從/etc/sysctl.conf 文件中加載,如:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# sysctl -w net.ipv4.ip_forward=1
以上兩種方法都可能立即開啟路由功能,但前祥如果系統(tǒng)重啟,或執(zhí)行了
# service network restart
命令,所設(shè)置的值即會(huì)丟失,如果想永久保留配置,可以修改/etc/sysctl.conf文件,將 net.ipv4.ip_forward=0改為net.ipv4.ip_forward=1
二、linux內(nèi)核參數(shù)調(diào)整:linux 內(nèi)核參數(shù)調(diào)整有兩種方式
方法一:修改/proc下內(nèi)核參數(shù)文件內(nèi)容,不能使用編輯器來(lái)修改內(nèi)核參數(shù)文件,理由是由于內(nèi)核隨時(shí)可能更改這些文件中的任意一個(gè),另外,這些內(nèi)核參數(shù)文件都是虛擬文件,實(shí)際中不存在,因此不能使用編輯器進(jìn)行編輯,而是使用echo命令,然后從
命令行
將輸出重定向至 /proc 下所選定的咐搏文件中。如:將 timeout_timewait 參數(shù)設(shè)置為30秒:
# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
參數(shù)修改后立即生效,但是重啟系統(tǒng)后,該參數(shù)又恢復(fù)成默認(rèn)值。因此,想永久更改內(nèi)核參數(shù),需要修改/etc/sysctl.conf文件
方法二.修改衡悔祥/etc/sysctl.conf文件。檢查sysctl.conf文件,如果已經(jīng)包含需要修改的參數(shù),則修改該參數(shù)的值,如果沒(méi)有需要修改的參數(shù),在sysctl.conf文件中添加參數(shù)。如:
net.ipv4.tcp_fin_timeout=30
保存退出后,可以重啟機(jī)器使參數(shù)生效,如果想使參數(shù)馬上生效,也可以執(zhí)行如下命令:
# sysctl -p
三、sysctl.conf 文件中參數(shù)設(shè)置及說(shuō)明
proc/sys/net/core/wmem_max
更大socket寫buffer,可參考的優(yōu)化值:873200
/proc/sys/net/core/rmem_max
更大socket讀buffer,可參考的優(yōu)化值:873200
/proc/sys/net/ipv4/tcp_wmem
TCP寫buffer,可參考的優(yōu)化值:73200
/proc/sys/net/ipv4/tcp_rmem
TCP讀buffer,可參考的優(yōu)化值:873200
/proc/sys/net/ipv4/tcp_mem
同樣有3個(gè)值,意思是:
net.ipv4.tcp_mem:低于此值,TCP沒(méi)有內(nèi)存壓力.
net.ipv4.tcp_mem:在此值下,進(jìn)入內(nèi)存壓力階段.
net.ipv4.tcp_mem:高于此值,TCP拒絕分配socket.
上述內(nèi)存單位是頁(yè),而不是字節(jié).可參考的優(yōu)化值是:
/proc/sys/net/core/netdev_max_backlog
進(jìn)入包的更大設(shè)備隊(duì)列.默認(rèn)是300,對(duì)重負(fù)載服務(wù)器而言,該值太低,可調(diào)整到1000
/proc/sys/net/core/somaxconn
listen()的默認(rèn)參數(shù),掛起請(qǐng)求的更大數(shù)量.默認(rèn)是128.對(duì)繁忙的服務(wù)器,增加該值有助于網(wǎng)絡(luò)性能.可調(diào)整到256.
/proc/sys/net/core/optmem_max
socket buffer的更大初始化值,默認(rèn)10K
/proc/sys/net/ipv4/tcp_max_syn_backlog
進(jìn)入SYN包的更大請(qǐng)求隊(duì)列.默認(rèn)1024.對(duì)重負(fù)載服務(wù)器,可調(diào)整到2023
/proc/sys/net/ipv4/tcp_retries2
TCP失敗重傳次數(shù),默認(rèn)值15,意味著重傳15次才徹底放棄.可減少到5,盡早釋放內(nèi)核資源.
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
這3個(gè)參數(shù)與TCP KeepAlive有關(guān).默認(rèn)值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某個(gè)TCP連接在idle 2個(gè)小時(shí)后,內(nèi)核才發(fā)起probe.如果probe 9次(每次75秒)不成功,內(nèi)核才徹底放棄,認(rèn)為該連接已失效.對(duì)服務(wù)器而言,顯然上述值太大. 可調(diào)整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3
/proc/sys/net/ipv4/ip_local_port_range
指定端口范圍的一個(gè)配置,默認(rèn)是,已夠大.
net.ipv4.tcp_syncookies = 1
表示開啟SYN Cookies。當(dāng)出現(xiàn)SYN等待隊(duì)列溢出時(shí),啟用cookies來(lái)處理,可防范少量SYN攻擊,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用于新的TCP連接,默認(rèn)為0,表示關(guān)閉;
net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認(rèn)為0,表示關(guān)閉。
net.ipv4.tcp_fin_timeout = 30
表示如果
套接字
由本端要求關(guān)閉,這個(gè)參數(shù)決定了它保持在FIN-WAIT-2狀態(tài)的時(shí)間。
net.ipv4.tcp_keepalive_time = 1200
表示當(dāng)keepalive起用的時(shí)候,TCP發(fā)送keepalive消息的頻度。缺省是2小時(shí),改為20分鐘。
net.ipv4.ip_local_port_range =
表示用于向外連接的端口范圍。缺省情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192
表示SYN隊(duì)列的長(zhǎng)度,默認(rèn)為1024,加大隊(duì)列長(zhǎng)度為8192,可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。
net.ipv4.tcp_max_tw_buckets = 5000
表示系統(tǒng)同時(shí)保持TIME_WAIT套接字的更大數(shù)量,如果超過(guò)這個(gè)數(shù)字,TIME_WAIT套接字將立刻被清除并打印警告信息。默認(rèn)為,改為 5000。對(duì)于Apache、Nginx等服務(wù)器,上幾行的參數(shù)可以很好地減少TIME_WAIT套接字?jǐn)?shù)量,但是對(duì)于Squid,效果卻不大。此項(xiàng)參數(shù)可以控制TIME_WAIT套接字的更大數(shù)量,避免Squid服務(wù)器被大量的TIME_WAIT套接字拖死。
Linux上的NAT與iptables
談起Linux上的NAT,大多數(shù)人會(huì)跟你提到iptables。原因是因?yàn)閕ptables是目前在linux上實(shí)現(xiàn)NAT的一個(gè)非常好的接口。它通過(guò)和內(nèi)核級(jí)直接操作網(wǎng)絡(luò)包,效率和穩(wěn)定性都非常高。這里簡(jiǎn)單列舉一些NAT相關(guān)的iptables實(shí)例命令,可能對(duì)于大多數(shù)實(shí)現(xiàn)有多幫助。
這里說(shuō)明一下,為了節(jié)省篇幅,這里把準(zhǔn)備工作的命令略去了,僅僅列出核心步驟命令,所以如果你單單執(zhí)行這些沒(méi)有實(shí)現(xiàn)功能的話,很可能由于準(zhǔn)備工作沒(méi)有做好。如果你對(duì)整個(gè)命令細(xì)節(jié)感興趣的話,可以直接訪問(wèn)我的《如何讓你的Linux網(wǎng)關(guān)更強(qiáng)大》系列文章,其中對(duì)于各個(gè)腳本有詳細(xì)的說(shuō)明和描述。
# 案例1:實(shí)現(xiàn)網(wǎng)關(guān)的MASQUERADE
# 具體功能:內(nèi)網(wǎng)網(wǎng)卡是eth1,
外網(wǎng)
eth0,使得內(nèi)網(wǎng)指定本服務(wù)做網(wǎng)關(guān)可以訪問(wèn)外網(wǎng)
EXTERNAL=”eth0″
INTERNAL=”eth1″
# 這一步開啟ip轉(zhuǎn)發(fā)支持,這是NAT實(shí)現(xiàn)的前提
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o $EXTERNAL -j MASQUERADE
# 案例2:實(shí)現(xiàn)網(wǎng)關(guān)的簡(jiǎn)單端口映射
# 具體功能:實(shí)現(xiàn)外網(wǎng)通過(guò)訪問(wèn)網(wǎng)關(guān)的外部ip:80,可以直接達(dá)到訪問(wèn)私有網(wǎng)絡(luò)內(nèi)的一臺(tái)主機(jī)192.168.1.10:80效果
LOCAL_EX_IP=11.22.33.44 #設(shè)定網(wǎng)關(guān)的外網(wǎng)卡ip,對(duì)于多ip情況,參考《如何讓你的Linux網(wǎng)關(guān)更強(qiáng)大》系列文章
LOCAL_IN_IP=192.168.1.1 #設(shè)定網(wǎng)關(guān)的內(nèi)網(wǎng)卡ip
INTERNAL=”eth1″ #設(shè)定內(nèi)網(wǎng)卡
# 這一步開啟ip轉(zhuǎn)發(fā)支持,這是NAT實(shí)現(xiàn)的前提
echo 1 > /proc/sys/net/ipv4/ip_forward
# 加載需要的ip模塊,下面兩個(gè)是ftp相關(guān)的模塊,如果有其他特殊需求,也需要加進(jìn)來(lái)
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
# 這一步實(shí)現(xiàn)目標(biāo)地址指向網(wǎng)關(guān)外部ip:80的訪問(wèn)都吧目標(biāo)地址改成192.168.1.10:80
iptables -t nat -A PREROUTING -d $LOCAL_EX_IP -p tcp –dport 80 -j DNAT –to 192.168.1.10
# 這一步實(shí)現(xiàn)把目標(biāo)地址指向192.168.1.10:80的
數(shù)據(jù)包
的源地址改成網(wǎng)關(guān)自己的本地ip,這里是192.168.1.1
iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp –dport 80 -j SNAT –to $LOCAL_IN_IP
# 在FORWARD鏈上添加到192.168.1.10:80的允許,否則不能實(shí)現(xiàn)轉(zhuǎn)發(fā)
iptables -A FORWARD -o $INTERNAL -d 192.168.1.10 -p tcp –dport 80 -j ACCEPT
# 通過(guò)上面重要的三句話之后,實(shí)現(xiàn)的效果是,通過(guò)網(wǎng)關(guān)的外網(wǎng)ip:80訪問(wèn),全部轉(zhuǎn)發(fā)到內(nèi)網(wǎng)的192.168.1.10:
80端口
,實(shí)現(xiàn)典型的端口映射
# 特別注意,所有被轉(zhuǎn)發(fā)過(guò)的數(shù)據(jù)都是源地址是網(wǎng)關(guān)
內(nèi)網(wǎng)ip
的數(shù)據(jù)包,所以192.168.1.10上看到的所有訪問(wèn)都好像是網(wǎng)關(guān)發(fā)過(guò)來(lái)的一樣,而看不到外部ip
# 一個(gè)重要的思想:數(shù)據(jù)包根據(jù)“從哪里來(lái),回哪里去”的策略來(lái)走,所以不必?fù)?dān)心回頭數(shù)據(jù)的問(wèn)題
# 現(xiàn)在還有一個(gè)問(wèn)題,網(wǎng)關(guān)自己訪問(wèn)自己的外網(wǎng)ip:80,是不會(huì)被NAT到192.168.1.10的,這不是一個(gè)嚴(yán)重的問(wèn)題,但讓人很不爽,解決的方法如下:
iptables -t nat -A OUTPUT -d $LOCAL_EX_IP -p tcp –dport 80 -j DNAT –to 192.168.1.10
獲取系統(tǒng)中的NAT信息和診斷錯(cuò)誤
了解/proc目錄的意義
在Linux系統(tǒng)中,/proc是一個(gè)特殊的目錄,proc
文件系統(tǒng)
是一個(gè)偽文件系統(tǒng),它只存在內(nèi)存當(dāng)中,而不占用
外存
空間。它包含當(dāng)前系統(tǒng)的一些參數(shù)(variables)和狀態(tài)(status)情況。它以文件系統(tǒng)的方式為訪問(wèn)系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口
通過(guò)/proc可以了解到系統(tǒng)當(dāng)前的一些重要信息,包括磁盤使用情況,內(nèi)存使用狀況,硬件信息,網(wǎng)絡(luò)使用情況等等,很多系統(tǒng)監(jiān)控工具(如HotSaNIC)都通過(guò)/proc目錄獲取系統(tǒng)數(shù)據(jù)。
另一方面通過(guò)直接操作/proc中的參數(shù)可以實(shí)現(xiàn)系統(tǒng)內(nèi)核參數(shù)的調(diào)節(jié),比如是否允許ip轉(zhuǎn)發(fā),syn-cookie是否打開,tcp超時(shí)時(shí)間等。
獲得參數(shù)的方式:
之一種:cat /proc/xxx/xxx,如 cat /proc/sys/net/ipv4/conf/all/rp_filter
第二種:sysctl sysctl net.ipv4.conf.all.rp_filter
改變參數(shù)的方式:
之一種:echo value > /proc/xxx/xxx,如 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
第二種:sysctl variable=value,如 sysctl net.ipv4.conf.all.rp_filter=1
以上設(shè)定系統(tǒng)參數(shù)的方式只對(duì)當(dāng)前系統(tǒng)有效,重起系統(tǒng)就沒(méi)了,想要保存下來(lái),需要寫入/etc/sysctl.conf文件中
通過(guò)執(zhí)行 man 5 proc可以獲得一些關(guān)于proc目錄的介紹
查看系統(tǒng)中的NAT情況
和NAT相關(guān)的系統(tǒng)變量
/proc/slabinfo:內(nèi)核緩存使用情況統(tǒng)計(jì)信息(Kernel slab allocator statistics)
/proc/sys/net/ipv4/ip_conntrack_max:系統(tǒng)支持的更大ipv4連接數(shù),默認(rèn)65536(事實(shí)上這也是理論更大值)
/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 已建立的tcp連接的超時(shí)時(shí)間,默認(rèn)432023,也就是5天
和NAT相關(guān)的狀態(tài)值
/proc/net/ip_conntrack:當(dāng)前的前被跟蹤的連接狀況,nat翻譯表就在這里體現(xiàn)(對(duì)于一個(gè)網(wǎng)關(guān)為主要功能的Linux主機(jī),里面大部分信息是NAT翻譯表)
/proc/sys/net/ipv4/ip_local_port_range:本地開放端口范圍,這個(gè)范圍同樣會(huì)間接限制NAT表規(guī)模
# 1. 查看當(dāng)前系統(tǒng)支持的更大連接數(shù)
cat /proc/sys/net/ipv4/ip_conntrack_max
# 值:默認(rèn)65536,同時(shí)這個(gè)值和你的內(nèi)存大小有關(guān),如果內(nèi)存128M,這個(gè)值更大8192,1G以上內(nèi)存這個(gè)值都是默認(rèn)65536
# 影響:這個(gè)值決定了你作為NAT網(wǎng)關(guān)的工作能力上限,所有局域網(wǎng)內(nèi)通過(guò)這臺(tái)網(wǎng)關(guān)對(duì)外的連接都將占用一個(gè)連接,如果這個(gè)值太低,將會(huì)影響吞吐量
# 2. 查看tcp連接超時(shí)時(shí)間
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# 值:默認(rèn)432023(秒),也就是5天
# 影響:這個(gè)值過(guò)大將導(dǎo)致一些可能已經(jīng)不用的連接常駐于內(nèi)存中,占用大量鏈接資源,從而可能導(dǎo)致NAT ip_conntrack: table full的問(wèn)題
# 建議:對(duì)于NAT負(fù)載相對(duì)本機(jī)的 NAT表大小很緊張的時(shí)候,可能需要考慮縮小這個(gè)值,以盡早清除連接,保證有可用的連接資源;如果不緊張,不必修改
# 3. 查看NAT表使用情況(判斷NAT表資源是否緊張)
# 執(zhí)行下面的命令可以查看你的網(wǎng)關(guān)中NAT表情況
cat /proc/net/ip_conntrack
# 4. 查看本地開放端口的范圍
cat /proc/sys/net/ipv4/ip_local_port_range
# 返回兩個(gè)值,最小值和更大值
# 下面的命令幫你明確一下NAT表的規(guī)模
wc -l /proc/net/ip_conntrack
#或者
grep ip_conntrack /proc/slabinfo | grep -v expect | awk ‘{print $1 ‘,’ $2;}’
# 下面的命令幫你明確可用的NAT表項(xiàng),如果這個(gè)值比較大,那就說(shuō)明NAT表資源不緊張
grep ip_conntrack /proc/slabinfo | grep -v expect | awk ‘{print $1 ‘,’ $3;}’
# 下面的命令幫你統(tǒng)計(jì)NAT表中占用端口最多的幾個(gè)ip,很有可能這些家伙再做一些bt的事情,嗯bt的事情:-)
cat /proc/net/ip_conntrack | cut -d ‘ ‘ -f 10 | cut -d ‘=’ -f 2 | sort | uniq -c | sort -nr | head -n 10
# 上面這個(gè)命令有點(diǎn)瑕疵cut -d’ ‘ -f10會(huì)因?yàn)槊钶敵鲇行┬腥表?xiàng)而造成統(tǒng)計(jì)偏差,下面給出一個(gè)正確的寫法:
cat /proc/net/ip_conntrack | perl -pe s/^\(.*?\)src/src/g | cut -d ‘ ‘ -f1 | cut -d ‘=’ -f2 | sort | uniq -c | sort -nr | head -n 10
作為高性能WEB服務(wù)器,只調(diào)整Nginx本身的參數(shù)是不行的,因?yàn)镹ginx服務(wù)依賴于高性能的操作系統(tǒng)。
以下為常見的幾個(gè)Linux內(nèi)核參數(shù)優(yōu)化方法。
net.ipv4.tcp_max_tw_buckets
對(duì)于tcp連接,服務(wù)端和客戶端通信完后狀態(tài)變?yōu)閠imewait,假如某臺(tái)服務(wù)器非常忙,連接數(shù)特別多的話,那么這個(gè)timewait數(shù)量就會(huì)越來(lái)越大。
畢竟它也是會(huì)占用一定的資源,所以應(yīng)該有一個(gè)更大值,當(dāng)超過(guò)這個(gè)值,系統(tǒng)就會(huì)刪除最早的納檔連接,這樣始終保持在一個(gè)數(shù)量級(jí)。
這個(gè)數(shù)值就是由net.ipv4.tcp_max_tw_buckets這個(gè)參數(shù)來(lái)決定的。
CentOS7系統(tǒng),你可以使用sysctl -a |grep tw_buckets來(lái)查看它的值,默認(rèn)為32768,
你可以適當(dāng)把它調(diào)低,比如調(diào)整到8000,畢竟這個(gè)狀態(tài)的連接太多也是會(huì)消耗資源的。
但你不要把它調(diào)到幾十、幾百這樣,因?yàn)檫@種狀態(tài)的tcp連接也是有用的,
如果同樣的客戶端再次和服務(wù)端通信洞攜亂,就不用再次建立新的連接了,用這個(gè)舊的通道,省時(shí)省力。
net.ipv4.tcp_tw_recycle = 1
該參隱纖數(shù)的作用是快速回收timewait狀態(tài)的連接。上面雖然提到系統(tǒng)會(huì)自動(dòng)刪除掉timewait狀態(tài)的連接,但如果把這樣的連接重新利用起來(lái)豈不是更好。
所以該參數(shù)設(shè)置為1就可以讓timewait狀態(tài)的連接快速回收,它需要和下面的參數(shù)配合一起使用。
net.ipv4.tcp_tw_reuse = 1
該參數(shù)設(shè)置為1,將timewait狀態(tài)的連接重新用于新的TCP連接,要結(jié)合上面的參數(shù)一起使用。
net.ipv4.tcp_syncookies = 1
tcp三次握手中,客戶端向服務(wù)端發(fā)起syn請(qǐng)求,服務(wù)端收到后,也會(huì)向客戶端發(fā)起syn請(qǐng)求同時(shí)連帶ack確認(rèn),
假如客戶端發(fā)送請(qǐng)求后直接斷開和服務(wù)端的連接,不接收服務(wù)端發(fā)起的這個(gè)請(qǐng)求,服務(wù)端會(huì)重試多次,
這個(gè)重試的過(guò)程會(huì)持續(xù)一段時(shí)間(通常高于30s),當(dāng)這種狀態(tài)的連接數(shù)量非常大時(shí),服務(wù)器會(huì)消耗很大的資源,從而造成癱瘓,
正常的連接進(jìn)不來(lái),這種惡意的半連接行為其實(shí)叫做syn flood攻擊。
設(shè)置為1,是開啟SYN Cookies,開啟后可以避免發(fā)生上述的syn flood攻擊。
開啟該參數(shù)后,服務(wù)端接收客戶端的ack后,再向客戶端發(fā)送ack+syn之前會(huì)要求client在短時(shí)間內(nèi)回應(yīng)一個(gè)序號(hào),
如果客戶端不能提供序號(hào)或者提供的序號(hào)不對(duì)則認(rèn)為該客戶端不合法,于是不會(huì)發(fā)ack+syn給客戶端,更涉及不到重試。
net.ipv4.tcp_max_syn_backlog
該參數(shù)定義系統(tǒng)能接受的更大半連接狀態(tài)的tcp連接數(shù)??蛻舳讼蚍?wù)端發(fā)送了syn包,服務(wù)端收到后,會(huì)記錄一下,
該參數(shù)決定最多能記錄幾個(gè)這樣的連接。在CentOS7,默認(rèn)是256,當(dāng)有syn flood攻擊時(shí),這個(gè)數(shù)值太小則很容易導(dǎo)致服務(wù)器癱瘓,
實(shí)際上此時(shí)服務(wù)器并沒(méi)有消耗太多資源(cpu、內(nèi)存等),所以可以適當(dāng)調(diào)大它,比如調(diào)整到30000。
net.ipv4.tcp_syn_retries
該參數(shù)適用于客戶端,它定義發(fā)起syn的更大重試次數(shù),默認(rèn)為6,建議改為2。
net.ipv4.tcp_synack_retries
該參數(shù)適用于服務(wù)端,它定義發(fā)起syn+ack的更大重試次數(shù),默認(rèn)為5,建議改為2,可以適當(dāng)預(yù)防syn flood攻擊。
net.ipv4.ip_local_port_range
該參數(shù)定義端口范圍,系統(tǒng)默認(rèn)保留端口為1024及以下,以上部分為自定義端口。這個(gè)參數(shù)適用于客戶端,
當(dāng)客戶端和服務(wù)端建立連接時(shí),比如說(shuō)訪問(wèn)服務(wù)端的80端口,客戶端隨機(jī)開啟了一個(gè)端口和服務(wù)端發(fā)起連接,
這個(gè)參數(shù)定義隨機(jī)端口的范圍。默認(rèn)為,建議調(diào)整為。
net.ipv4.tcp_fin_timeout
tcp連接的狀態(tài)中,客戶端上有一個(gè)是FIN-WAIT-2狀態(tài),它是狀態(tài)變遷為timewait前一個(gè)狀態(tài)。
該參數(shù)定義不屬于任何進(jìn)程的該連接狀態(tài)的超時(shí)時(shí)間,默認(rèn)值為60,建議調(diào)整為6。
net.ipv4.tcp_keepalive_time
tcp連接狀態(tài)里,有一個(gè)是established狀態(tài),只有在這個(gè)狀態(tài)下,客戶端和服務(wù)端才能通信。正常情況下,當(dāng)通信完畢,
客戶端或服務(wù)端會(huì)告訴對(duì)方要關(guān)閉連接,此時(shí)狀態(tài)就會(huì)變?yōu)閠imewait,如果客戶端沒(méi)有告訴服務(wù)端,
并且服務(wù)端也沒(méi)有告訴客戶端關(guān)閉的話(例如,客戶端那邊斷網(wǎng)了),此時(shí)需要該參數(shù)來(lái)判定。
比如客戶端已經(jīng)斷網(wǎng)了,但服務(wù)端上本次連接的狀態(tài)依然是established,服務(wù)端為了確認(rèn)客戶端是否斷網(wǎng),
就需要每隔一段時(shí)間去發(fā)一個(gè)探測(cè)包去確認(rèn)一下看看對(duì)方是否在線。這個(gè)時(shí)間就由該參數(shù)決定。它的默認(rèn)值為7200秒,建議設(shè)置為30秒。
net.ipv4.tcp_keepalive_intvl
該參數(shù)和上面的參數(shù)是一起的,服務(wù)端在規(guī)定時(shí)間內(nèi)發(fā)起了探測(cè),查看客戶端是否在線,如果客戶端并沒(méi)有確認(rèn),
此時(shí)服務(wù)端還不能認(rèn)定為對(duì)方不在線,而是要嘗試多次。該參數(shù)定義重新發(fā)送探測(cè)的時(shí)間,即之一次發(fā)現(xiàn)對(duì)方有問(wèn)題后,過(guò)多久再次發(fā)起探測(cè)。
默認(rèn)值為75秒,可以改為3秒。
net.ipv4.tcp_keepalive_probes
第10和第11個(gè)參數(shù)規(guī)定了何時(shí)發(fā)起探測(cè)和探測(cè)失敗后再過(guò)多久再發(fā)起探測(cè),但并沒(méi)有定義一共探測(cè)幾次才算結(jié)束。
該參數(shù)定義發(fā)起探測(cè)的包的數(shù)量。默認(rèn)為9,建議設(shè)置2。
設(shè)置和范例
linux網(wǎng)絡(luò)內(nèi)核的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux網(wǎng)絡(luò)內(nèi)核,Linux網(wǎng)絡(luò)內(nèi)核:優(yōu)化網(wǎng)絡(luò)性能的關(guān)鍵,一般優(yōu)化linux的內(nèi)核,需要優(yōu)化什么參數(shù)的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認(rèn)可。
網(wǎng)站題目:Linux網(wǎng)絡(luò)內(nèi)核:優(yōu)化網(wǎng)絡(luò)性能的關(guān)鍵(linux網(wǎng)絡(luò)內(nèi)核)
標(biāo)題URL:http://www.dlmjj.cn/article/cdpjdie.html


咨詢
建站咨詢
