bfdhczw 发表于 2015-11-12 22:48

【求助】OOM的时候kill进程失败

发生OOM的时候使用force_sig向进程发送SIGKILL,结果进程并没有终止,一直在task list里面,导致内存不能释放,系统卡住。

有人遇到过这样的问题?

kerryxi 发表于 2015-11-30 22:18

最终结果这个进程状态是不是ZOMBIE状态?

nswcfd 发表于 2015-12-02 11:34

进程是不是只有在被调度之后才能响应信号?

bfdhczw 发表于 2015-12-03 13:44

回复 2# kerryxi

状态是D,不是Z,看起来好像进程一直没有被调度,所以一直没有退出。
   

bfdhczw 发表于 2015-12-03 13:47

回复 3# nswcfd


    是的,只有被调度之后才能响应信号,现在看起来就是进程没有被调度。
现在我发完SIGKILL之后,强制修改进程状态为TASK_INTERRUPTIBLE,设置优先级最高,如果当前进程不是要被kill的进程就执行schedule(),有所改善,但有时候还是会卡住。

nswcfd 发表于 2015-12-03 17:46

D是在等待外部事件,只能被所等待的事件源来wakeup,调度器帮不了忙。
这个进程在等待什么?可以看看ps/top看看其wait address / wchan。

bfdhczw 发表于 2015-12-07 16:29

回复 6# nswcfd


    请教下,wait address要怎么看?

nswcfd 发表于 2015-12-08 16:16

ps -O wchan #-O 增加输出列

top -> f(选列) -> y(选择wchan)

kerryxi 发表于 2015-12-08 21:18

方法1:cat /proc//wchan
只能看到最后的address

方法2:
echo 't' > /proc/sysrq-trigger
能够在dmesg里面看到所有任务的堆栈

方法3:
cat /proc//stack
这个在早期的linux UP kernel能够显示,在SMP下面需要修改内核stack的代码,就能够看到完整的堆栈

bfdhczw 发表于 2015-12-21 16:20

回复 6# nswcfd


    非常感谢,知道在哪里可以看到wait address了。

前段时间事情太多,这个问题就搁置了一段时间,现在继续跟进这个问题。

我这里出现卡死的时候这个系统都不响应了,所以我改了内核,在卡死的时候直接把wait address打印出来,目前正在调试,还没抓到地址,比较怀疑是卡在磁盘IO,因为我们这个进程需要较多磁盘操作。

再请教下,如果我找到了wait address,有办法**这个进程,进而将其kill吗?
页: [1] 2
查看完整版本: 【求助】OOM的时候kill进程失败