如何解决负载测试产生的“socket: too many open files”

2021-11-11 18:02:04 +08:00
 JasonLaw

我使用k6进行负载测试,运行的命令为k6 run --stage 5s:250 script.js,script.js 的内容如下:

import { check } from 'k6';
import http from "k6/http";

export default function main(token) {
    let res = http.get(
        "https://{domain}/schedules"
    );

    check(res, {
        'is status 200': (r) => r.status === 200
    });
}

但是输出出现了大量的socket: too many open files,如下图所示:

服务是基于 Spring Boot 的,使用 Nginx 作为 reverse proxy 。要怎么解决“socket: too many open files”这个问题呢?

我尝试过按照ck :: Nginx socket() failed (24: Too many open files)进行修改,但是没有效果。

1928 次点击
所在节点    程序员
11 条回复
aladdinding
2021-11-11 18:13:30 +08:00
ulimit ?
JasonLaw
2021-11-11 18:29:27 +08:00
@aladdinding #1 我尝试过按照 https://stackoverflow.com/a/27849503/5232255 进行修改,然后 restart Nginx ,还是不行。
ysc3839
2021-11-11 18:50:51 +08:00
你这是测试程序的问题吧?不是 nginx 的问题。
Citrus
2021-11-11 18:55:31 +08:00
macOS 终端默认的 ulimit 好像是 256 哦,你改了么?

顺便想问下这是什么压测工具,看起来挺好用的
Citrus
2021-11-11 18:56:32 +08:00
@Citrus 忽略,看到了,原来工具框架就叫 K6 。刚好跟我知道的一个东西重名了。
setsunakute
2021-11-11 18:57:45 +08:00
看截图是你本机报的这个错误, 不是服务端报的, 所以要改你的 mac 的 ulimit
JasonLaw
2021-11-11 18:59:01 +08:00
@ysc3839 #3
@Citrus #4

好像是😅,有时候还是没有想到太多东西,怪不得 Nginx 的 error.log 没有相关的日志。我晚点处理一下看看。
ch2
2021-11-11 19:02:49 +08:00
压测机本身也得调参数
TripleZ
2021-11-11 19:21:24 +08:00
调整测试机的 ulimit nofile 的参数就行。
JasonLaw
2021-11-12 09:53:41 +08:00
@ysc3839 #3
@Citrus #4
@setsunakute #6
@ch2 #8
@TripleZ #9

按照 https://apple.stackexchange.com/a/312010/362633 进行修改,问题解决了。
julyclyde
2021-11-12 15:21:26 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/814749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX