SysRq, lista de tarefas e processos ausentes

3

Eu tenho resolvido um problema bastante difícil no Linux, onde uma JVM parece travar. Como parte da investigação, tenho tentado capturar a lista de tarefas atuais e seu estado usando um dos comandos sysrq "mágicos":

echo t > / proc / sysrq-trigger

O que é surpreendente é que, se eu fizer isso em um sistema saudável, receberei uma lista completa de todos os processos, seu estado e pilha de chamadas atual. Quando faço isso com um sistema "não íntegro" (ou seja, aquele em que a JVM está pendurada de alguma forma), alguns processos estão ausentes. Por exemplo, o processo pai do meu aplicativo Java multithreaded não está sendo relatado. Isso torna muito difícil tirar conclusões, já que não consigo ter uma visão exata do que está acontecendo.

Alguém sabe se há condições em que um processo pode ser excluído desse relatório?

Obrigado!

    
por torngat 21.04.2011 / 22:52

1 resposta

1

A JVM está suspensa porque está tentando gravar em um processo que não está mais lá? Olhando para o código linux-source-2.6.38, o gatilho sysrq apenas chama:

/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 }

Quais chamadas:

/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 }

Não há nenhum filtro lá, por isso imprime tudo o que sugere que o pai desapareceu. Você executou lsof ou ps e verificou que ainda está em execução?

    
por 18.09.2011 / 02:39

Tags