¿Cómo saber la razón de un proceso que va a dormir y despertarlo?


19

Cuando hago 'top', veo mi proceso de script perl en estado 'S'. ¿Hay alguna manera de saber qué hace que este proceso de perl duerma y cómo despertarlo? Cualquier forma de depurar para dar más información sobre las líneas en el script de Perl haciendo que vaya en estado 'S'.

Respuestas:


22

Un proceso en Sestado generalmente se encuentra en una llamada del sistema de bloqueo, como leer o escribir en un archivo o la red, o esperar a que termine otro programa llamado.

Puede usar strace -p <pid>para averiguar qué llamada al sistema está sucediendo actualmente. Producirá resultados como

escribir (1, "foobar" ..., 4096

lo que significa que el proceso está tratando de escribir 4096 bytes comenzando con "foobar" en stdout (fd # 1) pero todo lo que se ha redirigido está ocupado y el búfer de salida está lleno.


5

Los procesos pasan a estado de suspensión cuando esperan algo, generalmente E / S.

Su proceso estará en Sestado cuando esté haciendo lecturas y posiblemente escrituras que estén bloqueando. También puede ocurrir mientras espera semáforos u otras primitivas de sincronización.

No puede "despertarlo", solo continuará cuando los datos / recursos que está esperando estén disponibles.

Todo esto es normal y esperado, y no suele ser un problema. Normalmente, este "programa" se ejecuta en la línea de comando sin archivo:

while (<>) { print; }

pasará la mayor parte de su tiempo en estado de suspensión, lo cual es bueno: no querrá que desperdicie CPU mientras espera la entrada del usuario.

Si cree que esto es un problema, intente cambiar la forma en que realiza su E / S (leer fragmentos más grandes, en buenos múltiplos del tamaño del bloque del dispositivo subyacente, realizar E / S mapeadas en memoria, etc.).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.