性能调优
本页介绍影响数据面吞吐量、延迟和资源使用的配置选项。默认值适用于中等流量(每秒数百至数千请求)。对于更高吞吐量场景或资源受限环境,以下参数可在性能、内存消耗和运维安全之间进行权衡。
数据面使用基于 Tokio 的异步运行时。以下设置控制工作在线程间的分配方式:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
runtime_tuning.http_capacity.workerThreads | int | 0 | 工作线程数(0 = CPU 核心数) |
runtime_tuning.http_capacity.acceptConcurrency | int | 16 | 并发 TCP accept 操作数 |
默认值 0 使运行时为每个可用 CPU 核心创建一个工作线程。此配置对于 CPU 密集型工作负载(TLS 终止、请求头操作和 Wasm 过滤器执行均受益于并行 CPU 访问)是最优的。
对于大部分时间在等待上游响应的 I/O 密集型工作负载,减少工作线程数可为其他进程释放 CPU 资源。当代理主要转发请求且转换操作极少时,将此值设置为低于 CPU 核心数。
Accept 并发
Section titled “Accept 并发”acceptConcurrency 控制可同时调用监听 socket 的 accept() 的线程数。默认值 16 可有效处理连接突发。对于极高连接速率的工作负载(每秒数万新连接),增加此值。如果性能分析显示 accept 相关竞争,则降低此值。
复用上游服务连接可避免每次请求的 TCP 握手和 TLS 协商开销。连接池对于延迟敏感型工作负载至关重要。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
runtime_tuning.http_capacity.upstreamKeepalivePoolSize | int | 32768 | 上游池中保持的最大空闲连接数 |
上游 keepalive 池维护与后端服务的空闲连接。当数据面需要转发请求时,先检查池中是否有可用连接,然后再建立新连接。每个空闲连接消耗少量内存(数 KB 的 socket 缓冲区),因此内存成本随池大小线性增长。
HTTP 响应缓存
Section titled “HTTP 响应缓存”数据面可缓存上游响应。条目大小限制控制可存储的单个响应的最大体积:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
runtime_tuning.http_cache.maxEntrySizeMb | int | 16 | 单个缓存响应条目的最大大小(MiB) |
大于 maxEntrySizeMb 的响应会跳过缓存并直接流式传输给客户端。对于提供大体积可缓存负载的工作负载可调高此值;调低则可限制单条目的内存占用。
超时配置可防止资源泄漏,确保代理不会无限期持有连接。以下均为直接位于 runtime_tuning 下的扁平键(不存在嵌套的 timeout 对象),单位均为毫秒:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
runtime_tuning.downstreamReadTimeoutMs | int | 60000 | 从客户端读取请求的最大时间 |
runtime_tuning.upstream_connection_timeout_ms | int | 5000 | 与上游建立连接的最大时间 |
runtime_tuning.upstream_read_timeout_ms | int | 30000 | 从上游读取响应的最大时间 |
runtime_tuning.upstream_idle_timeout_ms | int | 60000 | 关闭上游 keepalive 连接前的最大空闲时间 |
当后端不可达时,调低 upstream_connection_timeout_ms 可快速失败;对于缓慢或长时间运行的上游端点,调高 upstream_read_timeout_ms。
代理运行时不提供 TLS 会话缓存调优项。TLS 协议版本上下界(runtime.tls_min_version / runtime.tls_max_version)以及证书/mTLS 设置见 TLS 配置。
性能分析与监控
Section titled “性能分析与监控”在调整调优参数之前,使用可用指标建立性能基线:
- 延迟分布 — 通过数据面指标端点跟踪 p50、p95 和 p99 响应时间
- 错误率 — 监控 HTTP 5xx 响应和连接错误
- 资源使用 — 观察当前流量水平下的 CPU 和内存消耗
- 连接池效率 — 跟踪
upstream_keepalive_pool_hits与upstream_keepalive_pool_misses的比率
逐步调整参数,在每次调整后测量对各项指标的影响,然后再进行下一次调整。记录基线和每次变更以供将来参考。
数据面在生产构建中链接 jemalloc,相比系统分配器具有更好的内存碎片化行为和更低的尾部延迟。分配器通过 --features jemalloc 编译标志选择。
对于并发连接数非常大的工作负载,jemalloc 的线程缓存和后台线程特性可减少分配争用。监控 nantian_gw_dataplane_container_memory_working_set_bytes 以验证分配器在你的流量配置下表现良好。
缓冲区与 I/O 调优
Section titled “缓冲区与 I/O 调优”对于高吞吐量部署,可考虑调整以下环境级别参数:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
runtime_tuning.http_capacity.bufferPoolSize | int | 1024 | 可复用的缓冲区 slab 数量 |
runtime_tuning.http_capacity.maxHeaderSize | int | 65536 | 每个请求最大请求头字节数(64 KiB) |
runtime_tuning.http_capacity.maxBodySize | int | 10485760 | 每个请求最大请求体字节数(10 MiB) |
对于突发请求量大的工作负载,增大 bufferPoolSize 可减少每次请求的分配开销。如果上游只接受小负载,降低 maxBodySize 可限制恶意请求的内存窗口。