Ningx High Concurrent求解 - Linux

Ula avatar
By Ula
at 2014-10-17T10:57

Table of Contents

手邊有一台Server, 設備大概是16G, 16 Core CPU,
打算拿來建置一台Backend Web Server(只跑PHP),
套件部分使用Nginx(0.8.6)、PHP-fpm,
希望可以達到每秒鐘併發數在200~500之間,
實際架設後並使用ApacheBench測試(-n10000 -c200)的結果是,
只要當系統的TIME_WAIT達到6000(net.ipv4.tcp_max_tw_buckets)之後,
伺服器的反應開始下降(使用tshark觀察), 並且就卡住了,
最後ab會發出apr_socket_recv: Connection timed out (110)的訊息,
尤其反覆測試後, 在先前的TIME_WAIT釋放之前, Server都會處於非常慢的狀況,
請問有哪些細節是沒有注意到還可以持續優化的嗎?
還是這台機器的等級, 沒有辦法處理這麼高併發的數量?

中間, 有使用ss去觀察TIME_WAIT的timer倒數,
發現每次都是從60秒開始倒數,
請問有辦法降低這個數值嗎?
或者讓Nginx的連接在client關閉後,
直接將該資源回收掉嗎?

目前一直著眼在TIME_WAIT的問題,
是否我思考的方向有錯?

還請有經驗的指點迷津,
感謝.

kernel參數調整如下,
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_mem = 786432 10485760 15728640
net.ipv4.tcp_wmem = 4096 10485760 20971520
net.core.wmem_max = 20971520
net.ipv4.tcp_rmem = 4096 10485760 20971520
net.core.rmem_max = 20971520

/etc/limits.conf調整如下,
* soft nofile 65535
* hard nofile 65535

Ningx的主要相關設定如下,
worker_processes 8;
worker_rlimit_nofile 65535;

events {
use epoll;
worker_connections 51200;
}

PHP-fpm的主要相關設定如下,
backlog = 8192
max_children = 256(static)
rlimit_files = 65535

--
http://www.myspace.com/soundtrack0220

--
Tags: Linux

All Comments

Isabella avatar
By Isabella
at 2014-10-21T04:30
MSL是寫死在kernel的 這值除非重新compile不然調不了
Cara avatar
By Cara
at 2014-10-23T20:37
不過可以調整減輕狀況 net.ipv4.tcp_tw_recycle
net.ipv4.tcp_tw_reuse 這兩個設成 1
Susan avatar
By Susan
at 2014-10-26T20:47
看來已經調整了XD
Mary avatar
By Mary
at 2014-10-30T13:41
然後tcp_max_tw_buckets不該調低
這會讓TIME_WAIT允許數量嚴重不足
Lily avatar
By Lily
at 2014-11-02T23:31
痾... 說錯 tcp_max_tw_buckets 還不夠高
Victoria avatar
By Victoria
at 2014-11-06T11:16
有試著將tcp_max_tw_buckets調整到10000
發現伺服器回應的時間變長了, ab還是無法送完一萬個請求
Genevieve avatar
By Genevieve
at 2014-11-06T23:09
並且發送成功的請求數量降低了
Kristin avatar
By Kristin
at 2014-11-07T10:25
不過我自己-c1000都能正常過-n10000了
Ida avatar
By Ida
at 2014-11-10T21:49
不管kernel還是nginx參數都沒調過...
Kumar avatar
By Kumar
at 2014-11-15T03:02
如果是這樣的話, 會跟軟、硬體防火牆有比較大的關係嗎?
Gilbert avatar
By Gilbert
at 2014-11-17T23:36
已經在網路上查過各式的調整法, 也都實際試過, 一直無解..
Anthony avatar
By Anthony
at 2014-11-21T19:32
手上幾台商用 web 提供大量連線對外方式,一般作法
不是一台撐起全部服務,大多會分散提供大量存取
有考慮虛擬化技術方式分散嗎?高檔 server 不用這個
Tracy avatar
By Tracy
at 2014-11-23T18:25
東西其實 cpu 算是相當閒置沒有被大量利用到
David avatar
By David
at 2014-11-28T17:52
虛擬化之後 os 本身這類網路負荷問題也可以得以舒緩
Annie avatar
By Annie
at 2014-12-03T01:31
願意試看看, kenduest可以提供相關簡易的資訊嗎? 謝謝
Edward Lewis avatar
By Edward Lewis
at 2014-12-03T16:39
你可以網路上爬文一下,目前 linux 都用 kvm 虛擬化技術
ubuntu or rh-based 等 linux 版本網路上都很多資訊
Thomas avatar
By Thomas
at 2014-12-06T20:47
不過後續你要搭配其他方式來 loading balance
跑 bridge 網路架構,透過其他硬體平衡負載器分散存取
Jacob avatar
By Jacob
at 2014-12-07T14:15
或者是 nat 模式你還要搭配 iptables nat 設定功能
Mary avatar
By Mary
at 2014-12-11T21:51
目前是希望可以先將單台伺服器設置好, 才會去做附載平衡
原本以為設備比較好的機器, 應該有辦法負載這麼大的請求
George avatar
By George
at 2014-12-14T21:13
或者是搭配 nginx 的 proxy 方式提供分散到多台虛擬機
這並非是因為你系統的 cpu or memory 多就可以解決問題
Emily avatar
By Emily
at 2014-12-15T02:09
所以才希望試看看, 是否可以單純修改設定就達到一定的成果
Daniel avatar
By Daniel
at 2014-12-18T02:28
目前測試時, 都是使用Virtual Box創建測試機
請問這算是你說的KVM技術嗎?
Susan avatar
By Susan
at 2014-12-21T00:05
virtualbox 是一個 vm 實作的軟體,商業的 server 服務
Zora avatar
By Zora
at 2014-12-23T10:52
沒會去用這個提供實際服務,linux kvm 比較可靠
Valerie avatar
By Valerie
at 2014-12-28T07:57
樓上... 你用iptables nginx都不重要
現在問題是他的kernel就是吃不下那連線數
Cara avatar
By Cara
at 2014-12-31T17:09
後端分散了 負責分散的前端連線問題還是在啊
Ina avatar
By Ina
at 2015-01-01T23:53
問個問題,有沒有想過是 client 端自己的問題
若你測試端都是固定一台機器的話,那 client 端也會導致
Edwina avatar
By Edwina
at 2015-01-06T09:23
因為過多的 TIME_WAIT 會導致無法正常連線存取
Andrew avatar
By Andrew
at 2015-01-08T16:53
至於平衡負載架構,前端是有所謂瓶頸問題,但是
Edith avatar
By Edith
at 2015-01-12T04:50
NAT 那邊是另外一個處理單純自己連線的諭時問題
Eden avatar
By Eden
at 2015-01-14T11:23
分散可以先減低單一台 WEB server 本身 TIME_WAIT 問題
Franklin avatar
By Franklin
at 2015-01-17T08:13
分散還有其他方式,像是 DNS 分散架構
John avatar
By John
at 2015-01-18T21:06
所以 dns balance + l4 balancer + multi server 分散
Cara avatar
By Cara
at 2015-01-20T17:55
不過好像與原貼問題已經沒很直接關係了
Jacob avatar
By Jacob
at 2015-01-23T04:46
這篇另外也討論到相關議題: http://goo.gl/wllY3P
Yedda avatar
By Yedda
at 2015-01-26T14:37
ab 自己要打到那麼高也不是件容易的事

grep檔案裡的特殊字元字串

Victoria avatar
By Victoria
at 2014-10-16T23:02
版友好 有個grep特殊字元的問題想請教 Q: 若想在檔案裡 搜尋特定字串如右 ~!at#$%^andamp;*()_+ {}[]|\:and#34;;and#39;andlt;andgt;?, /AZ 假設有一個隨機檔案data.txt內容是 AA=and#34;XXX223and#34; BB ...

關於多執行緒疑問

Aaliyah avatar
By Aaliyah
at 2014-10-16T14:48
請問一下各位大大, 假設我擁有一台雙核心伺服器, 希望可以充分利用cpu資源, 如果該程式支援multi-process, 我可以啟動至少2個process的方式, 讓兩顆cpu都有充分使用,比較疑惑的是multi-thread, 如果是multi-thread, 在單一process的前提下, 是 ...

JSVM Linux compile error

Skylar Davis avatar
By Skylar Davis
at 2014-10-16T10:25
※ [本文轉錄自 AVEncode 看板 #1KFUvXHs ] 作者: louisman (匈奴將領) 看板: AVEncode 標題: [請問] JSVM Linux compile error 時間: Wed Oct 15 11:47:42 2014 /home/louisman/JSVM/jsvm ...

ssh可對外 但外面卻無法ssh回來 何解

Belly avatar
By Belly
at 2014-10-15T15:31
※ 引述《bmw606042001 (多空雙buff)》之銘言: : 我有台機器最近新灌好 我很常用SSH做設定 : 親自跑到電腦前當然是比較不方便的 : 以前都沒這問題最近卻出現了 : 新灌的那台可以對外SSH(彼此之間都在同個DHCP下) : 192.168.1.XXX都OK : 可是外面要連回去 即使是 ...

在 Mint 17 安裝 Oracle Java 的方法

Kyle avatar
By Kyle
at 2014-10-15T10:08
2014 10 17 補充 : 以下是今天在 1 台 RAM 4G 的電腦上 使用 Live DVD 安裝 Oracle Java 的過程 作業系統 Linux Mint 17 Qiana Cinnamon 32 bit ( Live DVD ) 電腦 RAM 4G 先更新 Mint sudo apt- ...