乐趣区

关于jmeter:fastapiuvicorn-压测并发与TCP队列qbit

前言

  • 技术栈

     操作系统 Ubuntu 20.04
    内核版本 Linux version 5.4.0-155-generic
    Python 3.11
    fastapi 0.99.1
    uvicorn 0.23.2
  • uvicorn 监听端口 8003
  • 用 jmeter 压测 fastapi/uvicorn 接口程序,大量报错:

    java.net.SocketException: Connection reset
    org.apache.http.NoHttpResponseException: ... failed to respond

    服务器 cpu 和内存应用都不高,揣测是 tcp 连贯队列的问题

解决步骤

  • 查看 tcp 连接数

    ss -natp '(sport = :8003)' | awk '{count[$1]++} END {for (word in count) print word, count[word]}'
  • 查看应用程序 uvicorn 的 TCP 全连贯队列大小

    # ss -nltp '(sport = :8003)'
    State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process                          
    LISTEN  0       2048    0.0.0.0:8003        0.0.0.0:*          users:(("uvicorn",pid=172724,fd=14))

    这里的 Send-Q 就是全连贯队列大小,与 uvicorn 文档外面 backlog 2048 的默认值是对得上的

  • 查看操作系统半连贯队列大小

    # sysctl -a | grep net.ipv4.tcp_max_syn_backlog
    net.ipv4.tcp_max_syn_backlog = 4096
  • 查看操作系统全连贯队列大小

    # sysctl -a | grep net.core.somaxconn
    net.core.somaxconn = 4096
  • TCP 连贯队列大小值能够批改 /etc/sysctl.conf 文件调整
  • 排查后发现不是 tcp 连接池问题,有相干问题如下:

     日志级别较低时输入日志太多影响性能
    与 redis 的连接数太多报错
    与 PostgreSQL 连接数太多报错 

本文出自 qbit snap

退出移动版