1、如何查看該參數值
1)查看所有內核參數及值
sysctl -a # 查看所有內核參數及值
2)查看net.core.somaxconn參數
[root@localhost ]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 128
or
[root@localhost ]# cat /proc/sys/net/core/somaxconn
128
該參數值默認是128
2、如何修改該參數值
1)立即生效
sysctl -w net.core.somaxconn=1024
1
[root@localhost ]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 128
[root@localhost ]# sysctl -w net.core.somaxconn=1024
net.core.somaxconn = 1024
[root@localhost ]# sysctl -a | grep net.core.somaxconn
net.core.somaxconn = 1024
該方法在重啟系統之后會失效,參數值重新恢復成最初的128
2)永久生效
在/etc/sysctl.conf文件中新增一行 net.core.somaxconn=1024;執行sysctl -p
# vim /etc/sysctl.conf
net.core.somaxconn=1024
# sysctl -p -p選項使sysctl.conf配置文件生效
3、net.core.somaxconn 介紹
1)概念介紹
對於一個TCP鏈接,Server與Client需要通過三次握手來建立網絡鏈接,當三次握手成功之后,我們就可以看到端口狀態由LISTEN轉為ESTABLISHED,接着這條鏈路上就可以開始傳送數據了
net.core.somaxconn是Linux中的一個內核(kernel)參數,表示socket監聽(listen)的backlog上限。
什么是backlog?backlog就是 socket的監聽隊列,當一個請求(request)尚未被處理或者建立時,它就會進入backlog。
而socket server可以一次性處理backlog中的所有請求,處理后的請求不再位於監聽隊列中。
當Server處理請求較慢時,導致監聽隊列被填滿后,新來的請求就會被拒絕。
backlog參數主要用於底層方法int listen(int sockfd, int backlog), 在解釋backlog參數之前,我們先了解下tcp在內核的請求過程,其實就是tcp的三次握手:

client發送SYN到server,將狀態修改為SYN_SEND,如果server收到請求,則將狀態修改為SYN_RCVD,並把該請求放到syns queue隊列中。server回復SYN+ACK給client,如果client收到請求,則將狀態修改為ESTABLISHED,並發送ACK給server。server收到ACK,將狀態修改為ESTABLISHED,並把該請求從syns queue中放到accept queue。
在linux系統內核中維護了兩個隊列:syns queue和accept queue
syns queue
用於保存半連接狀態的請求,其大小通過/proc/sys/net/ipv4/tcp_max_syn_backlog指定,一般默認值是512,不過這個設置有效的前提是系統的syncookies功能被禁用。互聯網常見的TCP SYN FLOOD惡意DOS攻擊方式就是建立大量的半連接狀態的請求,然后丟棄,導致syns queue不能保存其它正常的請求。
accept queue
用於保存全連接狀態的請求,其大小通過/proc/sys/net/core/somaxconn指定,在使用listen函數時,內核會根據傳入的backlog參數與系統參數somaxconn,取二者的較小值。
如果accpet queue隊列滿了,server將發送一個ECONNREFUSED錯誤信息Connection refused到client。
2)補充
Linux系統中,該參數的值默認是128
如果Linux系統中部署了經常處理新請求(request)的高負載的服務,那么顯然這個值是需要增加到更合適的值的
參考
https://www.cnxct.com/something-about-phpfpm-s-backlog/
https://blog.csdn.net/whatday/article/details/107740002
https://www.cnblogs.com/leezhxing/p/5329786.html
