在大并發(fā)的服務(wù)器上, Linux 的網(wǎng)絡(luò)部分內(nèi)核參數(shù)有必要進(jìn)行調(diào)優(yōu)已得到最優(yōu)化的性能.
比較關(guān)鍵的參數(shù)指標(biāo)
/proc/sys/fs/file-max: 整個(gè)系統(tǒng)最大可以打開的文件描述符數(shù)量. 文件描述符打開的最大數(shù)量也決定了服務(wù)器的最大連接數(shù)./proc/sys/net/ipv4/tcp_max_syn_backlog: 指定TCP連接創(chuàng)建過程中, 已經(jīng)完成第一次握手但是未完成第三次握手的隊(duì)列長(zhǎng)度. 意味著允許客戶端和服務(wù)器端 同時(shí) 進(jìn)行三次握手的隊(duì)列長(zhǎng)度. 這個(gè)就是 TCP 的Syn隊(duì)列(待完成連接隊(duì)列). 如果這個(gè)隊(duì)列已經(jīng)滿了. 服務(wù)器就不能再接受請(qǐng)求了.
已經(jīng)完成三次握手的連接會(huì)放入另外一個(gè)隊(duì)列進(jìn)進(jìn)行維護(hù), 也就是和
Syn隊(duì)列對(duì)應(yīng)的Accept隊(duì)列(已完成連接隊(duì)列), 這個(gè)隊(duì)列長(zhǎng)度通常由backlog參數(shù)控制. 但是系統(tǒng)也參考SOMAXCONN值, 取他們2個(gè)的最小值為Accept隊(duì)列長(zhǎng)度.
/proc/sys/net/ipv4/tcp_syncookies: 如果為了擴(kuò)大并發(fā), 一味的把tcp_max_syn_backlog值調(diào)大, 容易受到syn flood攻擊. 新版的 Kernel 有些改變, 設(shè)置tcp_syncookies=1后, 系統(tǒng)會(huì)默認(rèn)tcp_max_syn_backlog無限大./proc/sys/net/core/somaxconn: TCPAccept隊(duì)列的長(zhǎng)度的默認(rèn)參考值, 如果要支持大并發(fā), 這個(gè)值要調(diào)高. 能同時(shí)完成握手和服務(wù)器建立連接的隊(duì)列長(zhǎng)度越大, 那么表示同時(shí)的并發(fā)值越大.ulimit: Linux 通常默認(rèn)的每個(gè)用戶的最大進(jìn)程數(shù)和文件數(shù)為1024. 大并發(fā)優(yōu)化必調(diào)參數(shù).
優(yōu)化操作
- 修改系統(tǒng)
ulimit限制:
修改/etc/security/limits.conf文件, 添加下面幾行:
# 最大文件打開數(shù)
* soft nofile 32768
* hard nofile 65535
重啟生效
- 修改系統(tǒng)
SOMAXCONN+tcp_syncookies:
修改/etc/sysctl.conf文件, 修改net.ipv4.tcp_syncookies和net.core.somaxconn2個(gè)配置值.
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
使用配置生效:
leo@Redis:/etc$ sudo sysctl -p
- 調(diào)高部署服務(wù)的 listen backlog 值.