对 websocket 服务器的请求失败并出现 WebSocket I/O 错误:读取超时
Posted
技术标签:
【中文标题】对 websocket 服务器的请求失败并出现 WebSocket I/O 错误:读取超时【英文标题】:Request to websocket server fails with WebSocket I/O error: Read timed out 【发布时间】:2021-02-18 16:55:17 【问题描述】:我已经使用 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 错误:读取超时”的随机故障。
非常感谢您对此的任何帮助。谢谢。
【问题讨论】:
【参考方案1】:1006 和断开连接错误的组合表明服务器已经看到 tcp 连接关闭(可能是 tcp 关闭或重置)。我猜这种关闭是由于 JMeter 在读取超时后关闭连接造成的,但这纯粹是猜测,因为我不知道您的 JMeter 测试计划是如何设置的。
当您增加用户数量时您在 JMeter 中看到超时可能意味着服务器无法足够快地处理该负载,即无法在读取超时之前发送响应。但这也可能意味着资源链中的其他地方出现资源故障。这就是负载测试的问题:你总是在测试整个链;您必须检查每个问题是在被测应用程序、测试客户端还是网络中。如果没有更多信息,很难判断您的情况是什么问题。
【讨论】:
以上是关于对 websocket 服务器的请求失败并出现 WebSocket I/O 错误:读取超时的主要内容,如果未能解决你的问题,请参考以下文章
Jetty Websocket 服务器在本地工作,但远程连接失败并出现“主机已关闭”错误,如何解决?
如何让 Tornado websocket 客户端接收服务器通知?
Opera 12 中的 WebSocket 握手失败(错误请求)
python 请求:对天蓝色的 PUT 请求失败并出现 415 错误