Назад | Перейти на главную страницу

SysRq, список задач и отсутствующие процессы

Я устранял довольно сложную проблему в Linux, когда казалось, что JVM зависает. В рамках расследования я пытался получить список текущих задач и их состояние с помощью одной из «волшебных» команд sysrq:

эхо т> / proc / sysrq-trigger

Что удивительно, если я делаю это в здоровой системе, я получаю полный список всех процессов, их состояния и текущего стека вызовов. Когда я делаю это с «нездоровой» системой (то есть с той, где JVM каким-то образом зависла), некоторые процессы отсутствуют. Например, о родительском процессе моего многопоточного приложения Java вообще не сообщается. Из-за этого очень сложно делать какие-либо выводы, поскольку я не могу получить точный снимок того, что происходит.

Кто-нибудь знает, есть ли условия, при которых процесс может быть исключен из этого отчета?

Спасибо!

JVM зависает, потому что пытается писать в процесс, которого больше нет? Взглянув на код linux-source-2.6.38, триггер sysrq просто вызывает:

/linux-source-2.6.38/include/linux/sched.h
283 /*
284  * Only dump TASK_* tasks. (0 for all tasks)
285  */
286 extern void show_state_filter(unsigned long state_filter);
287 
288 static inline void show_state(void)
289 {
290         show_state_filter(0);
291 }

Какие звонки:

/linux-source-2.6.38/kernel/sched.c
5485 void show_state_filter(unsigned long state_filter)
5486 {
5487         struct task_struct *g, *p;
5488 
5489 #if BITS_PER_LONG == 32
5490         printk(KERN_INFO
5491                 "  task                PC stack   pid father\n");
5492 #else
5493         printk(KERN_INFO
5494                 "  task                        PC stack   pid father\n");
5495 #endif
5496         read_lock(&tasklist_lock);
5497         do_each_thread(g, p) {
5498                 /*
5499                  * reset the NMI-timeout, listing all files on a slow
5500                  * console might take alot of time:
5501                  */
5502                 touch_nmi_watchdog();
5503                 if (!state_filter || (p->state & state_filter))
5504                         sched_show_task(p);
5505         } while_each_thread(g, p);
5506 
5507         touch_all_softlockup_watchdogs();
5508 
5509 #ifdef CONFIG_SCHED_DEBUG
5510         sysrq_sched_debug_show();
5511 #endif
5512         read_unlock(&tasklist_lock);
5513         /*
5514          * Only show locks if all tasks are dumped:
5515          */
5516         if (!state_filter)
5517                 debug_show_all_locks();
5518 }

Здесь нет никаких фильтров, поэтому он печатает все, что предполагает, что родительский элемент исчез. Вы запустили lsof или ps и убедились, что он все еще работает?