You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacBook如何提升开放连接限制?k6发起30K+请求遇EOF错误求助

在MacBook上用k6稳定发起10K+甚至30K+请求的配置方案

一、修复ulimit设置不生效的问题

Mac的文件描述符限制分系统硬限制和用户软限制,直接执行ulimit -n 1000000只会临时修改当前终端的软限制,且不能超过系统硬限制,重启后失效。要彻底生效需按以下步骤操作:

  1. 查看当前限制
    执行以下命令确认当前软硬限制:

    ulimit -Sn  # 查看软限制(当前用户可立即修改的上限)
    ulimit -Hn  # 查看硬限制(系统级别的最大上限)
    
  2. 修改系统级文件描述符限制
    创建或编辑/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立即生效。

  3. 持久化用户级限制
    编辑你的shell配置文件(比如~/.zshrc或~/.bashrc),添加:

    ulimit -n 1000000
    

    执行source ~/.zshrc(对应你的shell)使配置立即生效。

二、优化k6自身配置

系统限制放开后,还需调整k6的参数避免自身瓶颈:

  1. 核心并发参数配置
    在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握手开销
      },
    };
    
  2. 脚本层面优化

    • 避免在VU函数中创建不必要的资源(比如重复初始化HTTP客户端)
    • 复用连接池:k6默认会复用连接,不要手动关闭连接
    • 如果是多目标请求,分散请求到不同主机,避免单主机连接数被服务器限制

三、排查EOF错误的根源

当请求到5.5K+出现EOF错误,不一定是本地限制,可能是以下原因:

  1. 服务器端限制
    目标服务器可能设置了单IP连接上限、请求速率限制,此时本地再调参数也没用。可通过测试不同IP的请求情况,或联系服务器运维调整限制。

  2. 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使配置立即生效,重启后永久生效。

  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:04:51