Linux下/proc文件同步延迟致看门狗机制异常的排查求助
看门狗机制重置命令延迟/丢失问题排查求助
实现的看门狗机制
- 内核模块:在
/proc文件中维护线程计数器列表,每秒递增每个计数器,当计数器达到最大值时,判定对应线程可能卡顿。 - 用户态程序:生成若干受内核模块监控的线程,每个线程每10秒通过向
/proc/counters写入特定字符串发送计数器重置命令,核心代码如下:
time_t timer = time(NULL); int n = 0; while (true) { if (time(NULL) >= timer + 10) { timer = time(NULL); char szData[64]; memset(szData, 0, 64); sprintf(szData, "s|%d|%s", tid, function_name); if ((n = strlen(szData)) > 0) { int t = 0; int fp = 0; while ((fp = open("/proc/counters", O_WRONLY | O_EXCL)) == -1 && errno == EACCESS) { if (++t > 4) { break; } usleep(260000); } if (fp == -1) { return 1; } write(fp, szData, n); close(fp); } } }
问题现象
理论上每个计数器最大值应为10,但实际部分计数器会达到20、30甚至更高。内核模块端显示重置命令未及时到达,后续会在1秒内收到多条延迟的命令:
/proc计数器文件内容示例
*856 7 20/600 thread_function_name
内核模块调试日志
Aug 26 11:16:38 XWEB-PRO kern.info kernel: [ 114.086453] register 856 Aug 26 11:16:38 XWEB-PRO kern.info kernel: [ 124.138523] register 856 Aug 26 11:16:58 XWEB-PRO kern.info kernel: [ 134.190508] register 856 Aug 26 11:16:58 XWEB-PRO kern.info kernel: [ 144.242274] register 856 Aug 26 11:16:58 XWEB-PRO kern.info kernel: [ 144.242277] register 856 Aug 26 11:17:08 XWEB-PRO kern.info kernel: [ 154.294433] register 856 Aug 26 11:17:28 XWEB-PRO kern.info kernel: [ 164.346516] register 856 Aug 26 11:17:28 XWEB-PRO kern.info kernel: [ 174.398552] register 856 Aug 26 11:17:38 XWEB-PRO kern.info kernel: [ 184.468022] register 856 Aug 26 11:17:48 XWEB-PRO kern.info kernel: [ 194.522241] register 856
从日志可见:本该11:16:48到达的命令缺失,11:16:58收到3条;11:17:18的命令缺失,11:17:28收到2条。已尝试fflush、fsync和sync,均无效,恳请指点排查方向。
内容的提问来源于stack exchange,提问作者bui3
相关产品推荐
相关产品推荐

