1. 升级卡住 sSV 控制面
2. 查看升级日志 /sf/log/today/update.log,卡在如下任务
3. ps 看下是什么任务,pstree 追踪是什么子任务
ps auxf|grep restart
pstree -asp <pid> # pid 是上图拿到的
4. 看 vn-node-agent 日志(/sf/log/today/vn/vn-node-agent-rpc.log),发现卡在和 cfgdb 通信超时;
继续看 cfgdb 日志(/sf/log/today/cfgdb.log),发现卡在和 locald 通信超时
5. 看 locald 的堆栈,卡在 tty 写日志
ps aux|grep locald # 拿到 pid
cat /proc/pid/stack
当时在进行原地热升级,会重启rsyslogd,而升级过程中VN的一些服务是通过openlog接口来输出日志的,正常情况下输出的日志会由rsyslogd处理,但是由于这个进程重启了,在重启期间,日志会输出到/dev/console控制台,对应就是就是/dev/tty7,查看这个tty7的状态发现,这个tty7被stop了,导致monitord在往这个控制台输出日志时被阻塞,而这个monitord进程此时正拿着tty7的atomic_write_lock和读信号量,其中atomic_write_lock导致了lldpad进程阻塞,而着lldpad进程也拿个tty7的一个读信号量。
因为持有读信号量的进程被阻塞,导致menuconfigd进程在申请写信号量时也被阻塞了,阻塞前menuconfigd进程拿个tty7的legacy_mutex锁,因为写者被阻塞,后面来的读者locald申请tty7的读信号量时也被阻塞了,此外dialog进程阻塞在legacy_mutex上
分析tty7被stop的原因,根据它的内部状态,应该是接收到了特殊字符。
临时解决方案:
当前卡住的主机,执行:
container_exec -n vn-a -c '/sf/vn/etc/init.d/sdn.sh restart'
然后查看服务是否启动完成:
container_exec -n vn-a -c '/sf/vn/etc/init.d/sdn.sh status'
1. 后台关闭维护模式(mv /cfs/cluster_protect.json /sf/data/local)(可选,重启主机才需要做)
2. 把当前主机上的虚拟机迁移到其他主机上(如不影响业务,可关机开机)
3. 重启主机
4. 重启主机之后,等待虚拟存储正在同步数据
5. 同步完成后,再把维护模式标记文件挪回去(mv /sf/data/local/cluster_protect.json /cfs)
6. 重试升级
永久解决方案:
该问题在 HCI6.10.0 已解决,以前的版本有合集补丁(可以看下合集补丁修复问题列表中有没有该问题(关键字:数据面进程偶现写日志卡住问题),如果没有,找VN技术支持确认)