讓Jexus支援高併發請求的優化技巧

2021-09-25 14:56:16 字數 3579 閱讀 7879

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 所維護的 儲存大量檔案描述符的資料結構 隨著檔案描述符數量的增長,其在使用者態和核心的位址空間的複製所引發的開銷也會線性增長 由於網...