You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多次重启服务后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:33:21