MacBook如何提升开放连接限制?k6发起30K+请求遇EOF错误求助
一、修复ulimit设置不生效的问题
Mac的文件描述符限制分系统硬限制和用户软限制,直接执行ulimit -n 1000000只会临时修改当前终端的软限制,且不能超过系统硬限制,重启后失效。要彻底生效需按以下步骤操作:
查看当前限制
执行以下命令确认当前软硬限制:ulimit -Sn # 查看软限制(当前用户可立即修改的上限) ulimit -Hn # 查看硬限制(系统级别的最大上限)修改系统级文件描述符限制
创建或编辑/Library/LaunchDaemons/limit.maxfiles.plist文件,写入以下内容:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>limit.maxfiles</string> <key>ProgramArguments</key> <array> <string>launchctl</string> <string>limit</string> <string>maxfiles</string> <string>1000000</string> <string>1000000</string> </array> <key>RunAtLoad</key> <true/> <key>ServiceIPC</key> <false/> </dict> </plist>然后设置文件权限并加载配置:
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist重启系统后生效,也可临时执行
sudo launchctl limit maxfiles 1000000 1000000立即生效。持久化用户级限制
编辑你的shell配置文件(比如~/.zshrc或~/.bashrc),添加:ulimit -n 1000000执行
source ~/.zshrc(对应你的shell)使配置立即生效。
二、优化k6自身配置
系统限制放开后,还需调整k6的参数避免自身瓶颈:
核心并发参数配置
在k6脚本的options中添加以下配置,根据硬件和服务器情况调整:export const options = { vus: 1000, // 虚拟用户数,可逐步提升至2000-3000 duration: '30s', rps: 12000, // 每秒请求数,控制发起速率避免瞬间过载 maxRedirects: 0, // 无需重定向时关闭,减少资源消耗 batch: 50, // 每个VU单次批量发起的请求数 batchPerHost: 20, // 单主机的批量请求上限,避免触发服务器限流 http: { maxOpenRequests: 15000, // 最大并发打开的请求数 idleTimeout: '1s', // 空闲连接超时,快速释放资源 http2: true, // 开启HTTP/2,复用连接减少TCP握手开销 }, };脚本层面优化
- 避免在VU函数中创建不必要的资源(比如重复初始化HTTP客户端)
- 复用连接池:k6默认会复用连接,不要手动关闭连接
- 如果是多目标请求,分散请求到不同主机,避免单主机连接数被服务器限制
三、排查EOF错误的根源
当请求到5.5K+出现EOF错误,不一定是本地限制,可能是以下原因:
服务器端限制
目标服务器可能设置了单IP连接上限、请求速率限制,此时本地再调参数也没用。可通过测试不同IP的请求情况,或联系服务器运维调整限制。TCP连接资源耗尽
大量短连接关闭后会进入TIME_WAIT状态,占用本地端口。修改Mac的TCP参数优化:
创建或编辑/etc/sysctl.conf文件,添加:net.inet.tcp.msl=1000 # 缩短TCP连接的TIME_WAIT时长(默认60000ms) net.inet.tcp.finwait2_timeout=1500 # 缩短FIN_WAIT_2状态时长 net.inet.tcp.maxconn=100000 # 系统最大TCP连接数执行
sudo sysctl -p使配置立即生效,重启后永久生效。k6日志排查
执行k6 run --verbose your-script.js查看详细错误日志,确认EOF是本地连接失败还是服务器主动关闭连接。
四、确保10K+稳定请求的最低配置
如果30K请求受限于硬件或服务器端,至少10K请求可通过以下配置稳定实现:
- 系统文件描述符软/硬限制调至20000以上
- k6的
maxOpenRequests设为12000,vus设为800,rps设为10000 - 开启HTTP/2连接复用,关闭重定向
- 调整TCP TIME_WAIT参数至1000ms
内容的提问来源于stack exchange,提问作者Habaek

