解決系統丟包問題

當系統經常出現丟包問題時(ifconfig可以看到),修改rx_ring可以解決這個問題。
sudo /sbin/ethtool -g eth0 | /bin/grep "RX:" | /bin/sed "1q"|/bin/cut -f 3 |xargs /sbin/ethtool -G eth0 rx
[huanglq@hadoop99 ~]$  sudo /sbin/ethtool -g eth0
Password:
Ring parameters for eth0:
Pre-set maximums:
RX:             4096
RX Mini:        0
RX Jumbo:       0
TX:             4096
Current hardware settings:
RX:             4096
RX Mini:        0
RX Jumbo:       0
TX:             256
具體每個rx_ring的slot能放多少數據,看一下網卡驅動:
#define PKT_BUF_SZ     1536    /* Size of each temporary Tx/Rx buffer.*/
一個packet大概1.5K。256個slot大概就是384KB了。
增大這個值會減少丟包,但是會增大網絡延遲(latency),這個是別人的一個測試結果(當然跟測試策略有關了):
Ring size Latency [uS]
32 140
64 171
96 198
128 204
256 (default) 232
512 242
1024 239
2048 301
4096 484 
延遲變大的原因:
觸發網絡軟中斷有兩種方式: 1,定時器;2,隊列達到1/4時,會觸發處理。
附上網絡收發包的過程:

In kernel 2.6 a new mechanis
m has been introduced in the
Linux Kernel (usually referred as NAPI, New Application
Program Interface) which eliminates the backlog queue and
converges to an interrupt-driven mechanism under light
network traffic and to a poll mechanism under high network
traffic.
On receiving the first frame of a bunch, the interrupt
handler, instead of enqueueing the packet descriptors in the
backlog queue, leaves the p
ackets in the rx-ring, puts a
reference to the device in a poll-list attached to the interrupted
CPU and schedules a softirq,
leaving the interrupt reception
disabled.
The softirq handler polls all devices registered in the poll-
list to get packets out from the rx-ring until a configurable
number of packets (known as quota) is reached. If the quota is
reached, and a device has still packets to offer, the device is
put at the end of the poll-list; else, if the device has no more
packets to offer, it is taken off the poll-list and allowed to
interrupt again.
Under low load, when the kernel has enough time to process
a packet before the next one arrives, the system converges
toward an interrupt driven system: the packets/interrupts ratio
is lower and latency is reduced. Under heavy load, the system
takes its time to poll registered devices. Interrupts are allowed
as fast as the system can process them: the packets/interrupts
ratio is larger and latency is increased.

另外sysctl的一些網絡相關設置含義:

/proc/sys/net/ipv4/icmp_timeexceed_rate
這個在traceroute時導致著名的“Solaris middle star”。這個文件控制發送ICMP Time Exceeded消息的比率。


/proc/sys/net/ipv4/igmp_max_memberships
主機上最多有多少個igmp (多播)套接字進行監聽。


/proc/sys/net/ipv4/inet_peer_gc_maxtime
求 助: Add a little explanation about the inet peer storage? Minimum interval between garbage collection passes. This interval is in effect under low (or absent) memory pressure on the pool. Measured in jiffies.


/proc/sys/net/ipv4/inet_peer_gc_mintime
每一遍碎片收集之間的最小時間間隔。當內存壓力比較大的時候,調整這個間隔很有效。以jiffies計。


/proc/sys/net/ipv4/inet_peer_maxttl
entries的最大生存期。在pool沒有內存壓力的情況下(比如,pool中entries的 數量很少的時候),未使用的entries經過一段時間就會過期。以jiffies計。


/proc/sys/net/ipv4/inet_peer_minttl
entries的最小生存期。應該不小於匯聚端分片的生存期。當pool的大小不大於inet_peer_threshold時, 這個最小生存期必須予以保證。以jiffies計。


/proc/sys/net/ipv4/inet_peer_threshold
The approximate size of the INET peer storage. Starting from this threshold entries will be thrown aggressively. This threshold also determines entries' time-to-live and time intervals between garbage collection passes. More entries, less time-to-live, less GC interval.


/proc/sys/net/ipv4/ip_autoconfig
這個文件裏面寫着一個數字,表示主機是否通過RARP、BOOTP、DHCP或 者其它機制取得其IP配置。否則就是0。


/proc/sys/net/ipv4/ip_default_ttl
數據包的生存期。設置爲64是安全的。如果你的網絡規模巨大就提高這個值。不要因爲好玩而這麼做——那樣會產生 有害的路由環路。實際上,在很多情況下你要考慮能否減小這個值。


/proc/sys/net/ipv4/ip_dynaddr/proc/sys/net/ipv4/icmp_destunreach_rate

如果你有一個動態地址的自動撥號接口,就得設置它。當你的自 動撥號接口激活的時候,本地所有沒有收到答覆的TCP套接字會重新綁定到正確的地址上。這可以解決引發撥號的套接字本身無法工 作,重試一次卻可以的問題。


/proc/sys/net/ipv4/ip_forward
內核是否轉發數據包。缺省禁止。


/proc/sys/net/ipv4/ip_local_port_range
用於向外連接的端口範圍。缺省情況下其實很小:1024到4999。


/proc/sys/net/ipv4/ip_no_pmtu_disc
如果你想禁止“沿途MTU發現”就設置它。“沿途MTU發現”是一種技術,可以在傳 輸路徑上檢測出最大可能的MTU值。參見Cookbook一章中關於“沿途MTU發 現”的內容。


/proc/sys/net/ipv4/ipfrag_high_thresh
用 於IP分片匯聚的最大內存用量。分配了這麼多字節的內存後,一旦用盡,分片處理程序就會丟棄分片。When ipfrag_high_thresh bytes of memory is allocated for this purpose, the fragment handler will toss packets until ipfrag_low_thresh is reached.


/proc/sys/net/ipv4/ip_nonlocal_bind
如果你希望你的應用程序能夠綁定到不屬於本地網卡的地址上時,設置這個選項。如果你的機器沒有專線連接(甚至是 動態連接)時非常有用,即使你的連接斷開,你的服務也可以啓動並綁定在一個指定的地址上。


/proc/sys/net/ipv4/ipfrag_low_thresh
用於IP分片匯聚的最小內存用量。


/proc/sys/net/ipv4/ipfrag_time
IP分片在內存中的保留時間(秒數)。


/proc/sys/net/ipv4/tcp_abort_on_overflow
一個布爾類型的標誌,控制着當有很多的連接請求時內核的行爲。啓用的話,如果服務超載,內核將主動地發送RST包。


/proc/sys/net/ipv4/tcp_fin_timeout
如 果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。對端可以出錯並永遠不關 閉連接,甚至意外當機。缺省值是60秒。2.2 內核的通常值是180秒, 你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB服務器,也有因爲大量的死套接字而內存溢出的風險,FIN- WAIT-2的危險性比FIN-WAIT-1要小,因爲它最多隻能吃掉1.5K內 存,但是它們的生存期長些。參見tcp_max_orphans。


/proc/sys/net/ipv4/tcp_keepalive_time
當keepalive起用的時候,TCP發 送keepalive消息的頻度。缺省是2小時。


/proc/sys/net/ipv4/tcp_keepalive_intvl
當探測沒有確認時,重新發送探測的頻度。缺省是75秒。


/proc/sys/net/ipv4/tcp_keepalive_probes
在認定連接失效之前,發送多少個TCP的keepalive探測包。缺省值是9。 這個值乘以tcp_keepalive_intvl之後決定了,一個連接發送了keepalive之 後可以有多少時間沒有迴應。


/proc/sys/net/ipv4/tcp_max_orphans
系 統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被複位 並打印出警告信息。這個限制僅僅是爲了防止簡單的DoS攻擊,你絕對不能過分依靠它或者人爲地減小這個值,更應該增加這個值(如 果增加了內存之後)。This limit exists only to prevent simple DoS attacks, you _must_ not rely on this or lower the limit artificially, but rather increase it (probably, after increasing installed memory), if network conditions require more than default value, and tune network services to linger and kill such states more aggressively. 讓我再次提醒你:每個孤兒套接字最多能夠吃掉你64K不可交換的內存。


/proc/sys/net/ipv4/tcp_orphan_retries
本端試圖關閉TCP連接之前重試多少次。缺省值是7,相當於50秒~16分 鍾(取決於RTO)。如果你的機器是一個重載的WEB服務器,你應該考 慮減低這個值,因爲這樣的套接字會消耗很多重要的資源。參見tcp_max_orphans。


/proc/sys/net/ipv4/tcp_max_syn_backlog
記 錄的那些尚未收到客戶端確認信息的連接請求的最大值。對於有128M內存的系統而言,缺省值是1024, 小內存的系統則是128。如果服務器不堪重負,試 試提高這個值。注意!如果你設置這個值大於1024, 最好同時調整include/net/tcp.h中的TCP_SYNQ_HSIZE,以保證 TCP_SYNQ_HSIZE*16 ≤tcp_max_syn_backlo,然後重新編譯內核。


/proc/sys/net/ipv4/tcp_max_tw_buckets
系 統同時保持timewait套接字的最大數量。如果超過這個數字,time-wait套 接字將立刻被清除並打印警告信息。這個限制僅僅是爲了防止簡單的 DoS攻擊,你絕對不能過分依靠它或者人爲地減小這個值,如 果網絡實際需要大於缺省值,更應該增加這個值(如果增加了內存之後)。


/proc/sys/net/ipv4/tcp_retrans_collapse
爲兼容某些糟糕的打印機設置的“將錯就錯”選項。再次發送時,把數據包增大一些,來避免某些TCP協議棧的BUG。

/proc/sys/net/ipv4/tcp_retries1
在認定出錯並向網絡層提交錯誤報告之前,重試多少次。缺省設置爲RFC規 定的最小值:3,相當於3秒~8分鐘(取決於RIO)。


/proc/sys/net/ipv4/tcp_retries2
在殺死一個活動的TCP連接之前重試多少次。RFC 1122規定這個限制應該長於100秒。 這個值太小了。缺省值是15,相當於13~30分鐘(取決於RIO)。


/proc/sys/net/ipv4/tcp_rfc1337
這個開關可以啓動對於在RFC1337中描述的“tcp的time-wait暗 殺危機”問題的修復。啓用後,內核將丟棄那些發往time-wait狀態TCP套接字的RST包。 卻省爲0。


/proc/sys/net/ipv4/tcp_sack
特別針對丟失的數據包使用選擇性ACK,這樣有助於快速恢復。


/proc/sys/net/ipv4/tcp_stdurg
使用TCP緊急指針的主機需求解釋。因爲絕大多數主機採用BSD解釋,所以如果你在Linux上 打開它,可能會影響它與其它機器的正常通訊。缺省是FALSE。
/proc/sys/net/ipv4/tcp_syn_retries
在內核放棄建立連接之前發送SYN包的數量。


/proc/sys/net/ipv4/tcp_synack_retries
爲了打開對端的連接,內核需要發送一個SYN並附帶一個迴應前面一個SYN的ACK。 也就是所謂三次握手中的第二次握手。這個設置決定了內核放棄連接之前發送SYN+ACK包的數量。


/proc/sys/net/ipv4/tcp_timestamps
時間戳可以避免序列號的卷繞。一個1Gbps的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓內核接受這種“異 常”的數據包。


/proc/sys/net/ipv4/tcp_tw_recycle
能夠更快地回收TIME-WAIT套接字。缺省值是1。除非有技術專家的建議和要 求,否則不應修改。


/proc/sys/net/ipv4/tcp_window_scaling
一般來說TCP/IP允許窗口尺寸達到65535字節。對於速度確實很高的網絡而言 這個值可能還是太小。這個選項允許設置上G字節的窗口大小,有利於在帶寬*延遲很大的環境中使用。
一旦內核認爲它無法發包,就會丟棄這個包,並向發包的主機發送ICMP通知。


/proc/sys/net/ipv4/icmp_echo_ignore_all
根本不要響應echo包。請不要設置爲缺省,它可能在你正被利用成爲DoS攻擊的跳 板時可能有用。
/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts [Useful]
如果你ping子網的子網地址,所有的機器都應該予以迴應。這可能成爲非常好用的拒絕服務攻擊工具。設置爲1來 忽略這些子網廣播消息。
/proc/sys/net/ipv4/icmp_echoreply_rate
設置了向任意主機迴應echo請求的比率。


/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
設置它之後,可以忽略由網絡中的那些聲稱迴應地址是廣播地址的主機生成的ICMP錯誤。


/proc/sys/net/ipv4/icmp_paramprob_rate
一個相對不很明確的ICMP消息,用來回應IP頭或TCP頭 損壞的異常數據包。你可以通過這個文件控制消息的發送比率。



tcp_syn_retries INTEGER
默認值是5
對於一個新建連接,內核要發送多少個 SYN 連接請求才決定放棄。不應該大於255,默認值是5,對 應於180秒左右時間。(對於大負載而物理通信良好的網絡而言,這個值偏高,可 修改爲2.這個值僅僅是針對對外的連接,對進來的連接,是由tcp_retries1 決定的)

tcp_synack_retries :INTEGER
默認值是5
對於遠端的連接請求SYN,內核會發送SYN + ACK數 據報,以確認收到上一個 SYN連接請求包。這是所謂的三次握手( threeway handshake)機 制的第二個步驟。這裏決定內核在放棄連接之前所送出的 SYN+ACK 數目。不應該大於255,默認值是5,對 應於180秒左右時間。(可以根據上面的 tcp_syn_retries 來決定這個值)

tcp_keepalive_time :INTEGER
默認值是7200(2小時)
當keepalive打開的情況下,TCP發送keepalive消 息的頻率。(由於目前網 絡攻擊等因素,造成了利用這個進行的攻擊很頻繁,曾經也有cu的 朋友提到過,說如果2邊建立了連接,然後不發送任何數據或者rst/fin消 息,那麼持續的時間是不是就是2小時,空連接攻擊?tcp_keepalive_time就是預防此情形的.我個人在做nat服務的時候的修 改值爲1800秒)

tcp_keepalive_probes:INTEGER
默認值是9
TCP發送keepalive探測以確定該連接已經斷開的次數。(注意:保持連接僅在SO_KEEPALIVE套 接字選項被打開是才發送.次數默認不需要修改,當然根據情形也可以適當地縮短此值.設 置爲5比 較合適)

tcp_keepalive_intvlINTEGER
默認值爲75
探測消息發送的頻率,乘以tcp_keepalive_probes就得到對於從開始探測以來沒有響應的連接殺 除的時間。默認值爲75秒,也就是沒有活動的連接將在大約11分 鍾以後將被丟棄。(對於 普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類 服務器需要改小該值,15是個比較合適的值)

tcp_retries1 :INTEGER
默認值是3
放棄迴應一個TCP連接請求前﹐需要進行多少次重試。RFC 規定最低的數值是3﹐這也是默認值﹐根據RTO的值大約在3秒 - 8分鐘之間。(注意:這個值同時還決定進入的syn連接)

tcp_retries2 :INTEGER
默認值爲15
在丟棄激活(已建立通訊狀況)的TCP連接之前﹐需要進 行多少次重試。默認值爲15,根據RTO的值來決 定,相當於13-30分鐘(RFC1122規定,必須大於100秒).(這個值根據目前的 網絡設置,可以適當地改小,我的網絡內修改爲了5)

tcp_orphan_retries :INTEGER
默認值是7
在近端丟棄TCP連接之前﹐要進行多少次重試。默認值是7個﹐相當於 50秒 - 16分鐘﹐視 RTO 而 定。如果您的系統是負載很大的web服務器﹐那麼也許需要降低該值﹐這類 sockets 可能會 耗費大量的資源。另外參的考 tcp_max_orphans 。(事實上做NAT的 時候,降低該值也是好處顯著的,我本人的網絡環境中降低該值爲3)

tcp_fin_timeout :INTEGER
默認值是 60
對於本端斷開的socket連接,TCP保持在FIN-WAIT-2狀 態的時間。對方可能會斷開連接或一直不結束連接或不可預料的進程死亡。默認值爲 60 秒。過去在2.2版本的內核中是 180 秒。您可以設置該值﹐但需要注意﹐如果 您的機器爲負載很重的web服務器﹐您可能要冒內存被大量無效數據報填滿的風險﹐FIN-WAIT-2 sockets 的危險性低於 FIN-WAIT-1 ﹐因爲它們最多隻吃 1.5K 的 內存﹐但是它們存在時間更長。另外參考 tcp_max_orphans(事實上做NAT的 時候,降低該值也是好處顯著的,我本人的網絡環境中降低該值爲30)

tcp_max_tw_buckets :INTEGER
默認值是180000
系 統在同時所處理的最大 timewait sockets 數目。如果超過此數的話﹐time-wait socket 會被立即砍除並且顯示警告信息。之所以要設定這個限制﹐純粹爲了抵禦那些簡單的 DoS 攻擊 ﹐千萬不要人爲的降低這個限制﹐不過﹐如果網絡條件需要比默認值更多﹐則可以提高它(或許還要增加內存)。(事實上做NAT的 時候最好可以適當地增加該值)

tcp_tw_recycle :BOOLEAN
默認值是0
打開快速 TIME-WAIT sockets 回收。除非得到技術專家的建議或要求﹐請不要隨意修改這個值。(做NAT的 時候,建議打開它)

 

 

tcp_tw_reuseBOOLEAN
默認值是0
該文件表示是否允許重新應用處於TIME-WAIT狀態的socket用於新的TCP連 接(這個對快速重啓動某 些服務,而啓動後提示端口已經被使用的情形非常有幫助)

tcp_max_orphans :INTEGER
缺省值是8192
系統所能處理不屬於任何進程的TCP sockets最大數量。假如超過這個數量﹐那麼不屬於任何進程的連接會 被立即reset,並同時顯示警告信息。之所以要設定這個限制﹐純粹爲了抵禦那些簡單的 DoS 攻 擊﹐千萬不要依賴這個或是人爲的降低這個限制(這個值Redhat AS版本中設置爲32768,但是很多防火牆修改的時候,建議該值修改爲2000)

tcp_abort_on_overflow :BOOLEAN
缺省值是0
當守護進程太忙而不能接受新的連接,就象對方發送reset消息,默認值是false。 這意味着當溢出的原因是因爲一個偶然的猝發,那麼連接將恢復狀態。只有在你確信守護進程真的不能完成連接請求時纔打開該選項,該選項會影響客戶的使用。(對待已經滿載的sendmail,apache這 類服務的時候,這個可以很快讓客戶端終止連接,可以給予服務程序處理已有連接的緩衝機會,所 以很多防火牆上推薦打開它)

tcp_syncookies :BOOLEAN
默認值是0
只有在內核編譯時選擇了CONFIG_SYNCOOKIES時纔會發生作用。當出現syn等 候隊列出現溢出時象對方發送syncookies。目的是爲了防止syn flood攻擊。
注意:該選項千萬不能用於那些沒有收到攻擊的高負載服務器,如果在日誌中出現synflood消息,但是調查發 現沒有收到synflood攻擊,而是合法用戶的連接負載過高的原因,你應該調整其它參數來提高服務器性能。參考:
tcp_max_syn_backlog
tcp_synack_retries
tcp_abort_on_overflow
syncookie嚴重的違背TCP協議,不允許使用TCP擴 展,可能對某些服務導致嚴重的性能影響(如SMTP轉發)。(注意,該 實現與BSD上面使用的tcp proxy一樣,是違反了RFC中 關於tcp連接的三次握手實現的,但是對於防禦syn-flood的確 很有用.)

tcp_stdurg :BOOLEAN
默認值爲0
使用 TCP urg pointer 字段中的主機請求解釋功能。大部份的主機都使用老舊的 BSD解 釋,因此如果您在 Linux 打開它﹐或會導致不能和它們正確溝通。

 

tcp_max_syn_backlog INTEGER
對於那些依然還未獲得客戶端確認的連接請求﹐需要保存在隊列中最大數目。對於超過 128Mb 內存的系統﹐默 認值是 1024 ﹐低於128Mb 的則爲 128。如果服務器經常出現過載﹐可以嘗試增加這個數 字。警告﹗假如您將此值設爲大於 1024﹐最好修改include/net/tcp.h 裏面的 TCP_SYNQ_HSIZE ﹐以 保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog ﹐並且編進核心之內。(SYN Flood攻擊利用TCP協議散佈握手的缺陷,僞造虛假源IP地 址發送大量TCP-SYN半打開連接到目標系統,最終導致目標系統Socket隊列資源耗 盡而無法接受新的連接。爲了應付這種攻擊,現代Unix系統中普遍採用多連接隊列處理的方式來緩衝(而 不是解決)這種攻擊,是用一個基本隊列處理正常的完 全連接應用(Connect()和Accept() ),是用另一個隊列單獨存放半打開連接。這種雙隊列處理方式和其他一些系統內核措施(例如Syn-Cookies/Caches)聯 合應用時,能夠比較有效的緩解小規模的SYN Flood攻擊(事實證明<1000p/s)加 大SYN隊列長度可以容納更多等待連接的網絡連接數,所以對Server來說可以考慮增大該值.)

tcp_window_scaling :INTEGER
缺省值爲1
該 文件表示設置tcp/ip會話的滑動窗口大小是否可變。參數值爲布爾值,爲1時 表示可變,爲0時表示不可變。tcp/ip通常使用的窗口最大可達到 65535 字 節,對於高速網絡,該值可能太小,這時候如果啓用了該功能,可以使tcp/ip滑動窗口大小增大數個數量級,從而提高數據傳輸 的能力(RFC 1323)。(對普通地百M網 絡而言,關閉會降低開銷,所以如果不是高速網絡,可以考慮設置爲0

tcp_timestamps :BOOLEAN
缺省值爲1
Timestamps 用在其它一些東西中﹐可以防範那些僞造的 sequence 號 碼。一條1G的寬帶線路或許會重遇到帶 out-of-line數值的舊sequence 號碼(假如它是由於上次產生的)。Timestamp 會 讓它知道這是個 '舊封包'。(該文件表示是否啓用以一種比超時重發更精確的方法(RFC 1323)來啓用對 RTT 的計算;爲了實現更好的性能應該啓用這個選項。)

tcp_sack :BOOLEAN
缺省值爲1
使 用 Selective ACK﹐它可以用來查找特定的遺失的數據報--- 因 此有助於快速恢復狀態。該文件表示是否啓用有選擇的應答(Selective Acknowledgment),這可以通過有 選擇地應答亂序接收到的報文來提高性能(這樣可以讓發送者只發送丟失的報文段)。(對於廣域網通信來說這個選項應該啓用,但是這會增加對 CPU 的佔用。)

tcp_fack :BOOLEAN
缺省值爲1
打開FACK擁塞避免和快速重傳功能。(注意,當tcp_sack設 置爲0的時候,這個值即使設置爲1也無效)

tcp_dsack :BOOLEAN
缺省值爲1
允許TCP發送"兩個完全相同"的SACK。

tcp_ecn :BOOLEAN
缺省值爲0
打開TCP的直接擁塞通告功能。

tcp_reordering :INTEGER
默認值是3
TCP流中重排序的數據報最大數量 。 (一般有看到推薦把這個數值略微調整大一些,比如5)

tcp_retrans_collapse :BOOLEAN
缺省值爲1
對於某些有bug的打印機提供針對其bug的兼容性。(一般不需要這個支持,可 以關閉它)

tcp_wmem(3個INTEGER變 量): mindefaultmax
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 (3個INTEGER變 量): mindefaultmax
min:爲TCP socket預留用於接收緩衝的內存數量,即使在內存出現緊張情況下tcp socket都 至少會有這麼多數量的內存用於接收緩衝,默認值爲8K

default:爲TCP socket預留用於接收緩衝的內存數量,默認 情況下該值影響其它協議使用的 net.core.wmem_default 值。該值決定了在tcp_adv_win_scaletcp_app_wintcp_app_win=0默 認值情況下,TCP窗口大小爲65535。默認值爲87380

max:用於TCP socket接收緩衝的內存最大值。該值不會影響 net.core.wmem_max,"靜 態"選擇參數 SO_SNDBUF則不受該值影響。默認值爲 128K。默認值爲87380*2 bytes。(可以看出,.max的設置最好是default的 兩倍,對於NAT來說主要該增加它,我的網絡裏爲 51200 131072 204800)

tcp_mem(3個INTEGER變 量):lowpressurehigh
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 : INTEGER
默認值是31
保留max(window/2^tcp_app_win, mss)數量的窗口由於應用緩衝。當爲0時 表示不需要緩衝。

tcp_adv_win_scale : INTEGER
默認值爲2
計算緩衝開銷bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale <= 0)。

 

tcp_rfc1337 :BOOLEAN
缺省值爲0
這個開關可以啓動對於在RFC1337中 描述的"tcp 的time-wait暗殺危機"問題的修復。啓用後, 內核將丟棄那些發往time-wait狀態TCP套接字的RST 包.

 

tcp_low_latency : BOOLEAN
缺省值爲0
允許 TCP/IP 棧適應在高吞吐量情況下 低延時的情況;這個選項一般情形是的禁用。(但在構建Beowulf 集羣的時候,打開它很有幫助)

 

tcp_westwood :BOOLEAN
缺省值爲0
啓用發送者端的擁塞控制算法,它可以維護對吞吐量的評估,並試圖對帶寬的 整體利用情況進行優化;對於 WAN 通信來說應該啓用這個選項。

 

tcp_bic :BOOLEAN
缺省值爲0
爲快速長距離網絡啓用 Binary Increase Congestion;這樣可以更好地利用以 GB 速度進行操作的鏈接;對於 WAN 通 信應該啓用這個選項。


 

$ /proc/sys/net/core/wmem_max
最大socket寫buffer,可參考的優化 值:873200
$ /proc/sys/net/core/rmem_max
最 大socket讀buffer,可參考的優化值:873200
$ /proc/sys/net/ipv4/tcp_wmem
TCP寫buffer,可參考的優化值: 8192 436600 873200
$ /proc/sys/net/ipv4/tcp_rmem
TCP 讀buffer,可參考的優化值: 32768 436600 873200
$ /proc/sys/net/ipv4/tcp_mem
同樣有3個值,意思是:
net.ipv4.tcp_mem[0]: 低於此值,TCP沒有內存壓力.
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段.
net.ipv4.tcp_mem[2]: 高於此值,TCP拒絕分配socket.
上述內存單位是頁,而不是字節.可參考的優化值是:786432 1048576 1572864
$ /proc/sys/net/core/netdev_max_backlog
進 入包的最大設備隊列.默認是300,對重負載服務器而言,該值太低,可調整到1000.
$ /proc/sys/net/core/somaxconn
listen()的默認參數,掛起請求的最大數量. 默認是128.對繁忙的服務器,增加該值有助於網絡性能.可調整到256.
$ /proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默認10K.
$ /proc/sys/net/ipv4/tcp_max_syn_backlog
進入SYN包的最大請求隊列. 默認1024.對重負載服務器,增加該值顯然有好處.可調整到2048.
$ /proc/sys/net/ipv4/tcp_retries2
TCP失敗重傳次數,默認值15,意味着重傳 15次才徹底放棄.可減少到5,以儘早釋放內核資源.
$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes
這3個參數與TCP KeepAlive有關.默認值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某個TCP連接在idle 2個小時後,內核才發起probe.如果probe 9次(每次75秒)不成功,內核才徹底放棄,認爲該連接已失效.對服務器而言,顯然上述值太大. 可調整到:
/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
指 定端口範圍的一個配置,默認是32768 61000,已夠大.
 
net.ipv4.tcp_syncookies = 1
表 示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN攻擊,默認爲0,表示關閉;
net.ipv4.tcp_tw_reuse = 1
表示開啓重用。允許將 TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;
net.ipv4.tcp_tw_recycle = 1
表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。
net.ipv4.tcp_fin_timeout = 30
表示如果套接字 由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_keepalive_time = 1200
表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時, 改爲20分鐘。
net.ipv4.ip_local_port_range = 1024 65000
表 示用於向外連接的端口範圍。缺省情況下很小:32768到61000,改爲1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192
表示SYN隊列的長度,默認爲1024,加大隊列長度爲8192,可以容納更多等待連接的網絡連 接數。
net.ipv4.tcp_max_tw_buckets = 5000
表 示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。默認爲180000,改爲 5000。對於Apache、Nginx等服務器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參數 可以控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。



tcp_low_latency

You can verify the Receive Interrupt Timer value using these commands:



Default value, Low Latency Option value = off:

nokia[admin]# ipsctl -a net:dev:adp | grep timeout

net:dev:adp:ipsctl:slot:2:fifo:0:rxintr_timeout = 128

net:dev:adp:ipsctl:slot:2:fifo:2:rxintr_timeout = 128

net:dev:adp:ipsctl:slot:1:fifo:0:rxintr_timeout = 128

net:dev:adp:ipsctl:slot:1:fifo:2:rxintr_timeout = 128


Low Latency Option value = on:


nokia[admin]# ipsctl -a net:dev:adp | grep timeout

net:dev:adp:ipsctl:slot:2:fifo:0:rxintr_timeout = 32

net:dev:adp:ipsctl:slot:2:fifo:2:rxintr_timeout = 32

net:dev:adp:ipsctl:slot:1:fifo:0:rxintr_timeout = 32

net:dev:adp:ipsctl:slot:1:fifo:2:rxintr_timeout = 32


發佈了277 篇原創文章 · 獲贊 11 · 訪問量 88萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章