运行Python自带http.server服务时出现性能骤降卡顿是什么原因?
问题成因说明
- 首先是
python -m http.server自身的设计缺陷:它是单线程同步架构,默认串行处理所有请求,无多线程/异步调度能力,高频率请求下会直接导致请求队列积压。同时该工具默认每次请求都会打印访问日志到标准输出,终端输出属于阻塞IO,压测过程中大量日志写入会占用绝大多数进程运行时间,挤压实际请求处理的资源,是性能骤降的核心诱因之一。 - 第二是本地TCP连接状态堆积:每次重新运行wrk压测命令都会新建大量TCP连接,本地回环网络的客户端端口资源有限,大量连接断开后会进入
TIME_WAIT状态,内核需要等待2MSL(通常为1分钟)才会回收端口,多次压测后可用端口被占满,新连接建立排队甚至超时,直接导致吞吐量暴跌。 - 第三是服务端套接字参数配置不合理:
http.server默认没有开启SO_REUSEADDR、SO_REUSEPORT端口复用参数,也没有禁用Nagle算法(TCP_NODELAY),小数据包传输时会被算法延迟发送,多次压测后传输延迟持续堆积,吞吐量出现无规律波动。 - 补充验证方案:你可以把http.server的输出重定向到空设备(执行
python3 -m http.server 8000 --bind 127.0.0.1 > /dev/null 2>&1),同时调整内核的TCP参数开启tcp_tw_reuse快速回收TIME_WAIT连接,再次压测就能看到性能波动会大幅降低。
内容的提问来源于stack exchange,提问作者ScottW
相关产品推荐
相关产品推荐

