免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: mordorwww
打印 上一主题 下一主题

[进程管理] linux系统除了能ping通,啥也不行,看到内核挂在函数top_machine_cpu_stop上了 [复制链接]

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
11 [报告]
发表于 2014-01-23 22:04 来自手机 |只看该作者
楼主 第427行怎么挂住的,挂住了你还能单步调试?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
12 [报告]
发表于 2014-01-24 08:42 |只看该作者
gaojl0728 发表于 2014-01-23 22:04
楼主 第427行怎么挂住的,挂住了你还能单步调试?

同问,这个应该不是挂住了,而是一直在stop_machine中死循环执行relax,需要等待某个CPU执行完特定的任务(smdata->fn)之后才能退出。
所以,还请确认下具体现象,你的堆栈是如何打出来的?如何确认挂住了?

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
13 [报告]
发表于 2014-01-24 08:55 |只看该作者
是死循环,每次bt都在这里

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
14 [报告]
发表于 2014-01-24 09:12 |只看该作者
mordorwww 发表于 2014-01-24 08:55
是死循环,每次bt都在这里

你打的应该只是其中一个核吧?能否把其他核的堆栈都打出来,另外,能否吧smdata数据结构内容打出来?

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
15 [报告]
发表于 2014-01-24 10:32 |只看该作者
四个核都这样

(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
[Switching to Thread 1]
0xc10a47bb in stop_machine_cpu_stop (data=0xcbe97efc) at kernel/stop_machine.c:443
443             } while (curstate != STOPMACHINE_EXIT);
(gdb) p curstate
$1 = STOPMACHINE_PREPARE
(gdb) p smdata->state
$2 = STOPMACHINE_PREPARE
(gdb) p smdata
$3 = (struct stop_machine_data *) 0xcbe97efc
(gdb) p *smdata
$4 = {fn = 0xc1085020 <change_clocksource>, data = 0xc19411a0, num_threads = 4, active_cpus = 0x0, state = STOPMACHINE_PREPARE,
  thread_ack = {counter = 1}}
(gdb)

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
16 [报告]
发表于 2014-01-24 14:57 |只看该作者
mordorwww 发表于 2014-01-24 10:32
四个核都这样

(gdb) c

分析了一下,简单总结下问题的来由:(推断)
由于一个核死锁,导致该核的时钟源unstable(具体算法未深入研究),而内核初始化时为相应的时钟源设置了watchdog(0.5秒触发一次),
在watchdog中检测到时钟unstable时,会通过stop_machine发起change_clocksource操作,stop_machine的作用就是:
让指定的cpu执行指定的操作,而将其他的CPU都stop下来(实际就是让其他CPU都死循环执行relax,啥事不干),以防止执行操作的cpu跟其他
cpu的竞争,内核中有很多地方都用到了。
而stop_machine需要所有的核同步后才从上一个状态切换到下一个状态,因为stop_machine是通过migration内核线程执行的,由于一个核死锁,
导致该migration线程得不到调度,最终导致该核始终无法正常执行stop_machine操作,导致无法同步,而最终导致其他核一直挂在stop_machine
的relax的死循环中,导致其他核一起死锁,而由于当前的stop_machine状态仍保持为STOPMACHINE_PREPARE,还未进入STOPMACHINE_DISABLE_IRQ
状态,所以,此时系统还未关中断和抢占,所以仍能ping通。
大致流程如下:
clocksource_start_watchdog-->clocksource_watchdog-clocksource_unstable-->clocksource_watchdog_work-->clocksource_watchdog_kthread-->clocksource_select-->timekeeping_notify-->stop_machine(change_clocksource, clock, NULL)-->stop_machine_cpu_stop

剩下的疑问:理论上分析,应该不会4个核都阻塞在stop_machine中才对,应该有一个核还在最初死锁中,否则就是内核有bug了,还请确认下。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
17 [报告]
发表于 2014-01-24 18:04 |只看该作者
4个CPU都在死循环,内核哪有空处理ping包啊。 我觉得楼主提供的信息不全面有问题啊,无法自圆其说。

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
18 [报告]
发表于 2014-01-24 18:06 |只看该作者
回复 17# gaojl0728


    开中断了可能就行。没注意。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
19 [报告]
发表于 2014-01-26 08:25 |只看该作者
gaojl0728 发表于 2014-01-24 18:04
4个CPU都在死循环,内核哪有空处理ping包啊。 我觉得楼主提供的信息不全面有问题啊,无法自圆其说。

应该没有关中断,所以ping包还能响应,但从目前的分析看,应该不是4个核都死锁在stop_machine的流程中才对,还需要楼主提供每个CPU上的堆栈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP