因為自己一直使用自己的macos筆記本,最近發(fā)現(xiàn)系統(tǒng)開多個瀏覽器情況下,出現(xiàn)部分http和websocket出現(xiàn)類似網(wǎng)絡(luò)斷流的問題,經(jīng)過定位發(fā)現(xiàn),應(yīng)該是macos 內(nèi)核參數(shù)需要優(yōu)化導(dǎo)致的,故將自己的分享出來:
解決mac 在糟糕網(wǎng)絡(luò)下 tcp/http 等連接較高概率超時失敗問題
經(jīng)過定位,應(yīng)該是系統(tǒng)的tcp 和 socket連接數(shù)太小的問題,導(dǎo)致開大量應(yīng)用后會出現(xiàn)該問題
1.增加 max files:
查看:
sysctl -a | grep files
輸出:
kern.maxfiles = 12288
kern.maxfilesperproc = 10240
修改:
#設(shè)置系統(tǒng)最大連接數(shù)從12288到1048600.
sudo sysctl -w kern.maxfiles=1048600
#設(shè)置進程連接數(shù)限制,進程的最大連接數(shù)要小于等于全局連接數(shù)
sudo sysctl -w kern.maxfilesperproc=1048576
2.增加max sockets:
查看
sysctl -a | grep somax
輸出:
kern.ipc.somaxconn: 256
修改:
sudo sysctl -w kern.ipc.somaxconn=4096
3.設(shè)置動態(tài)端口范圍portrange
查看:
sysctl net.inet.ip.portrange
輸出:
net.inet.ip.portrange.first: 49152
net.inet.ip.portrange.last: 65535
說明:Linux動態(tài)端口號默認范圍是32768-65535,也就是說,作為客戶端連接同一個IP和同一個端口號,最多只能建立30000多個連接,而Mac默認只能建立16000個左右的連接。
設(shè)置:
sudo sysctl -w net.inet.ip.portrange.first=32768
說明:設(shè)置動態(tài)分配起點端口號為32768,這樣可以增大客戶端可以建立的連接數(shù)。
4.tcp最大分段壽命
查看:
sysctl net.inet.tcp.msl
輸出:
net.inet.tcp.msl: 30000
說明:最大段壽命*是一個 [TCP] [分段]可以存在于互聯(lián)網(wǎng)系統(tǒng)中的最大時間。它被任意地定義為兩分鐘長。最大段壽命的值用來確定 TIME_WAIT 周期(最大段壽命的兩倍)
設(shè)置:
sudo sysctl -w net.inet.tcp.msl=5000
說明:設(shè)置tcp失敗后回收時間,由默認的30s修改為5秒,一般方便性能測試。
5.設(shè)置ulimit
查看:
ulimit -n
說明:命令顯示當前shell能打開的最大文件數(shù),默認值:256,該值總是小于kern.maxfilesperproc的值,因為一個shell就是一個進程。
修改:
ulimit -n 1048576
6.確保重啟后參數(shù)生效(永久設(shè)置)
6.1按以上的方式設(shè)置參數(shù)有個問題,當系統(tǒng)重啟后,這些參數(shù)又恢復(fù)成了默認值,解決辦法就是把參數(shù)寫到/etc/sysctl.conf文件中,但是,默認macos這個文件是不存在的,所以首先就要創(chuàng)建它:
sudo touch /etc/sysctl.conf
然后把參數(shù)寫到文件里
kern.maxfiles=1048600
kern.maxfilesperproc=1048576
kern.ipc.somaxconn=4096
net.inet.tcp.msl=5000
net.inet.ip.portrange.first=32768
#net.inet.ip.portrange.last=65535
6.2至于ulimit-n的值,可以把ulimit-n1048576 寫到.bashrc中實現(xiàn)自動修改。
vim ~/.bashrc
然后把參數(shù)寫到文件里
ulimit -n 1048576
如果是創(chuàng)建的.bashrc增加權(quán)限:
chmod 777 ~/.bashrc
重啟系統(tǒng)后,查看批量查看結(jié)果
ulimit -n
sysctl kern.maxfiles kern.maxfilesperproc kern.ipc.somaxconn net.inet.tcp.msl net.inet.ip.portrange.first net.inet.ip.portrange.last
6.3 最后修改參數(shù)總結(jié):(臨時設(shè)置)
sudo sysctl -w kern.maxfiles=1048600
sudo sysctl -w kern.maxfilesperproc=1048576
sudo sysctl -w kern.ipc.somaxconn=4096
sudo sysctl -w net.inet.tcp.msl=5000
sudo sysctl -w net.inet.ip.portrange.first=32768
ulimit -n 1048576