Tengo un par de procesos que están consumiendo mucho tiempo de CPU del sistema (según lo determinado al mirar vmstat). ¿Hay una manera fácil de averiguar qué tipo de llamadas al sistema se están realizando?
Sé que hay strace, pero ¿hay una manera más rápida y fácil? ¿Existe algo así como un "top" para las llamadas al sistema?
linux
performance
monitoring
central-processing-unit
strace
bajafresh4life
fuente
fuente
Respuestas:
Creo que estar cerca de la
-c
bandera es probablemente lo más cercano que conozco. Si no ha usado la-c
bandera, intente esto:Donde 12345 es el ID de proceso (PID) del proceso en cuestión. Tenga en cuenta que dividir un proceso agrega una sobrecarga adicional, por lo que mientras lo rastrea, el proceso se ejecutará más lentamente.
Después de ejecutar eso durante el tiempo que desee recopilar datos, presione
Ctrl-C
para detener la recopilación de datos y generar los resultados. Producirá algo como esto:Como puede ver, este es un desglose de todas las llamadas al sistema realizadas por la aplicación, ordenadas por tiempo total e incluyendo el tiempo promedio por llamada y el número de llamadas para cada llamada al sistema. Si desea ordenarlos de manera diferente, consulte la página de manual de strace, ya que hay un par de opciones.
fuente
Quizás pruebe uno de los perfiladores de muestreo, como oprofile, o para núcleos más nuevos, perf. Si tienes suerte, "perf top" podría decirte exactamente lo que quieres. Vea aquí algunos ejemplos.
fuente
El tipo de interruptores strace que tiendo a usar es este.
strace -ffttT -p pid -o /tmp/strace.out
Un ejemplo de esto sería,
Verá la diferencia horaria en el lado derecho de la llamada del sistema que muestra cuánto tiempo ha llevado pasar de una llamada del sistema a otra.
Le detectará la diferencia horaria entre las llamadas del sistema. Entonces, cuando ve que una llamada del sistema tiene un intervalo de unos segundos con la siguiente llamada del sistema, entonces está haciendo algo de ruido.
Otro método es coredumplo con gcore. Sin embargo, eso requiere un poco de experiencia para navegar a través de gdb.
Pero, si el subproceso es un subproceso del núcleo, entonces no se puede dividir o coredump. En ese caso, tenemos que usar algo más complejo. En el kernel RHEL5, utilizamos oprofile. En RHEL6, utilizamos perf. Prefiero perf sobre oprofile. Los datos de rendimiento se pueden recopilar con un formato similar al gráfico que muestra la llamada al sistema donde se utiliza el porcentaje máximo de CPU.
Con una prueba de rendimiento, veo esto.
Muestra la función del núcleo donde se está gastando el 38% del tiempo de CPU. Ahora, podemos verificar la función y ver qué está haciendo y qué se supone que debe hacer.
Con algunos ejemplos, no es tan difícil.
fuente