我在压力测试方面完全是新手,只是提一下。
一些了解项目的信息,而不是问题本身: 我在 nextjs14 中有 webapp。客户要求能够支持 400-500 个并发用户连接并使用它。 该应用程序还设计为实时的。每个用户同一页面上的所有数据都必须自动更新。我在这部分使用 websockets,向连接的客户端发送信号以获取新数据。因此,在最坏的情况下,如果所有用户连接到同一页面,服务器必须同时完成 500 个请求。
因此,我设置了一个jmeter测试来模拟用户首次登录,获取必要的数据。
测试如下:
我将测试设置为 400 个用户,启动时间为 10 秒。并以两种方式进行测试。一次循环,然后 50 次循环。
问题即将结束:
如果我运行测试一次,一切正常。如果我运行循环 50 次,那么无论我在 JMeter 中选中还是取消选中“保持活动”复选框,我都会遇到端口耗尽的问题。在几秒钟的测试中,我最终达到了 65535 个端口的限制。 Netstat显示大部分都处于TIME_WAIT状态。在我达到限制后,服务器开始返回错误。
更多描述:
首先我尝试在本地电脑上的 win10 上执行此操作。
我的性能非常差,nextjs 服务器无法处理这么多的请求。所以我设置了 nginx 并为 5 个 nextjs 服务器设置了循环。这解决了性能问题,但在 1000 个样本之后我得到了错误响应。
发现win10的可用端口限制较低。所以我在虚拟机上设置了linux并做了同样的测试。现在性能好多了,但我达到了端口 65535 的限制。
从来没有做过可以承受重负载的应用程序,所以我有点迷失。我很确定我可以修复代码性能不佳的问题,但由于系统本身的限制,我需要提示。
我可能做错了什么以及我可以做些什么来绕过这个问题。
我什至不能说这个 jmeter 测试是否代表了真实的东西,或者浏览器中的行为会有所不同。我想用selenium插件进行测试,但是400-500个浏览器对我来说几乎不可能运行测试。
非常感谢任何有助于阅读的信息和链接!预先感谢。
我不明白如何才能达到 65535 个端口和 500 个虚拟用户的限制。
因此,要么您没有在 JMeter 端或服务器端正确终止连接。
尝试在线程组级别上勾选“每次迭代中的同一用户”框
这样现有的 TCP/SSL 会话将被重新使用,而不是创建新的会话
尝试取消选中
HTTP 请求采样器级别上的
Use KeepAlive
框
Connection: close
标头,从 JMeter 端终止会话
如果您使用 WebSocket Samplers 插件,请使用
WebSocket Open Connection
和 WebSocket Close
采样器来设置和终止连接,并使用带有“现有连接”选项的相关采样器
确保 JMeter 与真实浏览器具有相同的网络占用空间,使用第三方嗅探器工具(如 Fiddler 或 Wireshark)检查从两者发送的请求,并修改 JMeter 的配置,使其行为与真实浏览器完全相同