jexus web server 5.1 每個工作程序的最大併發數固定為1萬,最多可以同時開啟4個工作程序,因此,每台jexus v5.1伺服器最多可以到支援4萬個併發連線。但是,按照linux系統的預設設定,linux是不能支援這麼高的併發請求的,只有對linux進行一些必要的優化,才能達到讓jexus支援大併發的目的。
一、調整檔案描述符數量限制
linux預設檔案描述符只有1024個,對於jexus 等一些服務來說,在大負載的情況下這點檔案描述符是遠遠不夠的,因為jexus 的工作方式,檔案描述符的限制可能會極大的影響效能。當jexus用完所有的檔案描述符後,它不能接收使用者新的連線。也就是說,用完檔案描述符導致拒絕服務。直到一部分當前請求完成,相應的檔案和socket 被關閉,jexus 不能接收新請求,這樣就要擴大linux的檔案描述符了。
limits.conf 檔案實際是 linux pam(插入式認證模組,pluggable authentication modules)中 pam_limits.so 的配置檔案,而且只針對於單個會話。
limits.conf的格式如下:
username|@groupname type resource limit
username|@groupname:設定需要被限制的使用者名稱,組名前面加@和使用者名稱區別。也可以用萬用字元*來做所有使用者的限制。
type:有 soft,hard 和 -,soft 指的是當前系統生效的設定值。hard 表明系統中所能設定的最大值。soft 的限制不能比hard 限制高。用 - 就表明同時設定了 soft 和 hard 的值。
resource:
core - 限制核心檔案的大小
date - 最大資料大小
fsize - 最大檔案大小
memlock - 最大鎖定記憶體位址空間
nofile - 開啟檔案的最大數目
rss - 最大持久設定大小
stack - 最大棧大小
cpu - 以分鐘為單位的最多 cpu 時間
noproc - 程序的最大數目
as - 位址空間限制
maxlogins - 此使用者允許登入的最大數目
要使 limits.conf 檔案配置生效,必須要確保 pam_limits.so 檔案被加入到啟動檔案中。檢視 /etc/pam.d/login 檔案中有:
session required /lib/security/pam_limits.so
二、調整網路引數
sysctl是乙個允許您改變正在執行中的linux系統的介面。它包含一些 tcp/ip 堆疊和虛擬記憶體系統的高階選項, 這可以讓有經驗的管理員提高系統效能。用sysctl可以讀取設定超過五百個系統變數。
檢視所有可讀變數:
% sysctl -a
讀乙個指定的變數,例如 kern.maxproc:
% sysctl kern.maxproc kern.maxproc: 1044
要設定乙個指定的變數,直接用 variable=value 這樣的語法:
# sysctl kern.maxfiles=5000
kern.maxfiles: 2088 -> 5000
您可以使用sysctl修改系統變數,也可以通過編輯sysctl.conf檔案來修改系統變數。sysctl.conf 看起來很像 rc.conf。它用 variable=value 的形式來設定值。指定的值在系統進入多使用者模式之後被設定。並不是所有的變數都可以在這個模式下設定。
sysctl 變數的設定通常是字串、數字或者布林型。 (布林型用 1 來表示』yes』,用 0 來表示』no』)。
編輯「/etc/sysctl.conf」,更改或新增如下內容:
net.core.somaxconn=8192
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=1200
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.tcp_max_tw_buckets=10000
如果啟用了iptables防火牆並載入了ip_conntrack模組,還需加入:
net.ipv4.ip_conntrack_max = 10240
注:ubuntu是「net.ipv4.netfilter.ip_conntrack_max」。
上述引數修改完成後,請用"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 = 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_tw_buckets = 10000
#表示系統同時保持time_wait套接字的最大數量,如果超過這個數字,
#time_wait套接字將立刻被清除並列印警告資訊。預設為180000,改為10000 。
#對於apache、nginx、jexus 等伺服器,上幾行的引數可以很好地減少time_wait套接字數量
三、整調jexus工作程序數
jexus預設工作程序數為1,為了支援更大的併發數量,應根據伺服器cpu核心數量及記憶體大小,合理調整工作程序數量。方法是,編輯 jws.conf,去掉「httpd.processes」項前邊的「#」號,把程序數填寫到等號右邊(jexus v5.1版最大值不超過4)。
注: 1)程序數與cpu的總核數有關,建議8核以內設為2,16核設為3,更多核心數就設為4。
2)程序數還與服務記憶體及web應用所佔記憶體的多少有關,建議每個工作程序平均記憶體可用量不低於512m。
四、mono版本選擇
建議使用mono最新的成熟版本。
高併發場景下的請求合併
一.在專案中,我們經常用到如下方式進行介面呼叫 有多少請求訪問,就會呼叫多少次第三方介面或資料庫,這樣的情況在高併發場景下很容易出現執行緒被打滿,返回結果慢。為了優化這個介面,後台可以將相同的請求進行合併,然後呼叫批量的查詢介面。請求合併 下面上 已查詢資料庫舉例 1.建立請求類 data buil...
Nginx支援比Apache高併發的原因
1.先從各自使用的多路復用io模型說起 select模型 apache使用,由於受模組等限制,用的不多 單個程序能夠 監視的檔案描述符的數量存在最大限制 select 所維護的 儲存大量檔案描述符的資料結構 隨著檔案描述符數量的增長,其在使用者態和核心的位址空間的複製所引發的開銷也會線性增長 由於網...
Nginx支援比Apache高併發的原因
1.先從各自使用的多路復用io模型說起 select模型 apache使用,由於受模組等限制,用的不多 單個程序能夠 監視的檔案描述符的數量存在最大限制 select 所維護的 儲存大量檔案描述符的資料結構 隨著檔案描述符數量的增長,其在使用者態和核心的位址空間的複製所引發的開銷也會線性增長 由於網...