檢視 併發請求數及其TCP連線狀態

2021-08-27 20:03:33 字數 2457 閱讀 6857

如發現系統存在大量time_wait狀態的連線,通過調整核心引數解決,

vim /etc/sysctl.conf

編輯檔案,加入以下內容:

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 30

然後執行 /sbin/sysctl -p 讓引數生效。

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 修改系統預設的 timeout 時間

下面附上time_wait狀態的意義:

客戶端與伺服器端建立tcp/ip連線後關閉socket後,伺服器端連線的埠

狀態為time_wait

是不是所有執行主動關閉的socket都會進入time_wait狀態呢?

有沒有什麼情況使主動關閉的socket直接進入closed狀態呢?

主動關閉的一方在傳送最後乙個 ack 後

就會進入 time_wait 狀態 停留2msl(max segment lifetime)時間

這個是tcp/ip必不可少的,也就是「解決」不了的。

也就是tcp/ip設計者本來是這麼設計的

主要有兩個原因

1。防止上一次連線中的包,迷路後重新出現,影響新連線

(經過2msl,上一次連線中所有的重複包都會消失)

2。可靠的關閉tcp連線

在主動關閉方傳送的最後乙個 ack(fin) ,有可能丟失,這時被動方會重新發

fin, 如果這時主動方處於 closed 狀態 ,就會響應 rst 而不是 ack。所以

主動方要處於 time_wait 狀態,而不能是 closed 。

time_wait 並不會占用很大資源的,除非受到攻擊。

還有,如果一方 send 或 recv 超時,就會直接進入 closed 狀態

2.要加到多少?

連線數理論上當然是支援越大越好,但要在伺服器的能力範圍內,這跟伺服器的cpu、記憶體、頻寬等都有關係。

檢視當前的連線數可以用:

或:pgrep httpd|wc -l

計算httpd占用記憶體的平均數:

由於基本都是靜態頁面,cpu消耗很低,每程序占用記憶體也不算多,大約200k。

伺服器記憶體有2g,除去常規啟動的服務大約需要500m(保守估計),還剩1.5g可用,那麼理論上可以支援1.5*1024*1024*1024/200000 = 8053.06368

約8k個程序,支援2w人同時訪問應該是沒有問題的(能保證其中8k的人訪問很快,其他的可能需要等待1、2秒才能連上,而一旦連上就會很流暢)

控制最大連線數的maxclients ,因此可以嘗試配置為:

startservers 5

minspareservers 5

maxspareservers 10

serverlimit 5500

maxclients 5000

maxrequestsperchild 100

注意,maxclients預設最大為250,若要超過這個值就要顯式設定serverlimit,且serverlimit要放在maxclients之前,值要不小於maxclients,不然重啟httpd時會有提示。

重啟httpd後,通過反覆執行pgrep httpd|wc -l 來觀察連線數,可以看到連線數在達到maxclients的設值後不再增加,但此時訪問**也很流暢,那就不用貪心再設定更高的值了,不然以後如果**訪問突增不小心就會耗光伺服器記憶體,可根據以後訪問壓力趨勢及記憶體的占用變化再逐漸調整,直到找到乙個最優的設定值。

(maxrequestsperchild不能設定為0,可能會因記憶體洩露導致伺服器崩潰)

更佳最大值計算的公式:

apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2

apache_max_process = apache_max_process_with_good_perfermance * 1.5

附:實時檢測httpd連線數:

檢視http的併發請求數及其TCP連線狀態

統計80埠的連線資料 netstat nat grep i 80 wc l 統計httpd協議連線數 統計已連線的,狀態為establish的 netstat na greo establish wc l 查出那個ip連線最多,並將其封掉 netstat na grep establish awk ...

檢視Apache併發請求數及其TCP連線狀態

prefork mpm startservers number of server processes to start minspareservers minimum number of server processes which are kept spare maxspareservers m...

檢視Apache併發請求數及其TCP連線狀態

這兩天搭建了一組apache伺服器,每台伺服器4g記憶體,採用的是prefork模式,一開始設定的連線數太少了,需要較長的時間去響應使用者的請求,後來修改了一下apache 2.0.59的配置檔案httpd.conf 引用 prefork mpm startservers number of ser...