問題現象:當前集群跑hadoop的時候,,任務失敗,但是跑任務的容器沒有正常退出,顯示一大堆的YarcChild進程,,more /proc/進程/status 查看其狀態,進程為D(disk sleep),當使用ps 查看所有D進程狀態的時候,執行ps這個命令的進程也變成了D狀態,,尬的一批。所謂D狀態就是不可中斷的狀態,處於該狀態下的進程不接受任何發給他的信號,通常導致該情況產生的原因是由於長時間等待IO導致的,一般的處理方法是reboot,但是生成環境服務器,還是大量的機器有處於D狀態的進程,,進行reboot是不可取的。
1、在Linux下創建一個killd.c文件,該文件的信息如下:
#include <linux/init.h> #include <linux/kernel.h> /*Needed by all modules*/ #include <linux/module.h> #include <linux/sched.h> //for_each_process MODULE_LICENSE("BSD"); static int pid = -1; module_param(pid, int, S_IRUGO); static int killd_init(void) { struct task_struct * p; printk(KERN_ALERT "killd: force D status process to death/n"); printk(KERN_ALERT "killd: pid=%d/n", pid); //read_lock(&tasklist_lock); for_each_process(p){ if(p->pid == pid){ printk("killd: found/n"); set_task_state(p, TASK_STOPPED); printk(KERN_ALERT "killd: aha, dead already/n"); return 0; } } printk("not found"); //read_unlock(&tasklist_lock); return 0; } static void killd_exit(void) { printk(KERN_ALERT "killd: bye/n"); } module_init(killd_init); module_exit(killd_exit);
2、同路徑下創建Makefile文件,內容如下:
obj-m := killd.o all : $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules //最前面的空格必須是tab鍵生產,否則編譯產生錯誤Makefile:3: *** missing separator. Stop. clean: $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
3、在當前目錄下執行make
執行報錯,如下:
make -C /lib/modules/3.10.0-957.5.1.el7.x86_64/build M=/data1/c-make modules make: *** /lib/modules/3.10.0-957.5.1.el7.x86_64/build: No such file or directory. Stop. make: *** [all] Error 2
提示沒有文件
4、進入/usr/src/kernels/下看有沒有相應的內核開發包,沒有,就安裝,若有跳過第一步
UNAME=$(uname -r)
yum install gcc kernel-devel-${UNAME%.*}
正常情況下安裝完成以后就可以正常編譯了,如果不行,創建軟連接
ln -s /usr/src/kernels/3.10.0-957.5.1.el7.x86_64/ /lib/modules/3.10.0-957.5.1.el7.x86_64/build/
5、插入模塊的時候提供D狀態的進程號,就可以將其轉換為t狀態,使用普通kill就可以殺死。
sudo insmod ./killd.ko pid=1234
借鑒:
https://blog.csdn.net/u012343297/article/details/79141878
https://blog.csdn.net/VincentLuo91/article/details/72625446