高级构建选项
本文档介绍 UVHTTP 的高级构建配置选项,通常仅高级用户或特定性能调优场景需要。
概述
大多数用户应使用默认值。这些高级选项允许针对特定用例、性能优化或资源受限环境微调内部参数。
内存分配器配置
UVHTTP_ALLOCATOR_TYPE
- 类型: STRING
- 默认值: 0
- 说明: 内存分配器类型选择
- 用法: 选择内存分配器实现
- 选项:
0: 系统分配器 (malloc/free)1: mimalloc 分配器 (自动启用BUILD_WITH_MIMALLOC=ON)2: 自定义分配器 (应用层实现)
- 影响:
- 系统分配器: 标准性能,无依赖
- mimalloc: 内存分配快 30-50%,减少碎片
- 自定义: 完全控制内存管理
- 注意:
- 选项
1自动启用BUILD_WITH_MIMALLOC=ON - 选项
2需要应用层实现自定义分配器函数
- 选项
自定义分配器实现
使用 UVHTTP_ALLOCATOR_TYPE=2 时,必须在应用中实现以下函数:
c
#include <stddef.h>
#include <stdlib.h>
// 自定义分配器实现
void* uvhttp_custom_alloc(size_t size) {
// 实现自定义分配逻辑
return malloc(size);
}
void uvhttp_custom_free(void* ptr) {
// 实现自定义释放逻辑
free(ptr);
}
void* uvhttp_custom_realloc(void* ptr, size_t size) {
// 实现自定义 realloc 逻辑
return realloc(ptr, size);
}
void* uvhttp_custom_calloc(size_t nmemb, size_t size) {
// 实现自定义 calloc 逻辑
return calloc(nmemb, size);
}示例用例:
- 嵌入式系统的内存池分配
- 调试时跟踪内存使用
- 实现自定义分配策略
- 集成应用特定内存管理器
重要说明:
- 这些函数必须在包含任何 UVHTTP 头文件之前实现
- 线程安全由实现者负责
- 所有分配函数必须正确处理 NULL 返回
- free 必须安全处理 NULL 指针
HTTP 协议配置
UVHTTP_MAX_HEADER_NAME_SIZE
- 类型: STRING
- 默认值: 256
- 说明: HTTP 头部名称最大长度(字节)
- 用法: 如需处理很长的头部名称则调整
- 影响: 减小此值节省内存,但可能拒绝有效的长头部名称请求
UVHTTP_MAX_HEADER_VALUE_SIZE
- 类型: STRING
- 默认值: 4096
- 说明: HTTP 头部值最大长度(字节)
- 用法: 如需处理很长的头部值则调整
- 影响: 减小此值节省内存,但可能拒绝有效的长头部值请求
UVHTTP_MAX_HEADERS
- 类型: STRING
- 默认值: 64
- 说明: 每个请求的最大 HTTP 头部数量
- 用法: 如需大量头部则调整
- 影响: 减小此值节省内存,但可能拒绝有效的多头部请求
UVHTTP_INLINE_HEADERS_CAPACITY
- 类型: STRING
- 默认值: 32
- 说明: 内联头部容量优化
- 用法: 根据请求中典型头部数量调整
- 影响: 更高值使用更多栈内存,但可能提升多头部请求性能
UVHTTP_MAX_URL_SIZE
- 类型: STRING
- 默认值: 2048
- 说明: URL 最大长度(字节)
- 用法: 如需处理很长的 URL 则调整
- 影响: 减小此值节省内存,但可能拒绝有效的长 URL 请求
UVHTTP_MAX_PATH_SIZE
- 类型: STRING
- 默认值: 1024
- 说明: 路径最大长度(字节)
- 用法: 如需处理很长的路径则调整
- 影响: 减小此值节省内存,但可能拒绝有效的长路径请求
UVHTTP_MAX_METHOD_SIZE
- 类型: STRING
- 默认值: 16
- 说明: HTTP 方法最大长度(字节)
- 用法: 很少需要调整
- 影响: 内存影响极小
连接管理
UVHTTP_MAX_CONNECTIONS_DEFAULT
- 类型: STRING
- 默认值: 2048
- 说明: 默认最大并发连接数
- 用法: 根据预期并发连接数调整
- 影响: 更高值使用更多内存,但允许更多并发连接
UVHTTP_MAX_CONNECTIONS_MAX
- 类型: STRING
- 默认值: 10000
- 说明: 推荐的最大并发连接数
- 用法: 设置为服务器容量上限
- 影响: 更高值使用更多内存,但允许更多并发连接
UVHTTP_BACKLOG
- 类型: STRING
- 默认值: 8192
- 说明: TCP backlog 大小
- 用法: 根据预期连接突发速率调整
- 影响: 更高值使用更多内核内存,但更好处理突发连接
UVHTTP_CONNECTION_TIMEOUT_DEFAULT
- 类型: STRING
- 默认值: 60
- 说明: 默认连接超时(秒)
- 用法: 根据应用需求调整
- 影响: 更长超时使空闲连接保持更久,消耗更多资源
缓冲区配置
UVHTTP_INITIAL_BUFFER_SIZE
- 类型: STRING
- 默认值: 8192
- 说明: 初始缓冲区大小(字节)
- 用法: 根据典型请求/响应大小调整
- 影响: 更大值使用更多内存,但可能减少重新分配
UVHTTP_MAX_BODY_SIZE
- 类型: STRING
- 默认值: 1048576 (1MB)
- 说明: 最大请求体大小(字节)
- 用法: 根据应用需求调整
- 影响: 减小此值节省内存,但可能拒绝有效的大请求
UVHTTP_READ_BUFFER_SIZE
- 类型: STRING
- 默认值: 16384 (16KB)
- 说明: 读取缓冲区大小(字节)
- 用法: 根据网络条件和典型数据大小调整
- 影响: 更大值使用更多内存,但可能提升吞吐量
异步文件操作
UVHTTP_ASYNC_FILE_BUFFER_SIZE
- 类型: STRING
- 默认值: 65536 (64KB)
- 说明: 异步文件缓冲区大小(字节)
- 用法: 根据文件大小和 I/O 模式调整
- 影响: 更大值使用更多内存,但可能提升文件 I/O 性能
UVHTTP_ASYNC_FILE_MAX_CONCURRENT
- 类型: STRING
- 默认值: 64
- 说明: 最大并发文件读取数
- 用法: 根据磁盘 I/O 容量和并发需求调整
- 影响: 更高值使用更多内存,但允许更多并发文件操作
UVHTTP_ASYNC_FILE_MAX_SIZE
- 类型: STRING
- 默认值: 10485760 (10MB)
- 说明: 异步操作的最大文件大小(字节)
- 用法: 大于此值的文件使用同步操作
- 影响: 更大值使用更多内存,但允许更大文件使用异步操作
静态文件服务
UVHTTP_STATIC_MAX_CACHE_SIZE
- 类型: STRING
- 默认值: 1048576 (1MB)
- 说明: 静态文件缓存最大大小(字节)
- 用法: 根据可用内存和文件访问模式调整
- 影响: 更大值使用更多内存,但提升缓存命中率
UVHTTP_STATIC_MAX_PATH_SIZE
- 类型: STRING
- 默认值: 1024
- 说明: 静态文件路径最大长度(字节)
- 用法: 如需处理很长的文件路径则调整
- 影响: 减小此值节省内存,但可能拒绝有效的文件路径
UVHTTP_STATIC_MAX_CONTENT_LENGTH
- 类型: STRING
- 默认值: 32
- 说明: 静态文件 Content-Length 最大长度
- 用法: 很少需要调整
- 影响: 内存影响极小
UVHTTP_STATIC_MAX_FILE_SIZE
- 类型: STRING
- 默认值: 1073741824 (1GB)
- 说明: 静态文件最大大小(字节)
- 用法: 根据应用需求调整
- 影响: 减小此值阻止提供非常大的文件
UVHTTP_STATIC_SMALL_FILE_THRESHOLD
- 类型: STRING
- 默认值: 4096 (4KB)
- 说明: 小文件阈值(字节)
- 用法: 小于此值的文件采用不同处理方式
- 影响: 调整此值影响小文件性能特征
WebSocket 配置
UVHTTP_WEBSOCKET_DEFAULT_MAX_FRAME_SIZE
- 类型: STRING
- 默认值: 16777216 (16MB)
- 说明: WebSocket 默认最大帧大小(字节)
- 用法: 根据应用消息大小需求调整
- 影响: 减小此值节省内存,但可能拒绝有效的大帧
UVHTTP_WEBSOCKET_DEFAULT_MAX_MESSAGE_SIZE
- 类型: STRING
- 默认值: 67108864 (64MB)
- 说明: WebSocket 默认最大消息大小(字节)
- 用法: 根据应用消息大小需求调整
- 影响: 减小此值节省内存,但可能拒绝有效的大消息
UVHTTP_WEBSOCKET_DEFAULT_RECV_BUFFER_SIZE
- 类型: STRING
- 默认值: 65536 (64KB)
- 说明: WebSocket 默认接收缓冲区大小(字节)
- 用法: 根据典型消息大小调整
- 影响: 更大值使用更多内存,但可能提升大消息性能
UVHTTP_WEBSOCKET_DEFAULT_PING_INTERVAL
- 类型: STRING
- 默认值: 30
- 说明: WebSocket 默认 ping 间隔(秒)
- 用法: 根据网络条件和应用需求调整
- 影响: 更短间隔更快检测死连接,但消耗更多带宽
UVHTTP_WEBSOCKET_DEFAULT_PING_TIMEOUT
- 类型: STRING
- 默认值: 10
- 说明: WebSocket 默认 ping 超时(秒)
- 用法: 根据网络条件和应用需求调整
- 影响: 更短超时更快检测死连接,但可能导致误报
TCP 配置
UVHTTP_TCP_KEEPALIVE_TIMEOUT
- 类型: STRING
- 默认值: 60
- 说明: TCP keepalive 超时(秒)
- 用法: 根据网络条件和应用需求调整
- 影响: 更短超时更快检测死连接,但可能导致误报
UVHTTP_CLIENT_IP_BUFFER_SIZE
- 类型: STRING
- 默认值: 64
- 说明: 客户端 IP 缓冲区大小(字节)
- 用法: 如需存储很长的客户端 IP 地址则调整
- 影响: 内存影响极小
Sendfile 配置
UVHTTP_SENDFILE_TIMEOUT_MS
- 类型: STRING
- 默认值: 30000
- 说明: Sendfile 超时(毫秒)
- 用法: 根据网络条件和文件大小调整
- 影响: 更长超时使慢传输的连接保持更久
UVHTTP_SENDFILE_MAX_RETRY
- 类型: STRING
- 默认值: 2
- 说明: Sendfile 最大重试次数
- 用法: 根据网络可靠性调整
- 影响: 更高值可能提升可靠性,但可能延迟错误检测
UVHTTP_SENDFILE_CHUNK_SIZE
- 类型: STRING
- 默认值: 262144 (256KB)
- 说明: Sendfile 块大小(字节)
- 用法: 根据网络条件和文件大小调整
- 影响: 更大值使用更多内存,但可能提升吞吐量
UVHTTP_SENDFILE_MIN_FILE_SIZE
- 类型: STRING
- 默认值: 65536 (64KB)
- 说明: Sendfile 最小文件大小(字节)
- 用法: 小于此值的文件使用常规文件操作
- 影响: 调整此值影响小文件性能特征
零拷贝发送配置
UVHTTP_ZEROCOPY_MIN_BODY
- 类型: STRING
- 默认值: 4096 (4KB)
- 说明: 走零拷贝 writev 发送路径(header + body 两个 iovec 一次写入)的最小响应 body 大小
- 用法: 小于此值的 body 使用单缓冲拷贝路径;TLS 连接始终使用拷贝路径
- 影响: 小 body 下双 iovec 写入比拷贝路径慢约 14%,大 body 下约快 1.5 倍,因此降低阈值会损失小响应吞吐
文件大小阈值
UVHTTP_FILE_SIZE_SMALL
- 类型: STRING
- 默认值: 1048576 (1MB)
- 说明: 小文件阈值(字节)
- 用法: 用于性能优化决策
- 影响: 调整此值影响不同文件大小的性能特征
UVHTTP_FILE_SIZE_MEDIUM
- 类型: STRING
- 默认值: 10485760 (10MB)
- 说明: 中等文件阈值(字节)
- 用法: 用于性能优化决策
- 影响: 调整此值影响不同文件大小的性能特征
UVHTTP_FILE_SIZE_LARGE
- 类型: STRING
- 默认值: 104857600 (100MB)
- 说明: 大文件阈值(字节)
- 用法: 用于性能优化决策
- 影响: 调整此值影响不同文件大小的性能特征
块大小配置
UVHTTP_CHUNK_SIZE_SMALL
- 类型: STRING
- 默认值: 65536 (64KB)
- 说明: 小块大小(字节)
- 用法: 用于性能优化决策
- 影响: 调整此值影响不同块大小的性能特征
UVHTTP_CHUNK_SIZE_MEDIUM
- 类型: STRING
- 默认值: 262144 (256KB)
- 说明: 中等块大小(字节)
- 用法: 用于性能优化决策
- 影响: 调整此值影响不同块大小的性能特征
UVHTTP_CHUNK_SIZE_LARGE
- 类型: STRING
- 默认值: 1048576 (1MB)
- 说明: 大块大小(字节)
- 用法: 用于性能优化决策
- 影响: 调整此值影响不同块大小的性能特征
缓存配置
UVHTTP_CACHE_DEFAULT_MAX_ENTRIES
- 类型: STRING
- 默认值: 1000
- 说明: 缓存默认最大条目数
- 用法: 根据可用内存和缓存访问模式调整
- 影响: 更高值使用更多内存,但提升缓存命中率
UVHTTP_CACHE_DEFAULT_TTL
- 类型: STRING
- 默认值: 3600
- 说明: 缓存默认 TTL(秒)
- 用法: 根据数据新鲜度需求调整
- 影响: 更长 TTL 可能提供过期数据,但提升缓存命中率
UVHTTP_LRU_CACHE_BATCH_EVICTION_SIZE
- 类型: STRING
- 默认值: 10
- 说明: LRU 缓存批量驱逐大小
- 用法: 根据缓存访问模式调整
- 影响: 更大值在驱逐时使用更多 CPU,但可能提升整体缓存性能
Socket 配置
UVHTTP_SOCKET_SEND_BUF_SIZE
- 类型: STRING
- 默认值: 262144 (256KB)
- 说明: Socket 发送缓冲区大小(字节)
- 用法: 根据网络条件和吞吐量需求调整
- 影响: 更大值使用更多内存,但可能提升吞吐量
UVHTTP_SOCKET_RECV_BUF_SIZE
- 类型: STRING
- 默认值: 262144 (256KB)
- 说明: Socket 接收缓冲区大小(字节)
- 用法: 根据网络条件和吞吐量需求调整
- 影响: 更大值使用更多内存,但可能提升吞吐量
系统配置
UVHTTP_PAGE_SIZE
- 类型: STRING
- 默认值: 4096
- 说明: 内存页大小(字节)
- 用法: 应匹配系统页大小
- 影响: 不正确的值可能导致性能问题
UVHTTP_IP_OCTET_MAX_VALUE
- 类型: STRING
- 默认值: 255
- 说明: IP 八位组最大值
- 用法: 不应更改
- 影响: 更改此值可能导致 IP 地址解析错误
限流配置
UVHTTP_RATE_LIMIT_MAX_REQUESTS
- 类型: STRING
- 默认值: 1000000
- 说明: 限流最大请求数
- 用法: 根据应用限流需求调整
- 影响: 更高值允许更多请求,但可能增加服务器负载
UVHTTP_RATE_LIMIT_MAX_WINDOW_SECONDS
- 类型: STRING
- 默认值: 86400
- 说明: 限流最大时间窗口(秒)
- 用法: 根据应用限流需求调整
- 影响: 更长窗口提供更多灵活性,但可能降低限流效果
UVHTTP_RATE_LIMIT_MIN_TIMEOUT_SECONDS
- 类型: STRING
- 默认值: 10
- 说明: 限流最小超时(秒)
- 用法: 根据应用限流需求调整
- 影响: 更短超时可能导致更多误报
如何使用高级选项
配置高级选项时使用 CMake 的 -D 标志:
bash
cmake -DUVHTTP_MAX_HEADER_NAME_SIZE=512 \
-DUVHTTP_MAX_BODY_SIZE=5242880 \
-DUVHTTP_CACHE_DEFAULT_MAX_ENTRIES=5000 \
..性能调优指南
内存受限环境
内存受限环境中考虑减小:
UVHTTP_MAX_CONNECTIONS_DEFAULTUVHTTP_MAX_HEADERSUVHTTP_MAX_BODY_SIZEUVHTTP_CACHE_DEFAULT_MAX_ENTRIESUVHTTP_READ_BUFFER_SIZE
高吞吐环境
高吞吐环境中考虑增大:
UVHTTP_MAX_CONNECTIONS_DEFAULTUVHTTP_READ_BUFFER_SIZEUVHTTP_SOCKET_SEND_BUF_SIZEUVHTTP_SOCKET_RECV_BUF_SIZEUVHTTP_CACHE_DEFAULT_MAX_ENTRIES
低延迟环境
低延迟环境中考虑:
- 减小
UVHTTP_CONNECTION_TIMEOUT_DEFAULT - 减小
UVHTTP_WEBSOCKET_DEFAULT_PING_INTERVAL - 增大
UVHTTP_READ_BUFFER_SIZE - 增大
UVHTTP_SOCKET_SEND_BUF_SIZE