前言

  • 技术栈

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

    java.net.SocketException: Connection resetorg.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_backlognet.ipv4.tcp_max_syn_backlog = 4096
  • 查看操作系统全连贯队列大小

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

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