我有一个配置为接受来自大约 400 个服务器的远程消息的 rsyslog 服务器,但是一旦服务器获得大约 256 个连接,它就会停止接受新连接,并且客户端会看到如下错误消息
cannot connect to syslog.example.org:514: Connection timed out
rsyslog imtcp模块配置如下
module(load="imtcp"
MaxSessions="1000"
StreamDriver.Mode="1"
StreamDriver.AuthMode="anon"
StreamDriver.Name="gtls"
)
systemd 单元也配置好了LimitNOFILE=16384
,当我检查时/proc/$pid/limits
,我发现限制的数量看起来不错
$ /proc/2767537# cat limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 7393 7393 processes
Max open files 16384 16384 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 7393 7393 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
然而,当我开始看到这个错误时,文件数量/proc/$pid/fd
接近 256。
/proc/2767537$ ls -l fd | wc -l
253
此外,已建立的连接始终接近 256
$ ss -ntp4 state established sport eq 514 | wc -l
257
这表明我需要调整其他 256 的限制,但我无法找到什么/在哪里。
- 我在系统日志服务器上的日志中看不到任何错误
- 使用 tcpdump 我可以看到 syn 数据包从端口 514 进入,但从未发送 sys/ack
此错误似乎与以下上游问题有关
升级到采集服务器上的最新版本的 rsyslog 解决了该问题