首页 > 解决方案 > 对 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 个场景:

  1. 5 用户在 10 秒内产生结果:没有失败。
  2. 在 10 秒内生成 10 个用户结果:Jmeter 采样器上出现错误“WebSocket I/O 错误:读取超时”的随机故障。

非常感谢您对此的任何帮助。谢谢。

标签: pythonwebsocketjmeterfastapi

解决方案


1006 和断开连接错误的组合表明服务器已经看到 tcp 连接关闭(可能是 tcp 关闭或重置)。我猜这种关闭是由 JMeter 在读取超时后关闭连接引起的,但这纯粹是猜测,因为我不知道您的 JMeter 测试计划是如何设置的。

当增加用户数量时,您在 JMeter 中看到超时可能意味着服务器无法足够快地处理该负载,即无法在读取超时之前发送响应。但这也可能意味着资源链中的其他地方出现资源故障。这就是负载测试的问题:你总是在测试整个链;您必须检查每个问题是在被测应用程序、测试客户端还是网络中。没有更多信息,很难说出您的问题是什么。


推荐阅读