多进程故障
Redis-benchmark回显为0或者无回显,几分钟后退出
现象描述
多进程模式启动,knet_mp_daemon进程被意外挂起。导致客户端打流失败,且knet_comm.log报错。

客户端运行Redis-benchmark命令时回显为0或者无回显,几分钟之后客户端退出,回显如下:
Could not connect to Redis at 192.168.**.***:****: Connection timed out
WARN: could not fetch server CONFIG
Writing to socket: Connection timed out
...
All clients disconnected... aborting.在服务端查看K-NET日志:
vim /etc/knet/knet_comm.log可以观察到如下报错:
Rpc client failed, ret -1
K-NET rpc client socket failed to be connected, clientFd: xx, error: 111原因
- 意外终止knet_mp_daemon进程。
- knet_mp_daemon进程运行过程中意外终止。
处理步骤
关闭K-NET所有的业务进程,然后重新启动knet_mp_daemon进程,再启动从进程业务。业务启动命令参见多进程加速功能。
启动业务进程失败提示“error allocating core states array”
现象描述
启动业务进程失败,提示“error allocating core states array”。

在服务端查看K-NET日志:
vim /etc/knet/knet_comm.log可以观察到如下报错(当前默认大页内存使用超过75%时会打印此告警):
Socket SOCKET_ID: Memory usage is too high: 0.xx或者如下报错(当前默认mbuf内存池使用超过70%时会打印此告警):
Mbuf pool usage is too high: 0.xx原因
没有足够的可用的大页内存:可能是/etc/knet/knet_comm.conf配置文件中socket_limit配置得太小,或者大页内存碎片化严重。
处理步骤
- 增大/etc/knet/knet_comm.conf配置文件中socket_limit配置,并增加实际可用大页内存。
- 关闭K-NET knet_mp_daemon进程以及所有的业务进程,然后重新启动。业务启动命令参考多进程加速功能。
启动业务进程长时间阻塞且knet_comm.log无错误日志输出
现象描述
启动业务进程长时间阻塞且knet_comm.log无错误日志输出。

原因
之前某个进程锁住了共享内存上的锁,然后异常退出导致未释放该锁,后续进程尝试申请该锁则会死锁。
处理步骤
上述问题可以通过两个方法解决:
- 方案1:关闭K-NET knet_mp_daemon进程以及所有的业务进程,然后重新启动,业务启动命令参见多进程加速功能。
- 方案2:将dpdk源码中的rte_spinlock_lock修改为pthread的锁实现,可以保证进程异常退出之后可以释放锁。
用户可以根据实际情况选择相应的方法。