python - 对 websocket 服务器的请求失败并出现 WebSocket I/O 错误:读取超时
问题描述
我已经使用 fastapi 实现了一个 websocket。我正在使用 Jmeter websocket 采样器对其进行负载测试,其中一些请求因 WebSocket I/O 错误而失败:读取超时(至少这是我在 Jmeter 端遇到的错误)。服务器端的错误:
ERROR: Exception in ASGI application
Traceback (most recent call last):
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 157, in run_asgi
result = await self.app(self.scope, self.asgi_receive, self.asgi_send)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__
return await self.app(scope, receive, send)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/fastapi/applications.py", line 199, in __call__
await super().__call__(scope, receive, send)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/starlette/applications.py", line 111, in __call__
await self.middleware_stack(scope, receive, send)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/starlette/middleware/errors.py", line 146, in __call__
await self.app(scope, receive, send)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/starlette/exceptions.py", line 58, in __call__
await self.app(scope, receive, send)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/starlette/routing.py", line 566, in __call__
await route.handle(scope, receive, send)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/starlette/routing.py", line 283, in handle
await self.app(scope, receive, send)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/starlette/routing.py", line 57, in app
await func(session)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/fastapi/routing.py", line 247, in app
await dependant.call(**values)
File "./websocket.py", line 29, in post_req
body = await websocket.receive_json()
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/starlette/websockets.py", line 98, in receive_json
self._raise_on_disconnect(message)
File "/home/udit.pandey/Desktop/workspace/chat_server/venv/lib/python3.7/site-packages/starlette/websockets.py", line 80, in _raise_on_disconnect
raise WebSocketDisconnect(message["code"])
starlette.websockets.WebSocketDisconnect: 1006
此负载测试涵盖了 2 个场景:
- 5 用户在 10 秒内产生结果:没有失败。
- 在 10 秒内生成 10 个用户结果:Jmeter 采样器上出现错误“WebSocket I/O 错误:读取超时”的随机故障。
非常感谢您对此的任何帮助。谢谢。
解决方案
1006 和断开连接错误的组合表明服务器已经看到 tcp 连接关闭(可能是 tcp 关闭或重置)。我猜这种关闭是由 JMeter 在读取超时后关闭连接引起的,但这纯粹是猜测,因为我不知道您的 JMeter 测试计划是如何设置的。
当增加用户数量时,您在 JMeter 中看到超时可能意味着服务器无法足够快地处理该负载,即无法在读取超时之前发送响应。但这也可能意味着资源链中的其他地方出现资源故障。这就是负载测试的问题:你总是在测试整个链;您必须检查每个问题是在被测应用程序、测试客户端还是网络中。没有更多信息,很难说出您的问题是什么。
推荐阅读
- php - document.getElementById() 作为 PHP SQL 查询参数
- c# - 地图路线将空白空间转换为 -
- c++ - 在 sniffer.h libtins 上获取 VS C2664
- python - Python:在 Windows 操作系统中更改文件/文件夹属性
- flutter - 无法重建 StreamProvider 以更新其当前数据
- google-kubernetes-engine - 使用 GKE 工作负载标识时出现 MetadataServerException
- java - 从 Windows 10 平台上的 USB 设备读取 Java usb4java
- javascript - 我如何创建一个简单的 onclick 添加函数()
- python - Google App Engine 上的 Golang 应用程序调用 Python 脚本
- django - Django rest 从桥模型中获取数据