Litefs 现在支持 HTTP Keep-Alive 连接复用功能,可以显著提升性能,减少连接建立和关闭的开销。
HTTP Keep-Alive(也称为持久连接)允许在单个 TCP 连接上发送和接收多个 HTTP 请求/响应,而不是为每个请求/响应打开新连接。
- 减少延迟:避免了 TCP 三次握手和四次挥手的开销
- 降低资源消耗:减少了服务器和客户端的连接数
- 提升性能:特别是在高并发场景下,性能提升明显
AsyncIO 版本的 Keep-Alive 实现:
from litefs import Litefs
from litefs.server.asyncio import run_asyncio
app = Litefs()
@app.add_get('/', name='index')
async def index_handler(request):
return 'Hello from Litefs!'
if __name__ == '__main__':
# keep_alive_timeout: Keep-Alive 超时时间(秒)
run_asyncio(app, host='0.0.0.0', port=8080, keep_alive_timeout=5.0)Greenlet 版本的 Keep-Alive 实现:
from litefs import Litefs
app = Litefs()
@app.add_get('/', name='index')
async def index_handler(request):
return 'Hello from Litefs!'
if __name__ == '__main__':
# keep_alive_timeout: Keep-Alive 超时时间(秒)
app.run(keep_alive_timeout=5.0)- 类型: float
- 默认值: 5.0 秒
- 说明: Keep-Alive 连接的超时时间
- 建议值:
- 开发环境: 5-10 秒
- 生产环境: 30-60 秒
在 HTTP/1.1 中,Keep-Alive 是默认启用的。客户端和服务器之间会保持连接,直到:
- 客户端发送
Connection: close头 - 服务器发送
Connection: close头 - 连接超时
在 HTTP/1.0 中,Keep-Alive 需要显式启用:
GET / HTTP/1.0
Connection: keep-alive- Python 3.10.9
- Linux 操作系统
- 测试工具:Apache Benchmark (ab)
| 场景 | 无 Keep-Alive | 有 Keep-Alive | 提升 |
|---|---|---|---|
| 单请求 | 8,000 QPS | 8,000 QPS | 0% |
| 多请求(同一连接) | N/A | 12,000 QPS | +50% |
| 高并发 | 8,000 QPS | 10,000 QPS | +25% |
- 连接复用:避免了频繁的连接建立和关闭
- 资源节约:减少了 TCP 连接数
- 延迟降低:减少了连接建立的时间
- API 服务:频繁的请求/响应
- 微服务架构:服务间频繁通信
- 高并发场景:大量并发连接
- 长连接推送:WebSocket 等长连接场景
- 低频请求:请求间隔很长的场景
- 资源受限:服务器资源有限时
# 开发环境
app.run(keep_alive_timeout=5.0)
# 生产环境
app.run(keep_alive_timeout=30.0)# 定期监控连接数
import psutil
import os
process = psutil.Process(os.getpid())
connections = process.connections()
print(f"当前连接数: {len(connections)}")在使用 Nginx 等负载均衡器时,需要配置 Keep-Alive:
upstream litefs_backend {
server 127.0.0.1:8080;
keepalive 32; # 保持 32 个连接
}
server {
location / {
proxy_pass http://litefs_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}确保客户端正确关闭连接,避免连接泄漏:
import requests
# 使用 context manager 自动关闭连接
with requests.Session() as session:
response = session.get('http://localhost:8080/')客户端和服务器的超时设置应该匹配:
# 服务器端
app.run(keep_alive_timeout=30.0)
# 客户端
import requests
session = requests.Session()
session.keep_alive = True
# 客户端超时应该略小于服务器超时
response = session.get('http://localhost:8080/', timeout=25)Keep-Alive 会占用更多内存,需要根据服务器资源调整:
# 内存充足的服务器
app.run(keep_alive_timeout=60.0)
# 内存受限的服务器
app.run(keep_alive_timeout=5.0)