多次重启服务后Keydb服务器运行正常但拒绝连接求助
有多台应用程序连接至Keydb服务器,多次重启这些服务后,Keydb服务器无响应、停止接受新连接,但进程仍运行。本地连接也失败,排除代理/网络问题。排查发现无响应时内存、CPU占用极低,磁盘充足;活跃连接数和正常状态基本一致,甚至更少。Keydb调试日志在连接阻断时停止输出,系统日志仅出现连接拒绝记录。
Keydb无响应但进程存活的排查方向
1. 检查文件描述符(FD)耗尽
- 执行
ulimit -n查看系统允许的最大文件描述符数,再用lsof -p <keydb-pid> | wc -l统计Keydb当前占用的FD数量。若数值接近上限,Keydb无法创建新socket连接,会出现拒绝连接但进程存活的情况。 - 检查Keydb配置中的
maxclients参数,确认是否设置过低;同时查看系统级FD限制(/etc/security/limits.conf),确保给Keydb进程分配了足够配额。
2. 排查TCP连接状态异常
- 用
ss -tanp | grep <keydb-port>查看Keydb端口的TCP连接状态,重点关注TIME_WAIT、FIN_WAIT、CLOSE_WAIT状态的连接数量。应用频繁重启可能导致大量半关闭连接,耗尽Keydb的连接处理能力。 - 确认Keydb的
tcp-keepalive配置是否开启(默认300秒),若应用重启时未主动关闭连接,Keydb可能无法及时回收无效连接。
3. 检查进程死锁或内核态阻塞
- 用
strace -p <keydb-pid>跟踪Keydb进程的系统调用,观察是否卡在某个系统调用(如accept()、read()、write())上;若进程处于D状态(不可中断睡眠),可能是磁盘IO或内核资源阻塞导致。 - 用
gdb -p <keydb-pid>查看进程堆栈信息,确认是否存在死锁(如多线程等待同一锁资源)。
4. 验证连接回收机制
- 检查Keydb配置中的
timeout参数,若设置为0(默认,永不超时),应用重启后遗留的空闲连接可能占用资源,需调整为合理的超时时间。 - 正常状态下执行
CLIENT LIST命令,记录连接的idle时间,对比异常时的连接状态,排查是否存在大量长期空闲连接。
5. 检查系统内核参数
- 查看TCP相关内核参数:
net.ipv4.tcp_tw_reuse、net.ipv4.tcp_max_syn_backlog、net.core.somaxconn。其中somaxconn若小于Keydb的backlog配置,会导致新连接被内核拒绝;tcp_max_syn_backlog过小会引发SYN队列溢出。 - 注意:
net.ipv4.tcp_tw_recycle在NAT环境下可能引发问题,不建议随意开启。
6. 测试进程基础可用性
- 当Keydb无响应时,执行
kill -USR1 <keydb-pid>触发内存快照生成,若快照无法生成,说明进程内部存在异常。 - 用
ps aux | grep keydb确认进程状态,排查是否存在僵尸线程或异常线程。
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

