第 18 章:系统初始化与服务端设置
本章分别介绍进程级 ServerSetting、Socket、背压、容量、指标和优雅退出。
1. ServerSetting 只负责进程级初始化
ServerSetting 处理信号默认行为和框架日志入口;Socket、背压、HTTP 上限、Worker 队列和优雅退出属于具体 Server 实例设置。三类设置分别作用于进程、Socket 与具体 Server 实例,彼此独立。
2. 初始化信号和日志
stt::file::LogFile log(16384);
if(!log.openFile("logs/sttnet.log", "yyyy-mm-ddThh:mi:ss.sss", " "))
return 1;
// Chinese 表示框架内部日志使用中文;其他值使用英文。
stt::system::ServerSetting::init(&log, "Chinese");init() 等价于 setExceptionHandling() 加 setLogFile()。日志对象的生命周期需要覆盖网络服务的完整运行与关闭过程。
3. Socket 设置
stt::network::ServerSocketOptions options;
options.tcp_no_delay = true; // 小响应低延迟
options.keep_alive = true; // 开启内核 TCP keepalive
options.keep_alive_idle_seconds = 60; // 空闲多久开始探测
options.keep_alive_interval_seconds = 10;
options.keep_alive_probe_count = 3;
options.listen_backlog = 4096;
server.setSocketOptions(options);4. 内存、背压和任务上限
| 设置 | 保护目标 |
|---|---|
setMaxPendingWriteBytes | 限制慢客户端在单连接积压的发送内存 |
setWriteBudgetPerEvent | 限制一次事件写入量,维护连接公平性 |
setMaxHttpHeaderBytes | 阻止超大 Header 消耗内存 |
setMaxPendingWorkerTasks | 下游变慢时拒绝任务,限制队列持续增长 |
setGracefulShutdownTimeout | 限制 close() 等待在途任务和发送队列的时间 |
5. 指标快照
const stt::network::ServerMetricsSnapshot m = server.getMetrics();
std::cout << "connections=" << m.active_connections << '
'
<< "http_requests=" << m.parsed_http_requests << '
'
<< "pending_write_bytes=" << m.pending_write_bytes << '
'
<< "worker_rejections=" << m.worker_task_rejections << '
';6. 构造参数不是系统限制
HttpServer(100000, ...) 中的最大连接数只是框架容量,不能提高 Linux 的文件描述符限制。实际连接容量还取决于 ulimit -n、systemd LimitNOFILE、内核 backlog 和端口范围。