Chinaunix

标题: 2.6 多核非抢占内核, 一个内核线程死循环,为何整个系统都死了似的? [打印本页]

作者: mordorwww    时间: 2013-03-25 18:51
标题: 2.6 多核非抢占内核, 一个内核线程死循环,为何整个系统都死了似的?
串口不响应, ssh也连不上去, web服务也基本不可用,当然, ping通倒是可以。

一个内核线程只会占一个CPU,其它的CPU不干活么?
作者: 瀚海书香    时间: 2013-03-25 20:50
回复 1# mordorwww
一个内核线程只会占一个CPU,其它的CPU不干活么?

这个内核线程都干什么事情?有没有可能持有资源永不释放的情况
   
作者: mordorwww    时间: 2013-03-26 09:24
瀚海书香 发表于 2013-03-25 20:50
回复 1# mordorwww

这个内核线程都干什么事情?有没有可能持有资源永不释放的情况


我写的一个简单的内核模块死循环线程做测试,啥也没干

看各CPU内核堆栈,除了一个cpu在内核线程里的死循环,其它CPU都在idle线程里
作者: 灌水菜鸟    时间: 2013-03-26 09:31
回复 3# mordorwww


指不定是在等什么东西呢,你去/proc里看看,那些个进程都在干吗呢?
作者: mordorwww    时间: 2013-03-26 09:34
灌水菜鸟 发表于 2013-03-26 09:31
回复 3# mordorwww


都死机了,看不了
作者: jeppeter    时间: 2013-03-26 11:35
回复 1# mordorwww


    无源码,无真相。
作者: mordorwww    时间: 2013-03-29 15:19
本帖最后由 mordorwww 于 2013-03-29 15:20 编辑

重新下载内核版本,配置成不可抢占内核,编译了个内核试验了下,在内核模块中启动线程死循环,双核下内核线程100%占用一个CPU,另外一个CPU idle,并不会导致系统不响应

也许是内核编译配置选项的不同导致那个系统不响应

仍然费解的是,模块卸载时会系统不响应了。
                     模块加载当前终端挂死(不影响其它,系统仍然正常响应),除非在内核线程死循环前sleep一下
作者: unbutun    时间: 2013-03-30 14:14
本帖最后由 unbutun 于 2013-03-30 14:15 编辑

看看ssh啥的任务是不是都在死循环那个核上呢,死循环没机会负载均衡,所以没法响应,串口中断一般挂在0核上,看看是不是关中断了

回复 1# mordorwww


   
作者: mordorwww    时间: 2013-04-03 18:48
unbutun 发表于 2013-03-30 14:14
看看ssh啥的任务是不是都在死循环那个核上呢,死循环没机会负载均衡,所以没法响应,串口中断一般挂在0核上 ...


所有的都死了, ssh, web server等等等,不可能所有进程都死循环,都等待资源吧
作者: unbutun    时间: 2013-04-04 20:39
好好想想,非抢占内核,在一个核上有一个进程发生死循环,本核runqueue上的其他进程能得到执行么?

回复 9# mordorwww


   
作者: jinuxstyle    时间: 2013-04-04 22:06
回复 1# mordorwww


    能ping通说明CPU对中断是有响应的,并且内核的TCP/IP相关内核线程获得了运行机会。那为什么ssh服务线程就没机会响应ssh的连接请求呢?难道与线程优先级有关?linux不是支持时间片轮转的调度吗,况且还是多核系统,确实让人费解。
作者: mordorwww    时间: 2013-04-07 11:54
unbutun 发表于 2013-04-04 20:39
好好想想,非抢占内核,在一个核上有一个进程发生死循环,本核runqueue上的其他进程能得到执行么?

回复 ...


问题是其它核呢
作者: 瀚海书香    时间: 2013-04-07 14:32
回复 12# mordorwww
如果本核心的runqueue的锁等资源被占用,其他核心无法从该核心迁移进程。

   
作者: mordorwww    时间: 2013-04-07 17:25
瀚海书香 发表于 2013-04-07 14:32
回复 12# mordorwww
如果本核心的runqueue的锁等资源被占用,其他核心无法从该核心迁移进程。




一般不会锁占用时间很长,除非是调度这部分代码有问题了

作者: 瀚海书香    时间: 2013-04-07 17:30
回复 14# mordorwww
建议贴一下代码,如果只是这样猜测的话,很难有结果的。

   
作者: mordorwww    时间: 2013-04-07 19:43
瀚海书香 发表于 2013-04-07 17:30
回复 14# mordorwww
建议贴一下代码,如果只是这样猜测的话,很难有结果的。



代码挺多,有内核模块代码,也有修改内核代码(内核回调新增函数)
编译配置选项有改,不知道这个会不会导致这类问题
作者: smalloc    时间: 2013-04-07 22:14
非抢占内核,应该只有一个进程进入内核态,多核也应该如此,否则就等于抢占内核了----进程的内核路径交替运行。
作者: junnyg    时间: 2013-04-14 00:22
回复 17# smalloc
不是吧,抢占开关在中断/异常返回内核态时生效,如果打开抢占,会在返回内核态前检查TIF_NEEDRESCHED标志,如果该标志被置位,则调用schedule函数进行进程切换;如果没有打开内核抢占,则不检查,直接返回。如果按你的说法,一个核在执行内核线程,其他核的线程将执行不了任何系统调用、异常/中断处理?

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2