对 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 错误

探讨Netty获取并检查Websocket握手请求的两种方式

React Native:获取请求失败并出现错误 - TypeError:网络请求失败(...)