**:
如發現系統存在大量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連線數:
檢視tomcat程序啟動了多少個執行緒
linux下檢視apache的請求數
在linux下檢視apache的負載情況,以前也說過,最簡單有有效的方式就是檢視apache server status 如何開啟apache server status點這裡 在沒有開啟apache server status的情況下,或安裝的是其他的web server,比如nginx的時候,下...
JS控制併發請求數量
原理 使用乙個佇列維護所有的請求,然後使用async await或者promise對請求進行控制,當前面的請求完成就從佇列 隊下乙個請求 class limitresquest request reqfn this.requests.push reqfn if this.currentsum thi...
aop統計請求數量 捕獲所有http請求
window.performance.getentries 瀏覽器獲取網頁時,會對網頁中每乙個物件 指令碼檔案 樣式表 檔案等等 發出乙個http請求。而通過window.performance.getentries方法,則可以以陣列形式,返回這些請求的時間統計資訊,每個陣列成員均是乙個perfor...