linux生產伺服器有關網路狀態的優化措施

weixin_34377065發表於2013-04-23

本博文為老男孩linu培訓機構早期的培訓教案,特分享以供大家學習參考。
全部系列分為五篇文章,本博文為第五篇:
5.1
高併發linux生產伺服器核心引數優化案例

高併發linux生產伺服器核心引數優化案例

說明:本優化適合apache,nginx,squid多種等web應用,特殊的業務也可能需要略作調整。

所謂核心優化,主要是在Linux系統中針對業務服務應用而進行的系統核心引數優化,優化並無特殊的標準,下面以常見生產環境linux的核心優化為例講解,僅供大家參考:

net.ipv4.tcp_fin_timeout = 2

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_keepalive_time = 600

net.ipv4.ip_local_port_range = 400065000

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.tcp_max_tw_buckets = 36000

net.ipv4.route.gc_timeout = 100

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

net.core.somaxconn = 16384

net.core.netdev_max_backlog = 16384

net.ipv4.tcp_max_orphans = 16384

#以下引數是對iptables防火牆的優化,防火牆不開會提示,可以忽略不理。

net.ipv4.ip_conntrack_max = 25000000

net.ipv4.netfilter.ip_conntrack_max=25000000

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180

net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120

net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60

net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120

將上面的核心引數值加入/etc/sysctl.conf檔案中,然後執行如下命令使之生效:sysctl -p 

引數解釋找谷歌吧,大把大把。呵呵。

六、TCP 連線狀態

6.1三次握手建立連線

TCP是一個面向連線的協議,所以在連線雙方傳送資料之前,都需要首先建立一條連線。TCP連線的建立可以簡單的稱為三次握手,而連線的中止則可以叫做四次握手
1.連線的建立
在建立連線的時候,客戶端首先向伺服器申請開啟某一個埠(用SYN段等於1的TCP報文),然後伺服器端發回一個ACK報文通知客戶端請求報文收到,客戶端收到確認報文以後再次發出確認報文確認剛才伺服器端發出的確認報文(繞口麼),至此,連線的建立完成。這就叫做三次握手。如果打算讓雙方都做好準備的話,一定要傳送三次報文,而且只需要三次報文就可以了。如果再加上TCP的超時重傳機制,那麼TCP就完全可以保證一個資料包被送到目的地。

1)客戶端傳送 SYN 訊息,其中包含伺服器的埠和客戶端的初始序列號(ISN)到伺服器(活動開啟)。

2)伺服器會傳送回SYNACK(其中包括的客戶端的 ISN + 1)。

3)客戶端傳送一個 ACK,(其中包括的伺服器的 ISN + 1)。

6.2四次揮手關閉連線

結束連線
TCP有一個特別的概念叫做half-close,這個概念是說,TCP的連線是全雙工(可以同時傳送和接收)連線,因此在關閉連線的時候,必須關閉傳和送兩個方向上的連線。客戶機給伺服器一個FIN為1的TCP報文,然後伺服器返回給客戶端一個確認ACK報文,並且傳送一個FIN報文,當客戶機回覆ACK報文後(四次握手),連線就結束了。

1)客戶端傳送一個FIN(活動收盤)。這是一個現在半關閉連線。客戶端不能再將資料傳送,但仍然能夠從伺服器接收資料。收到此 FIN 伺服器進入被動關閉狀態。

2)伺服器傳送一個ACK(這時客戶端 FIN 序列 + 1

3)伺服器傳送其自身FIN

4)客戶端傳送一個ACK(這是伺服器的 FIN 序列 + 1)。收到此 ACK 伺服器關閉連線。

6.3 win32 Netstat 輸出說明

狀態說明,Netstat 中所示:

狀態說明
------------ --------------------------------------------------------
SYN_SEND 指示活動開啟。
SYN_RECEIVED 伺服器只接收來自客戶端的 SYN。
建立的客戶端接收到伺服器的 SYN 和建立會話。

偵聽伺服器已準備好接受連線。

注: 請參閱文件 listen() 套接字呼叫。TCP 套接字偵聽狀態中的不會顯示-這是 NETSTAT 的限制。有關其他資訊,請參閱 Microsoft 知識庫中相應的文章:

134404NETSTAT。EXE 不顯示 TCP 偵聽套接字

FIN_WAIT_1 指示活動結束標記。

TIMED_WAIT 客戶端活動關閉後將進入此狀態。

CLOSE_WAIT 指示被動關閉。伺服器只是從客戶端接收到第一個 FIN。

FIN_WAIT_2 客戶端只是從伺服器接收其第一個 FIN 的確認。

當它傳送自己 FIN LAST_ACK 伺服器處於此狀態。

已關閉的伺服器從客戶端收到 ACK 並關閉連線。

例如,請考慮以下情形:

套接字應用程式已終止,但 Netstat 報告套接字處於 CLOSE_WAIT 狀態。這可能表明客戶端正確關閉 (已傳送 FIN) 的連線,但伺服器仍有開啟的套接字。這可能是一個例項(在所有執行緒或程式) 未關閉套接字的結果。

注: 很正常很長的一段時間內處於 TIME_WAIT 狀態有一個套接字。指定的時間是在 RFC793 中作為兩次最大段生存期 (MSL)。MSL 被指定為 2 分鐘。因此,套接字可能處於 TIME_WAIT 狀態長 4 分鐘。某些系統為 MSL 實施不同的值 (不超過 2 分鐘)。

來自http://support.microsoft.com/kb/137984/zh-cn

不容易啊,終於發完了,5篇文章竟然用了一個上午的時間。有不少內容還不夠細緻,請大家關注老男孩培訓或者老男孩的書籍吧。

本系列博文完整內容共5篇:
第一篇:詳解linux netstat輸出的網路連線狀態資訊
http://oldboy.blog.51cto.com/2561410/1184139
第二篇:庖丁解牛獲取連線狀態數的awk陣列命令
http://oldboy.blog.51cto.com/blog/2561410/1184165
第三篇:awk陣列命令經典生產實戰應用擴充
http://oldboy.blog.51cto.com/blog/2561410/1184177
第四篇:老男孩培訓第八節課前awk考試題案例(門戶面試題解答) 
http://oldboy.blog.51cto.com/2561410/1184206
第五篇:linux生產伺服器有關網路狀態的優化措施(告一段落) 
http://oldboy.blog.51cto.com/2561410/1184228

相關文章