STTNet 0.7.0

第 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 和端口范围。

完整系统设置 Demo →