在压测场景中发现一些问题,需要对 MacOS 系统参数做调优。软硬件配置为:
- MacBook Pro (16-inch, 2019)
- 2.3 GHz 八核Intel Core i9,16G 内存
- macOS Catalina (10.15.7)
影响 server 端并发能力的参数:
参数名 | 默认值 | 建议值 | 说明 |
---|---|---|---|
kern.ipc.somaxconn | 128 | 2048 | 网络队列中,未 accept 的请求的数量上限 |
影响 client 端并发能力的参数:
net.inet.tcp.msl | 15000 | 1000(?) | MSL 长度,主要影响 TIME_WAIT 状态的时长(2*MSL) 我不确定这种修改是否合理;感觉 SO_REUSEADDR 会更合理。 |
net.inet.ip.portrange 段 | 指定了临时端口的范围 |
临时端口的范围对压测会有影响。压测时请求方需要占用临时端口来发请求,发完请求后会进行 TIME_WAIT 状态,此时这个端口是不能被重用的(我还没完全理解 SO_REUSEADDR
的逻辑)。MacOS 上默认可用的临时端口有 16000+ 个,TIME_WAIT 默认要 30s,这会导致压测一段时间后,临时端口所在的连接全部在 TIME_WAIT 状态,无法被重新使用,此时 golang 的 net.Dial()
会 block 直到有连接 TIME_WAIT 结束释放了端口,使得压测性能上不去。这篇 帖子 也有一些描述。
修改参数的方式:
- 临时、对本次启动生效:
sudo sysctl -w kern.ipc.somaxconn=2048
- 在未来永久生效:添加进
/etc/sysctl.conf
查看参数的方式:sysctl -a | grep kern.ipc.somaxconn