因为自己一直使用自己的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