天天看點

linux伺服器曆險之sysctl優化linux網絡

1, 優化網絡裝置接收隊列

   net.core.netdev_max_backlog=3000

    該檔案表示在每個網絡接口接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數目。

    預設值:Red Hat Linux release 9 (Shrike)預設為300

            rhel5 預設為1000

    建議值為3000

2, net.ipv4.conf.lo.accept_redirects

    accept_redirects:該參數位于 /proc/sys/net/ipv4/conf/DEV/accept_redirects (DEV表示具體的網絡接口),如果你的主機所在的網段中有兩個路由器,你将其中一個設定成了預設網關,但是該網關在收到你的ip包時發現該ip包必須經 過另外一個路由器,這時這個路由器就會給你發一個所謂的“重定向”icmp包,告訴将ip包轉發到另外一個路由器。參數值為布爾值,1表示接收這類重定向 icmp 資訊,0表示忽略。在充當路由器的linux主機上預設值為0,在一般的linux主機上預設值為1。建議将其改為0,或者使用“安全重定向”(見下文) 以消除安全性隐患。

   net.ipv4.conf.lo.accept_redirects=0

   net.ipv4.conf.all.accept_redirects=0

   net.ipv4.conf.eth0.accept_redirects=0

   net.ipv4.conf.default.accept_redirects=0

3, 打開TIME-WAIT套接字重用功能,對于存在大量連接配接的Web伺服器非常有效。

    net.ipv4.tcp_tw_recyle=1

    net.ipv4.tcp_tw_reuse=1

    10) /proc/sys/net/ipv4/tcp_tw_recyle

    打開快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求,請不要随

    意修改這個值。

    預設設定:0

    11) /proc/sys/net/ipv4/tcp_tw_reuse

    該檔案表示是否允許重新應用處于TIME-WAIT狀态的socket用于新的TCP連接配接。

     預設設定:0

下邊的指令用來對連接配接數量非常大的伺服器進行調優.

·對于同時支援很多連接配接的伺服器,新的連接配接可以重新使用TIME-WAIT套接字. 這對于Web伺服器非常有效:

linux伺服器曆險之sysctl優化linux網絡

如果你使用該指令,還要啟動TIME-WAIT 套接字狀态的快速循環功能:

linux伺服器曆險之sysctl優化linux網絡

圖Figure 10-7顯示出将這些功能啟用,連接配接數量明顯降低.因為每個TCP傳輸都包含遠端用戶端的協定資訊緩存,是以有利于提高性能.緩存中存放round-trip時間、最大segment大小、擁塞視窗的資訊。

4, 減少處于FIN-WAIT-2連接配接狀态的時間,使系統可以處理更多的連接配接。

    net.ipv4.tcp_fin_timeout=30

     tcp_fin_timeout:在一個tcp會話過程中,在會話結束時,A首先向B發送一個fin包,

     在獲 得B的ack确認包後,A就進入FIN WAIT2狀态等待B的fin包然後給B發ack确認包。

     這個參數就是用來設定A進入FIN WAIT2狀态等待對方fin包的逾時時間。

     如果時間到了仍未收到對方的fin包就主動釋放該會話。

     參數值為整數,機關為秒,預設為180秒

    對于本端斷開的socket連接配接,TCP保持在FIN-WAIT-2狀态的時間。對方可能

   會斷開連接配接或一直不結束連接配接或不可預料的程序死亡。預設值為 60 秒。過去在

   2.2版本的核心中是 180 秒。您可以設定該值,但需要注意,如果您的機器為負

   載很重的web伺服器,您可能要冒記憶體被大量無效資料報填滿的風險,

   FIN-WAIT-2 sockets 的危險性低于 FIN-WAIT-1,因為它們最多隻吃 1.5K

   的記憶體,但是它們存在時間更長。另外參考 tcp_max_orphans。

·參數 tcp_fin_timeout 是套接字關閉時,保持 FIN-WAIT-2狀态的時間。一個 TCP連接配接以 three-segment SYN序列開始 , 以 three-segment FIN序列結束 .均不保留資料 .通過改變 tcp_fin_timeout的值 , 從 FIN序列到記憶體可以空閑出來處理新連接配接的時間縮短了 ,使性能得到改進 .改變這個值的前要經過認真的監測 ,避免因為死套接字造成記憶體溢出 .

linux伺服器曆險之sysctl優化linux網絡

5, 減少TCP KeepAlive連接配接偵測的時間,使系統可以處理更多的連接配接。

    net.ipv4.tcp_keepalive_time=1800

   /proc/sys/net/ipv4/tcp_keepalive_time

   該檔案表示從不再傳送資料到向連接配接上發送保持連接配接信号之間所需的秒數。

   預設設定:7200(2小時)

伺服器的一個問題是 ,同一時刻的大量 TCP連接配接裡有很多的連接配接被打開但是沒有使用 . TCP的 keepalive功能檢測到這些連接配接 ,預設情況下 ,在 2小時之後丢掉 . 2個小時的可能導緻記憶體過度使用 ,降低性能 .是以改成 1800秒 (30分鐘 )是個更好的選擇 :

linux伺服器曆險之sysctl優化linux網絡

6, 增加TCP SYN隊列長度,使系統可以處理更多的并發連接配接。

     net.ipv4.tcp_max_syn_backlog=8192

     /proc/sys/net/ipv4/tcp_max_syn_backlog

     對于那些依然還未獲得用戶端确認的連接配接請求,需要儲存在隊列中最大數目。對于

     超過 128Mb 記憶體的系統,預設值是 1024,低于 128Mb 的則為 128。如果

     伺服器經常出現過載,可以嘗試增加這個數字。警告!假如您将此值設為大于

     1024,最好修改 include/net/tcp.h 裡面的 TCP_SYNQ_HSIZE,以保持

     TCP_SYNQ_HSIZE*16 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如

     果tcp_adv_win_scale 128Mb 32768-610000)則系統将忽略所有發送給自己

     的ICMP ECHO請求或那些廣播位址的請求。

     當伺服器負載繁重或者是有很多用戶端都是超長延時的連接配接故障,可能會導緻 half-open連接配接數量的增加。這對于 Web伺服器很來講很平常 ,尤其有很多撥号客戶時 .這些 half-open連接配接儲存在 backlog connections 隊列中 .将這個值最少設定為 4096 (預設為 1024). 即便是伺服器不接收這類連接配接 ,設定這個值還能防止受到 denial-of-service (syn-flood)的攻擊 .

7, 1)     優化系統套接字緩沖區

     net.core.rmem_max=16777216

      net.core.wmem_max=16777216

     5) /proc/sys/net/core/rmem_default

     該檔案指定了接收套接字緩沖區大小的預設值(以位元組為機關)。

     預設設定:110592

     6) /proc/sys/net/core/rmem_max

     該檔案指定了接收套接字緩沖區大小的最大值(以位元組為機關)。

     預設設定:131071

     7) /proc/sys/net/core/wmem_default

     該檔案指定了發送套接字緩沖區大小的預設值(以位元組為機關)。

     預設設定:110592

     8) /proc/sys/net/core/wmem_max

     該檔案指定了發送套接字緩沖區大小的最大值(以位元組為機關)。

     預設設定:131071

·對于所有協定的隊列 ,設定最大系統發送緩存 (wmem) 和接收緩存 (rmem)到 8MB

linux伺服器曆險之sysctl優化linux網絡

這些設定指定了建立 TCP套接字時為其配置設定的記憶體容量 . 另外 ,使用如下指令發送和接收緩存 .該指令設定了三個值 :最小值、初始值和最大值:

linux伺服器曆險之sysctl優化linux網絡

第三個值必須小于或等于 wmem_max和 rmem_max。

8 打開TCP SYN cookie選項,有助于保護伺服器免受SyncFlood攻擊。

net.ipv4.tcp_syncookies=1

/proc/sys/net/ipv4/tcp_syncookies

該檔案表示是否打開TCP同步标簽(syncookie),核心必須打開了 CONFIG_SYN_COOKIES項進行編譯。 同步标簽(syncookie)可以防止一個套接字在有過多試圖連接配接到達時引起過載。

tcp_syncookies 參數類型:整型

隻有在核心編譯時選擇了CONFIG_SYNCOOKIES時才會發生作用。當出現syn等候隊列出現溢出時象對方發送syncookies。目的是為了防止syn flood攻擊。預設值是false。

注意:該選項千萬不能用于那些沒有收到攻擊的高負載伺服器,如果在日志中出現 synflood消息,但是調查發現沒有收到synflood攻擊,而是合法使用者的連接配接負載過高的原因,你應該調整其它參數來提高伺服器性能。參考: tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow.

syncookie嚴重的違背TCP協定,不允許使用TCP擴充,可能對某些服務導緻嚴重的性能影響(如SMTP轉發)。

開啟TCP SYN cookies,保護伺服器避免受syn-flood攻擊,包括服務取決denial-of-service (DoS) 或者分布式服務拒絕distributed denial-of-service (DDoS) (僅适用Red Hat Enterprise Linux AS)

9  關閉路由相關功能

net.ipv4.conf.lo.accept_source_route=0

net.ipv4.conf.all.accept_source_route=0

net.ipv4.conf.eth0.accept_source_route=0

net.ipv4.conf.default.accept_source_route=0

net.ipv4.conf.lo.accept_redirects=0

net.ipv4.conf.all.accept_redirects=0

net.ipv4.conf.eth0.accept_redirects=0

net.ipv4.conf.default.accept_redirects=0

net.ipv4.conf.lo.secure_redirects=0

net.ipv4.conf.all.secure_redirects=0

net.ipv4.conf.eth0.secure_redirects=0

net.ipv4.conf.default.secure_redirects=0

net.ipv4.conf.lo.send_redirects=0

net.ipv4.conf.all.send_redirects=0

net.ipv4.conf.eth0.send_redirects=0

net.ipv4.conf.default.send_redirects=0

/proc/sys/net/ipv4/*/secure_redirects

 其實所謂的“安全重定向”就是隻接受來自網關的“重定向”icmp包。該參數就是

 用來設定“安全重定向”功能的。參數值為布爾值,1表示啟用,0表示禁止,預設值

 為啟用。

send_redirects - 布爾類型

    如果是router,發送重定向消息,預設值是TRUE

accept_redirects - 布爾類型

    收發接收ICMP重定向消息。對于主機來說預設為True,對于用作路由器時預設值為False。

·以下指令使伺服器忽略來自被列入網關的伺服器的重定向。因重定向可以被用來進行攻擊,是以我們隻接受有可靠來源的重定向。

linux伺服器曆險之sysctl優化linux網絡

另 外,你可以配置接受或拒絕任何ICMP重定向。ICMP重定向是路由器傳輸路由資訊的機制。比如,當網關接收到來自所接網絡主機的Internet資料報 時,網關可以發送重定向資訊到一台主機。網關檢查路由表獲得下一個網關的位址,第二個網關将資料報路由到目标網絡.關閉這些重定向得指令如下:

linux伺服器曆險之sysctl優化linux網絡

·如果這個伺服器不是一台路由器,那麼它不會發送重定向,是以可以關閉該功能:

linux伺服器曆險之sysctl優化linux網絡

10    優化TCP接收/發送緩沖區

net.ipv4.tcp_rmem=4096 87380 16777216

net.ipv4.tcp_wmem=4096 65536 16777216

25) /proc/sys/net/ipv4/tcp_wmem

該檔案包含3個整數值,分别是:min,default,max

Min:為TCP socket預留用于發送緩沖的記憶體最小值。每個TCP socket都可以使用它。

Default:為TCP socket預留用于發送緩沖的記憶體數量,預設情況下該值會影響其它協定使用的net.core.wmem中default的 值,一般要低于net.core.wmem中default的值。

Max:為TCP socket預留用于發送緩沖的記憶體最大值。該值不會影響net.core.wmem_max,今天選擇參數SO_SNDBUF則不受該值影響。預設值為128K。

預設設定:4096 16384 131072

26) /proc/sys/net/ipv4/tcp_rmem

該檔案包含3個整數值,分别是:min,default,max

Min:為TCP socket預留用于接收緩沖的記憶體數量,即使在記憶體出現緊張情況下TCP socket都至少會有這麼多數量的記憶體用于接收緩沖。

Default: 為TCP socket預留用于接收緩沖的記憶體數量,預設情況下該值影響其它協定使用的 net.core.wmem中default的值。該值決定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win的 預設值情況下,TCP 視窗大小為65535。

Max:為TCP socket預留用于接收緩沖的記憶體最大值。該值不會影響 net.core.wmem中max的值,今天選擇參數 SO_SNDBUF則不受該值影響。

tcp_wmem - 三個整數的向量: min, default, max

     min:為TCP socket預留用于發送緩沖的記憶體最小值。每個tcp socket都可以在建議以後都可以使用它。預設值為4K。

     default:為TCP socket預留用于發送緩沖的記憶體數量,預設情況下該值會影響其它協定使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。預設值為16K。

     max: 用于TCP socket發送緩沖的記憶體最大值。該值不會影響net.core.wmem_max,今天選擇參數SO_SNDBUF則不受該值影響。預設值為128K。

tcp_rmem - 三個整數的向量: min, default, max

     min:為TCP socket預留用于接收緩沖的記憶體數量,即使在記憶體出現緊張情況下tcp socket都至少會有這麼多數量的記憶體用于接收緩沖,預設值為8K。

     default:為TCP socket預留用于接收緩沖的記憶體數量,預設情況下該值影響其它協定使用的 net.core.wmem_default 值。該值決定了在tcp_adv_win_scale、tcp_app_win和tcp_app_win:0是預設值情況下,tcp 視窗大小為65535。

    max:用于TCP socket接收緩沖的記憶體最大值。該值不會影響 net.core.wmem_max,今天選擇參數 SO_SNDBUF則不受該值影響。預設值為 128K。預設值為87380*2 bytes。

11,

配置伺服器拒絕接受廣播風暴或者smurf 攻擊attacks:

linux伺服器曆險之sysctl優化linux網絡

12,

·有些路由器針對廣播祯發送無效的回應,每個都産生警告并在核心産生日志.這些回應可以被忽略:

linux伺服器曆險之sysctl優化linux網絡

13,

# don't cache ssthresh from previous connection
   net.ipv4.tcp_no_metrics_save = 1

14,
# Increase the maximum number of skb-heads to be cached
net.core.hot_list_length = 256

15,
# Increase the tcp-time-wait buckets pool size
net.ipv4.tcp_max_tw_buckets = 360000


16# Lower syn retry rates
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3


17,# Set TCP Re-Ordering value in kernel to ‘5′
net.ipv4.tcp_reordering = 5

      

繼續閱讀