【发布时间】:2016-01-21 13:58:34
【问题描述】:
在对虚拟 RESTful 服务进行性能测试时,我遇到了 ConnectException: Cannot assign requested address 问题,描述为 here 或 here,并应用了 tuning recommendations - 将临时端口范围增加到 10000-65000,我的 @987654328 @ 是 64000,我什至启用了 net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_tw_recycle - 有关这些的更多信息,请参阅这篇出色的博文 Coping with the TCP TIME-WAIT state on busy Linux servers 。
这仍然没有帮助,我仍然可以每秒最多模拟 10k 个请求(因为在我的测试中每个用户只做一个请求),所以我有 scaled out 到 4 台和后来的 8 台客户端机器。在 4 台机器上,我每台机器可以执行 5k 请求/秒(总共 20k),但在 8 台机器上我什至无法在这 5k 上运行,所以问题可能出在其他地方。
不过,我想问一下是否有任何选项可以在 gatling 连接上设置 SocketOptions,无论是通过模拟还是通过 gatling.conf - 我想在那里使用 SO_REUSEADDR。 gatling.conf中可以设置一些选项(连接超时),但是我没有找到这个。
另外,是否有任何文档描述 Gatling 如何共享连接?我希望“用户”获取他们的连接实例或虚拟每个用户打开他的连接的大连接池,但在某处我读到每个用户都有一个连接池(他与谁共享连接,那么?还是这些只是在他之前的请求中使用的缓存连接?)。
编辑: 所以最终解决方案很简单:在设置ScenarioBuilder.protocols(...) 时使用.shareConnections。我尝试使用 -Dgatling.core.http.shareConnections 作为命令行参数(我正在从 maven 插件运行测试)但它不起作用;程序化方法做到了。
【问题讨论】:
-
还有一点需要注意:即使使用
net.ipv4.tcp_tw_reuse,我仍然可以在ss -iat中看到很多time_wait 连接,鉴于这些错误,我不确定它是否应用正确。很遗憾,我无法在不丢失配置的情况下重新启动整个服务器 - 我应该重新启动任何特定服务吗? -
哦,谢谢@Radim Vansa!设置
.shareConnections为我解决了这个问题。没有它,我每秒无法处理超过 500 个请求。将它与ulimit -n 64000一起使用就可以了。
标签: sockets tcp gatling time-wait