1. 程式人生 > 其它 >net.core.netdev_max_backlog & net.core.somaxconn

net.core.netdev_max_backlog & net.core.somaxconn

TCPSYN_REVD,ESTABELLISHED狀態對應的佇列

TCP建立連線時要經過3次握手,在客戶端向伺服器發起連線時,對於伺服器而言,一個完整的連線建立過程,伺服器會經歷2種TCP狀態:SYN_REVD,ESTABELLISHED

對應也會維護兩個佇列:

  1. 一個存放SYN的佇列(半連線佇列)
  2. 一個存放已經完成連線的佇列(全連線佇列)

當一個連線的狀態是SYNRECEIVED時,它會被放在SYN佇列中

當它的狀態變為ESTABLISHED時,它會被轉移到另一個佇列。所以後端的應用程式只從已完成的連線的佇列中獲取請求

如果一個伺服器要處理大量網路連線,且併發性比較高,那麼這兩個佇列長度就非常重要了。因為,即使伺服器的硬體配置非常高,伺服器端程式效能很好,但是這兩個佇列非常小,那麼經常會出現客戶端連線不上的現象,因為這兩個佇列一旦滿了後,很容易丟包,或者連線被複位。所以,如果伺服器併發訪問量非常高,那麼這兩個佇列的設定就非常重要了。

Linuxbacklog引數意義

對於Linux而言,基本上任意語言實現的通訊框架或伺服器程式在構造socketserver時,都提供了backlog這個引數,因為在監聽埠時,都會呼叫系統底層API:intlisten(intsockfd,intbacklog);

listen函式中backlog引數的定義如下:

Nowitspecifiesthequeuelengthforcompletelyestablishedsocketswaitingtobeaccepted,insteadofthenumberofincompleteconnectionrequests.Themaximumlengthofthequeueforincompletesocketscanbesetusingthetcp_max_syn_backlogsysctl.Whensyncookiesareenabledthereisnologicalmaximumlengthandthissysctlsettingisignored.IfthesocketisoftypeAF_INET,andthebacklogargumentisgreaterthantheconstantSOMAXCONN(128default),itissilentlytruncatedtoSOMAXCONN.

backlog引數描述的是伺服器端TCPESTABELLISHED狀態對應的全連線佇列長度。

ESTABLISHED列長度如何計算?

如果backlog大於核心引數net.core.somaxconn,則以net.core.somaxconn為準,

即全連線佇列長度=min(backlog,核心引數net.core.somaxconn),net.core.somaxconn預設為128。

這個很好理解,net.core.somaxconn定義了系統級別的全連線佇列最大長度,

backlog只是應用層傳入的引數,不可能超過核心引數,所以backlog必須小於等於net.core.somaxconn。

SYN_RECV佇列長度如何計算?

半連線佇列長度由核心引數tcp_max_syn_backlog決定,

當使用SYNCookie時(就是核心引數net.ipv4.tcp_syncookies=1),這個引數無效,

半連線佇列的最大長度為backlog、核心引數net.core.somaxconn、核心引數tcp_max_syn_backlog的最小值。

即半連線佇列長度=min(backlog,核心引數net.core.somaxconn,核心引數tcp_max_syn_backlog)。

這個公式實際上規定半連線佇列長度不能超過全連線佇列長度,但是tcp_syncooking預設是啟用的,如果按上文的理解,那這個引數設定沒有多大意義

其實,對於Nginx/Tomcat等這種Web伺服器,都提供了backlog引數設定入口,當然它們都會有預設值,通常這個預設值都不會太大(包括核心預設的半連線佇列和全連線佇列長度)。如果應用併發訪問非常高,只增大應用層backlog是沒有意義的,因為可能核心引數關於連線佇列設定的都很小,一定要綜合應用層backlog和核心引數一起看,通過公式很容易調整出正確的設定

以上都是引用文件,官方文件如下

tcp_syncookies-BOOLEAN

OnlyvalidwhenthekernelwascompiledwithCONFIG_SYN_COOKIESSendoutsyncookieswhenthesynbacklogqueueofasocketoverflows.Thisistopreventagainstthecommon'SYNfloodattack'

Default:1

Note,thatsyncookiesisfallbackfacility.ItMUSTNOTbeusedtohelphighlyloadedserverstostandagainstlegalconnectionrate.IfyouseeSYNfloodwarningsinyourlogs,butinvestigationshowsthattheyoccurbecauseofoverloadwithlegalconnections,youshouldtuneanotherparametersuntilthiswarningdisappear.See:tcp_max_syn_backlog,tcp_synack_retries,tcp_abort_on_overflow.

大致的意思,這個引數在請求高峰時,無法判斷是不是合法正常的請求,當檢查到SYN flood時首先排查一下原因。建議使用tcp_max_syn_backlog解除告警資訊

syncookiesseriouslyviolateTCPprotocol,donotallowtouseTCPextensions,canresultinseriousdegradationofsomeservices(f.e.SMTPrelaying),visiblenotbyyou,butyourclientsandrelays,contactingyou.WhileyouseeSYNfloodwarningsinlogsnotbeingreallyflooded,yourserverisseriouslymisconfigured.

Ifyouwanttotestwhicheffectssyncookieshavetoyournetworkconnectionsyoucansetthisknobto2toenableunconditionallygenerationofsyncookies.

引數文獻


https://jaminzhang.github.io/linux/understand-Linux-backlog-and-somaxconn-kernel-arguments/