如何检查python项目中的websocket瓶颈

如何检查python项目中的websocket瓶颈,websocket,network-programming,Websocket,Network Programming,我目前有一个脚本可以连接到服务器,建立websocket连接并接收高频消息 我很确定我的客户端的处理跟不上消息,因此我在短时间内就落后了 我的理解是,消息在服务器发送缓冲区和客户端接收缓冲区中排队,如果我处理它们的速度不够快,缓冲区将填满,我将丢失消息,这将导致顺序错误,我的假设正确吗 我的问题是,追踪可能的瓶颈并追踪问题是服务器还是客户端的最佳方式(工具)是什么?我在VisualStudio中使用python,现在使用PM2运行单个进程 我正在寻找关于如何追踪低级瓶颈的建议,即使这意味着使用w

我目前有一个脚本可以连接到服务器,建立websocket连接并接收高频消息

我很确定我的客户端的处理跟不上消息,因此我在短时间内就落后了

我的理解是,消息在服务器发送缓冲区和客户端接收缓冲区中排队,如果我处理它们的速度不够快,缓冲区将填满,我将丢失消息,这将导致顺序错误,我的假设正确吗

我的问题是,追踪可能的瓶颈并追踪问题是服务器还是客户端的最佳方式(工具)是什么?我在VisualStudio中使用python,现在使用PM2运行单个进程

我正在寻找关于如何追踪低级瓶颈的建议,即使这意味着使用wireshark等工具


谢谢。

我的建议是使用
gevent
gevent-websocket
以便所有连接都是异步的。然后可以异步进行多个连接

  • 使用GIPC,您可以按cpu核心启动一个实例,并在端口之间实现负载平衡
例如:

from gevent import monkey, socket, Timeout, sleep
monkey.patch_all()
import sys
pyver = sys.version_info[0]
if pyver == 3:
    import signal
    from gevent import signal_handler as sig
else:
    from gevent import signal
import bottle
from bottle import route, request, response, abort
import ujson as json
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket import WebSocketError
import traceback

@route('/ws/app')
def handle_websocket():
    global ws_users
    ws = request.environ.get('wsgi.websocket')
    if not ws:
        abort(400, 'Expected WebSocket request.')
    while 1:
        message = None
        try:
            with Timeout(2, False) as timeout:
                message = ws.receive()
            if message:
                message = json.loads(message)
                # process message, report back with ws.send()
                
        except WebSocketError:
            break
        except Exception as exc:
            traceback.print_exc()
            sleep(1)


if __name__ == '__main__':
    print(socket.gethostname())
    print('Started...')
    botapp = bottle.app()
    server = WSGIServer(("0.0.0.0", int(80)), botapp , handler_class=WebSocketHandler)

    def shutdown():
        print('Shutting down ...')
        server.stop(timeout=60)
        exit(signal.SIGTERM)
    if pyver == 3:
        sig(signal.SIGTERM, shutdown)
        sig(signal.SIGINT, shutdown)
    else:
        signal(signal.SIGTERM, shutdown)
        signal(signal.SIGINT, shutdown) #CTRL C
    server.serve_forever()