particion memoria crear configurar acelerar linux-kernel perf flamegraph

linux kernel - memoria - ¿Cómo entiende la utilidad de rendimiento de linux los rastros de pila?



crear particion swap linux (1)

Hay una breve introducción sobre los rastros de pila en perf por Gregg: http://www.brendangregg.com/perf.html

4.4 Rastros de pila

Siempre compila con punteros de cuadro. Omitir punteros de marco es una optimización malvada del compilador que rompe los depuradores y, por desgracia, a menudo es la predeterminada. Sin ellos, puede ver acumulaciones incompletas de perf_events ... Hay dos maneras de solucionar esto: ya sea usando datos enanos para desenrollar la pila o devolviendo los punteros de cuadro.

Enano

Desde aproximadamente el kernel 3.9, perf_events ha respaldado una solución para los punteros de cuadro faltantes en las pilas de nivel de usuario: libunwind, que usa enano. Esto se puede habilitar usando "-g enano". ... optimizaciones del compilador ( -O2 ), que en este caso ha omitido el puntero del marco. ... recompilando ... con -fno-omit-frame-pointer :

Los lenguajes que no son de estilo C pueden tener un formato de marco diferente, o pueden omitir los punteros de marco también:

4.3. Símbolos JIT (Java, Node.js)

Los programas que tienen máquinas virtuales (VM), como la JVM de Java y la v8 del nodo, ejecutan su propio procesador virtual, que tiene su propia forma de ejecutar funciones y administrar pilas. Si los perfila usando perf_events, verá símbolos para el motor de VM. Perf_events tiene soporte JIT para resolver esto, que requiere que la VM mantenga un archivo /tmp/perf-PID.map para la traducción de símbolos.

Tenga en cuenta que Java puede no mostrar pilas completas para comenzar, debido a que el punto de acceso en x86 omite el puntero del marco (al igual que gcc). En las versiones más nuevas (JDK 8u60 +), puede usar la -XX:+PreserveFramePointer para corregir este comportamiento, ...

La publicación del blog de Gregg sobre Java y stack traces: http://techblog.netflix.com/2015/07/java-in-flames.html ("Fixing Frame Pointers" - corregido en algunas versiones de JDK8 y en JDK9 al agregar la opción inicio del programa)

Ahora, tus preguntas:

¿Cómo entiende la utilidad de rendimiento de linux los rastros de pila?

perf utilidad de perf básicamente (en las primeras versiones) solo analiza los datos devueltos del subsistema de kernel de Linux " perf_events " (oa veces " events "), a los que se accede con syscall perf_event_open . Para el seguimiento de pila de llamadas, hay opciones PERF_SAMPLE_CALLCHAIN / PERF_SAMPLE_STACK_USER :

sample_type PERF_SAMPLE_CALLCHAIN ​​Registra la cadena de llamada (stack backtrace).

PERF_SAMPLE_STACK_USER (since Linux 3.7) Records the user level stack, allowing stack unwinding.

¿El kernel de Linux comprende nativamente los rastros de pila?

Puede comprender (si está implementado) y no, según la arquitectura de su CPU. La función de muestreo (obtener / leer la pila de llamadas del proceso en vivo) callchain se define en la parte independiente de la arquitectura del núcleo como __weak con el cuerpo vacío:

http://lxr.free-electrons.com/source/kernel/events/callchain.c?v=4.4#L26

27 __weak void perf_callchain_kernel(struct perf_callchain_entry *entry, 28 struct pt_regs *regs) 29 { 30 } 31 32 __weak void perf_callchain_user(struct perf_callchain_entry *entry, 33 struct pt_regs *regs) 34 { 35 }

En 4.4 kernel user-space callchain sampler se redefine en la parte de kernel dependiente de la arquitectura para x86 / x86_64, ARC, SPARC, ARM / ARM64, Xtensa, Tilera TILE, PowerPC, Imagination Meta:

http://lxr.free-electrons.com/ident?v=4.4;i=perf_callchain_user

arch/x86/kernel/cpu/perf_event.c, line 2279 arch/arc/kernel/perf_event.c, line 72 arch/sparc/kernel/perf_event.c, line 1829 arch/arm/kernel/perf_callchain.c, line 62 arch/xtensa/kernel/perf_event.c, line 339 arch/tile/kernel/perf_event.c, line 995 arch/arm64/kernel/perf_callchain.c, line 109 arch/powerpc/perf/callchain.c, line 490 arch/metag/kernel/perf_callchain.c, line 59

La lectura de la cadena de llamadas desde la pila del usuario puede no ser trivial para algunas arquitecturas y / o algunos modos.

¿Qué arquitectura de CPU usas? ¿Qué idiomas y VM se usan?

¿Dónde puedo leer más acerca de cómo una herramienta puede introspectarse para acumular rastros de procesos, incluso si los procesos están escritos en idiomas completamente diferentes?

Puede probar gdb y / o depuradores para el lenguaje o la función backtrace de libc o soporte de desenrollado de solo lectura en libunwind (hay un ejemplo de rastreado local en libunwind , show_backtrace() ).

Es posible que tengan una mejor compatibilidad con el análisis sintáctico / mejor integración con la máquina virtual del idioma o con la información de desenrollado. Si gdb (con el comando backtrace ) u otros depuradores no pueden obtener rastros de pila del programa en ejecución, puede que no haya forma de obtener rastros de pila en absoluto.

Si pueden obtener el seguimiento de llamadas, pero el perf no puede (incluso después de -fno-omit-frame-pointer a compilar con -fno-omit-frame-pointer para C / C ++), puede ser posible agregar compatibilidad de dicha combinación de arquitectura + formato de marco en perf_events y perf .

Hay varios blogs con información sobre problemas y soluciones genéricos de backtracing:

Soporte enano para perf_events / perf :

La utilidad perf de Linux es utilizada por Brendan Gregg para generar flamegraphs para c / c ++, código jvm, código nodejs, etc.

¿El kernel de Linux comprende nativamente los rastros de pila? ¿Dónde puedo leer más acerca de cómo una herramienta puede introspectarse para acumular rastros de procesos, incluso si los procesos están escritos en idiomas completamente diferentes?