前言
-
技术栈
操作系统 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