2015-12-09 2 views
2

Nous travaillons sur un système Linux embarqué utilisant Live555 WIS-Streamer pour diffuser de la vidéo sur RTSP sur un réseau.Diagnostic d'un processus bloqué à l'état D (IO ininterrompu/bloqué)

Sur un système particulier, nous voyons WIS-Streamer se coincer dans un état TASK_UNINTERRUPTIBLE; À partir de la ligne de commande: l'état ps du processus est représenté par DW, les enfants du processus WIS sont tous répertoriés sous la forme Z.

Il semble qu'il n'y ait rien que nous puissions faire une fois que nous sommes dans cet état, autre que le redémarrage (non souhaitable). Cependant, nous aimerions vraiment aller à la cause première de ceci - je suspecte que dans le serpentin il accroche sur un appel send bloquant ou quelque chose. Y a-t-il quelque chose que nous pouvons faire, soit dans le code, soit via la ligne de commande, etc. pour essayer d'affiner ce qui est bloqué?

Par exemple, j'ai essayé de regarder la sortie de netstat (netstat -alp) pour voir s'il y a des sockets pendantes attachées au PID du thread bloqué/zombie mais en vain.

Mise à jour avec plus d'informations:

Ce n'est pas rosser la CPU, top listes bloquées & fils de zombie comme 0% mem/0% CPU/VSZ 0.

D'autres choses que j'ai essayé poking sur le système:

/proc/état/pour les principaux sujets de l'enfant & 546 est le parent, qui est bloqué: 01

$> cat /proc/546/stat  
Name: wis-streamer 
State: D (disk sleep) 
Tgid: 546 
Pid: 546 
PPid: 1 
TracerPid:  0 
Uid: 0  0  0  0 
Gid: 0  0  0  0 
FDSize: 0 
Groups: 
Threads:  1 
SigQ: 17/353 
SigPnd: 0000000000000000 
ShdPnd: 0000000000004102 
SigBlk: 0000000000000000 
SigIgn: 0000000000001004 
SigCgt: 0000000180006a02 
CapInh: 0000000000000000 
CapPrm: ffffffffffffffff 
CapEff: ffffffffffffffff 
CapBnd: ffffffffffffffff 
Cpus_allowed: 1 
Cpus_allowed_list:  0 
voluntary_ctxt_switches:  997329 
nonvoluntary_ctxt_switches:  2428751 

Enfants:

Name: wis-streamer 
State: Z (zombie) 
Tgid: 581 
Pid: 581 
PPid: 546 
TracerPid:  0 
Uid: 0  0  0  0 
Gid: 0  0  0  0 
FDSize: 0 
Groups: 
Threads:  1 
SigQ: 17/353 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000102 
SigBlk: 0000000000000000 
SigIgn: 0000000000001004 
SigCgt: 0000000180006a02 
CapInh: 0000000000000000 
CapPrm: ffffffffffffffff 
CapEff: ffffffffffffffff 
CapBnd: ffffffffffffffff 
Cpus_allowed: 1 
Cpus_allowed_list:  0 
voluntary_ctxt_switches:  856676 
nonvoluntary_ctxt_switches:  15626 

Name: wis-streamer 
State: Z (zombie) 
Tgid: 582 
Pid: 582 
PPid: 546 
TracerPid:  0 
Uid: 0  0  0  0 
Gid: 0  0  0  0 
FDSize: 0 
Groups: 
Threads:  1 
SigQ: 17/353 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000102 
SigBlk: 0000000000000000 
SigIgn: 0000000000001004 
SigCgt: 0000000180006a02 
CapInh: 0000000000000000 
CapPrm: ffffffffffffffff 
CapEff: ffffffffffffffff 
CapBnd: ffffffffffffffff 
Cpus_allowed: 1 
Cpus_allowed_list:  0 
voluntary_ctxt_switches:  856441 
nonvoluntary_ctxt_switches:  15694 


Name: wis-streamer 
State: Z (zombie) 
Tgid: 583 
Pid: 583 
PPid: 546 
TracerPid:  0 
Uid: 0  0  0  0 
Gid: 0  0  0  0 
FDSize: 0 
Groups: 
Threads:  1 
SigQ: 17/353 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000102 
SigBlk: 0000000000000000 
SigIgn: 0000000000001004 
SigCgt: 0000000180006a02 
CapInh: 0000000000000000 
CapPrm: ffffffffffffffff 
CapEff: ffffffffffffffff 
CapBnd: ffffffffffffffff 
Cpus_allowed: 1 
Cpus_allowed_list:  0 
voluntary_ctxt_switches:  856422 
nonvoluntary_ctxt_switches:  15837 


Name: wis-streamer 
State: Z (zombie) 
Tgid: 584 
Pid: 584 
PPid: 546 
TracerPid:  0 
Uid: 0  0  0  0 
Gid: 0  0  0  0 
FDSize: 0 
Groups: 
Threads:  1 
SigQ: 17/353 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000102 
SigBlk: 0000000000000000 
SigIgn: 0000000000001004 
SigCgt: 0000000180006a02 
CapInh: 0000000000000000 
CapPrm: ffffffffffffffff 
CapEff: ffffffffffffffff 
CapBnd: ffffffffffffffff 
Cpus_allowed: 1 
Cpus_allowed_list:  0 
voluntary_ctxt_switches:  856339 
nonvoluntary_ctxt_switches:  15500 

Autres choses de /proc/ filesys:

$> cat /proc/546/personality 
00c00000 
$> cat /proc/546/stat 
546 (wis-streamer) D 1 453 453 0 -1 4194564 391 0 135 0 140098 232409 0 0 20 0 1 0 1094 0 0 4294967295 0 0 0 0 0 0 0 4100 27138 3223605768 0 0 17 0 0 0 0 0 0 

Mise à jour sur la mise à jour:

J'ai le sentiment qu'une file d'attente de messages SysV IPC ou un appel de sémaphore peut être tel suspendus - notre système est maintenu ensemble par des files d'attente de messages inter-processus (au moins 40% ne sont pas inventés ici, écrits par Elbonian Code Slaves dans le cadre d'un horrible SDK horrible) qui peuvent piéger les imprudents. J'ai re-jigged quelques routines de sémaphore get/release que je soupçonne étaient moins que complètement wateright (en fait probablement juste juste l'écureuil-preuve) et garderons un oeil sur les choses - malheureusement il faut en moyenne 12 heures de course sur une très configuration d'essai particulière pour induire cette défaillance.

+0

Pouvez-vous exécuter le processus dans GDB? Vous pouvez également le contrôler en utilisant 'strace' pour voir quels sont les derniers appels système qu'il a utilisés. – alnet

+0

La réponse à ces deux questions est "pas facile" - le système est un système embarqué, exécutant Busybox (un système Linux très réduit avec des fonctionnalités limitées) donc nous n'avons pas strace ou GDB et leur ajout pourrait être un gros problème . –

+0

Vous pouvez également utiliser des impressions de journal dans votre processus pour vérifier si vous êtes pile dans un endroit que vous pensez. – alnet

Répondre

2

De l'Documentation for sysrq:

'w' - tâches Dumps qui sont dans un état ininterruptible (bloqué).


echo w >/proc/sysrq-trigger 

affiche des informations détaillées sur la tâche bloquée (s) sur la console (devrait également être visible à travers dmesg); en particulier, la trace de la pile du noyau est utile pour éclairer le problème.