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:
- http://eli.thegreenplace.net/2015/programmatic-access-to-the-call-stack-in-c/ - backtrace local con libunwind
- http://codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html
__builtin_return_address(N)
gcc vsbacktrace()
de glibcbacktrace()
vs backtrace local de libunwind - http://lucumr.pocoo.org/2014/10/30/dont-panic/ backtrace y desenrollarse en moho
- https://github.com/gperftools/gperftools/wiki/gperftools ''-stacktrace-captureuring-methods-and-their-issues mismo problema de backtracing en gperftools software-timer profiler library
Soporte enano para perf_events
/ perf
:
- https://lwn.net/Articles/499116/ [RFCv4 00/16] perf: Añadir atrás en el post enano relajarse, mayo de 2012
- https://lwn.net/Articles/507753/ [PATCHv7 00/17] perf: Añadir retroceder publicar enano desenrollar, Jul 2012
- https://wiki.linaro.org/LEG/Engineering/TOOLS/perf-callstack-unwinding - Desenrollado enano en ARM 7/8 para perf
- https://wiki.linaro.org/KenWerner/Sandbox/libunwind#libunwind_ARM_unwind_methods - métodos no enanos también
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?