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