【求助】OOM的时候kill进程失败
发生OOM的时候使用force_sig向进程发送SIGKILL,结果进程并没有终止,一直在task list里面,导致内存不能释放,系统卡住。有人遇到过这样的问题? 最终结果这个进程状态是不是ZOMBIE状态? 进程是不是只有在被调度之后才能响应信号? 回复 2# kerryxi
状态是D,不是Z,看起来好像进程一直没有被调度,所以一直没有退出。
回复 3# nswcfd
是的,只有被调度之后才能响应信号,现在看起来就是进程没有被调度。
现在我发完SIGKILL之后,强制修改进程状态为TASK_INTERRUPTIBLE,设置优先级最高,如果当前进程不是要被kill的进程就执行schedule(),有所改善,但有时候还是会卡住。 D是在等待外部事件,只能被所等待的事件源来wakeup,调度器帮不了忙。
这个进程在等待什么?可以看看ps/top看看其wait address / wchan。 回复 6# nswcfd
请教下,wait address要怎么看? ps -O wchan #-O 增加输出列
top -> f(选列) -> y(选择wchan) 方法1:cat /proc//wchan
只能看到最后的address
方法2:
echo 't' > /proc/sysrq-trigger
能够在dmesg里面看到所有任务的堆栈
方法3:
cat /proc//stack
这个在早期的linux UP kernel能够显示,在SMP下面需要修改内核stack的代码,就能够看到完整的堆栈
回复 6# nswcfd
非常感谢,知道在哪里可以看到wait address了。
前段时间事情太多,这个问题就搁置了一段时间,现在继续跟进这个问题。
我这里出现卡死的时候这个系统都不响应了,所以我改了内核,在卡死的时候直接把wait address打印出来,目前正在调试,还没抓到地址,比较怀疑是卡在磁盘IO,因为我们这个进程需要较多磁盘操作。
再请教下,如果我找到了wait address,有办法**这个进程,进而将其kill吗?
页:
[1]
2