- 故障概述
- 故障现象:系统终端出现 “watchdog:BUG:soft lockup - CPU#21” 等报警信息,表明系统在运行过程中出现了软锁死现象,且影响到了 CPU#21。
- 故障时间:根据日志记录,故障发生在特定的时间点,具体时间可参考相关日志信息。
- 故障分析
- 内核信息
- 函数调用链路:通过对内核日志的分析,发现 soft lockup 时的调用链路为
inotify_add_watch -> entry_SYSCALL_64_after_hwframe -> do_syscall_64 -> x64_sys_inotify_add_watch -> inotify_update_watch -> fsnotify_add_mark_locked -> fsnotify_update_child_dentry_flags
,该链路表明问题可能出现在文件监控的fsnotify
机制中。 - 关键函数分析
__fsnotify_update_child_dentry_flags
函数:在该函数内部,通过遍历目录的dentry
来更新子目录的标志位。在某些情况下,如目录下存在大量的无效dentry
(negative dentry),可能会导致函数执行耗时过长,从而引发软锁死。spin_lock
操作:在__fsnotify_update_child_dentry_flags
函数中,使用了spin_lock(&inode->i_lock)
来获取锁,若某个进程长时间持有该锁,其他进程在尝试获取锁时会导致自旋等待,消耗大量 CPU 资源,可能导致软锁死。
- 函数调用链路:通过对内核日志的分析,发现 soft lockup 时的调用链路为
- 系统环境
- 硬件资源:服务器的硬件配置可能会影响系统的性能和稳定性。例如,CPU 的性能、内存大小等因素可能与软锁死问题有关。
- 软件环境
- 内核版本:不同版本的内核在文件监控机制的实现上可能存在差异,可能会导致一些潜在的问题。
- 文件系统:文件系统的特性和配置也可能对文件监控产生影响。例如,dentry cache 的管理方式、inode 的使用情况等。
- 业务场景
- 文件监控操作:根据日志描述,业务场景中涉及到对特定目录的频繁文件创建和删除操作,如在
/path/to/problem
目录中创建随机文件名的文件然后删除,且频繁重复这一动作。这种操作可能会导致目录下的dentry
数量增加,尤其是大量的negative dentry
,从而影响文件监控的性能和稳定性。 - 监控范围变化:文件监控服务的监控范围发生了变更,可能导致对某些目录的监控增加,进而引发了软锁死问题。
- 文件监控操作:根据日志描述,业务场景中涉及到对特定目录的频繁文件创建和删除操作,如在
- 内核信息
- 问题解决思路
- 临时解决措施
- 清理缓存:通过执行
echo 2 > /proc/sys/vm/drop_caches
命令清空dentry cache
,可以暂时解决软锁死问题。但该操作可能会影响系统性能,应作为应急方案使用。
- 清理缓存:通过执行
- 长期解决措施
- 监控目标取舍:在文件监控服务中,应根据业务情况对监控目标进行取舍,避免对某些频繁进行文件创建和删除操作的目录进行监控,将其加入黑名单。
- 优化文件监控逻辑
- 减少遍历:优化
__fsnotify_update_child_dentry_flags
函数的遍历逻辑,避免对大量无效dentry
进行不必要的操作,减少函数执行时间。 - 锁管理:确保
spin_lock
的正确使用,避免进程长时间持有锁,导致其他进程无法获取锁而出现自旋等待。
- 减少遍历:优化
- 临时解决措施
- 总结
- 本次故障是由于文件监控过程中
fsnotify
机制的某些问题导致的,主要与dentry
管理和spin_lock
使用有关。通过对内核日志和函数调用链路的分析,定位了问题的根源,并提出了相应的解决思路。 - 在实际应用中,应注意监控业务的特点,合理配置文件监控参数,避免出现类似的问题。同时,对于 Linux 系统的内核机制应有深入的了解,以便更好地解决系统运行中出现的各种问题。
- 本次故障是由于文件监控过程中
系统终端输出 “watchdog:BUG:soft lockup - CPU#21” __fsnotify_update_child_dentry_flags
猜你喜欢
转载自blog.csdn.net/qq_40797754/article/details/143182596
今日推荐
周排行