MacOS: Performance Tuning

 6th May 2021 at 2:55pm

在压测场景中发现一些问题,需要对 MacOS 系统参数做调优。软硬件配置为:

  • MacBook Pro (16-inch, 2019)
  • 2.3 GHz 八核Intel Core i9,16G 内存
  • macOS Catalina (10.15.7)

影响 server 端并发能力的参数:

参数名默认值建议值说明
kern.ipc.somaxconn1282048网络队列中,未 accept 的请求的数量上限

影响 client 端并发能力的参数:

net.inet.tcp.msl150001000(?)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