Cómo utilizar Oprofile para crear perfiles de software
Introducción a I.Oprofile
La creación de perfiles es un resumen o análisis formal de datos sobre diferentes características de rendimiento, generalmente en forma de gráfico. Proporciona el porcentaje o la cantidad de muestras recopiladas para un evento de procesador específico, como la tasa de errores de caché, la tasa de errores de TLB, etc. El objetivo principal de la creación de perfiles es conocer el rendimiento del procesador. En términos generales, el objetivo principal es identificar cuellos de botella en el rendimiento del software y luego realizar optimizaciones específicas para mejorar el rendimiento general del software.
Oprofile es una de varias herramientas de supervisión del rendimiento y creación de perfiles para Linux. Funciona en diferentes arquitecturas, incluidas ARM, PowerPC, MIPS, IA32, IA64, AMD Athlon y más. Tiene muy poca sobrecarga y se ha incluido en el kernel de Linux desde la versión 2.6 de Linux.
Oprofile recopila información sobre eventos del procesador para ayudar a los usuarios a identificar problemas como desarrollo de bucles, bajo uso de caché, conversiones de tipos ineficientes y operaciones redundantes, y transferencias mal previstas. Oprofile es una herramienta detallada que recopila muestras de conjuntos de instrucciones, funciones, llamadas al sistema o rutinas de manejo de interrupciones. Oprofile funciona mediante muestreo. Utilizando los datos de evaluación recopilados, los usuarios pueden identificar fácilmente problemas de desempeño.
Al monitorear los eventos del hardware de la CPU, Oprofile puede perfilar todo el sistema Linux en tiempo de ejecución, incluido el kernel de Linux (incluidos módulos y controladores de interrupciones), bibliotecas compartidas o aplicaciones.
A partir de la versión 0.9.8, oprofile admite el modo de creación de perfiles Perf_events. La aplicación oprof controla el proceso de creación de perfiles; en modo heredado, esto se realiza a través del script opcontrol y el demonio oprofiled. Con operf, los usuarios pueden configurar sus aplicaciones como un usuario normal, pero si es necesario configurar todo el sistema, aún se requieren privilegios de root.
Si el hardware no admite el uso de contadores de rendimiento por parte de OProfile, entonces OProfile solo puede funcionar en modo temporizador, y el modo temporizador solo puede usarse en el modo de creación de perfiles tradicional, es decir, solo puede ser controlado por el script de control de operación.
Las características de Oprofile son: código de apilamiento (JIT). Puede generar perfiles de todo el sistema. Puede observar detalles dentro de la CPU, como las tasas de errores de caché. Puede anotar múltiples códigos fuente. instrucciones La creación de perfiles de nivel genera perfiles de gráficos de llamadas
Pero OProfile no es una panacea, tiene sus limitaciones: la generación de perfiles de gráficos de llamadas solo es aplicable a arquitecturas x86, ARM y PowerPC. No compatible 100 Perfiles precisos a nivel de construcción El soporte para perfiles de código compilado dinámicamente (JIT) aún no está completo.
En cualquier caso, Oprofile es mucho más potente que gprof, pero es un poco más engorroso de configurar.
II. Compilación de Oprofile
Primero, es mejor verificar el controlador Oprofile en el kernel de Linux para obtener soporte completo.
Descargue el código fuente del kernel de Linux: puede descargar el kernel probado proporcionado por Xilinx desde /Xilinx/linux-xlnx. Si no puede utilizar la herramienta git de Linux, puede descargar la bola tar y buscar la versión correspondiente haciendo clic en lanzamientos en la página.
Es mejor descargar en formato tar.gz en lugar de formato zip, ya que este último puede tener problemas con los enlaces simbólicos.
Como estoy usando Xilinx Linux precompilado 14.7, descargué linux-xlnx-xilinx-v14.7.tar.gz
Después de descomprimir el paquete tar, utilicé el siguiente comando abra la interfaz de configuración del kernel de Linux:
exportar ARCH=arm
exportar CROSS_COMPILE=arm-xilinx-linux-gnueabi-
make xilinx_zynq_defconfig
hacer xconfig o hacer menuconfig.
Marque las siguientes dos casillas en la pantalla de configuración:
Configuración general---gt;
[*] Soporte de creación de perfiles
lt; *gt; análisis del sistema OProfile
y crear uImage. Genere una nueva uImage para reemplazar la imagen del kernel de Linux en la compilación previa de Xilinx Linux 14.7. También necesitamos vmlinux para verificar los resultados de la generación de perfiles.
Oprofile requiere las bibliotecas popt, bfd y liberty. Para usar estas bibliotecas en la placa integrada, necesitamos realizar una compilación cruzada manualmente.
Para popt 1.7, puedes usar el siguiente comando para compilar:
./configure --prefix=/home/wave/xilinx/oprofileprj/rootfs --host=arm- xilinx- linux-gnueabi --with-kernel-support --disable-nls make make install
Para binutils 2.24, use el siguiente comando para completar la compilación:
./configure --host=arm-xilinx-linux-gnueabi--prefix=/home/wave/xilinx/oprofileprj/rootfs--enable-install-libbfd--enable-install-libiberty--enable-shared amp; make install
Sin embargo, enable-install-libiberty no tiene ningún efecto, por lo que debe copiar manualmente libiberty.a y libiberty.h en las ubicaciones adecuadas.
Para oprofile 0.9.9, utilice el siguiente comando para completar la compilación:
./configure --host=arm-xilinx-linux-gnueabi --prefix=/home /wave/ xilinx/oprofileprj/rootfs --with-kernel-support --with-binutils=/home/ wave/xilinx/oprofileprj/rootfs amp;amp;amp;amp; al final del proceso de configuración El siguiente mensaje puede aparecer y puede ignorarse porque no tiene intención de utilizar la interfaz gráfica de usuario y el código JIT de perfil.
config.status: Ejecutando el comando libtool
Advertencia: Se solicitó la versión 3 de QT pero no se encontró. La GUI no se construirá.
Advertencia:
Para configurar el código JIT, esta cuenta de usuario especial debe existir.
Pregunte
Para configurar el código JIT, esta cuenta de usuario especial debe existir.
Solicite al administrador del sistema que agregue los siguientes usuarios y grupos:
Nombre de usuario: "oprofile"
Nombre de grupo: "oprofile"
El grupo "oprofile" debe ser el grupo predeterminado para el usuario "oprofile".
Empaque los binarios compilados de uImage, vmlinux y oprofile, el binario libjpeg recompilado (sin -pg) y libc desde la cadena de herramientas a la tarjeta SD. Empaquételos en una tarjeta SD y prepárese para probar el perfil djpeg en la placa de desarrollo ZC706.
Ejecute Oprofile
Después de iniciar Embedded Linux normalmente, ingrese los siguientes comandos uno tras otro en la consola de la placa de desarrollo:
mount /dev/mmcblk0p1 /mnt
mkdir -p /home/root/work
cd /home/root/work
tar zxvf /mnt/jpeg-bin-nopg.tar.gz
cd jpeg-bin/bin
cp /mnt/park-2880x1800.jpg .
exportar LD_LIBRARY_PATH=/home/root/work/jpeg-bin/lib
cd /home/root/work
tar zxvf /mnt/rootfs.tar.gz
cd rootfs
chown root:root -R *
cp -R bin/* /usr/bin
cp -R lib/* /lib
cp /bin/cuál /usr/bin
cp /bin/dirname /usr/bin
mkdir -p /home/wave/xilinx/oprofileprj/rootfs/share
cp -R ./rootfs /* /home/wave/xilinx/oprofileprj/rootfs
cd /home/root/work
tar zxvf /mnt/libc.tar.gz
cp /lib/libstdc*.* /lib
mkdir -p /home/wave/xilinx/libjpeg
cd /home/wave/xilinx/libjpeg
tar zxvf /mnt/jpeg-9.tar.gz
cp /mnt/ vmlinux /home/root/work
cd /home/root/work/jpeg-bin /bin
opcontrol --init
opcontrol --vmlinux=/home/root/work/vmlinux
opcontrol --setup --event=CPU_CYCLES: 100000: :0:1 --session-dir=/home/root/
operf --vmlinux /home/root/work/vmlinux ./djpeg -bmp park-2880x1800.jpg gt; bmp
opreport -l .
root@zynq:~/work/jpeg-bin/bin# opreport -l .
Utilice /home/root/ work/ jpeg-bin/bin/oprofile_data/samples/ Como directorio de muestras: ARM Cortex-A9, velocidad 666667 MHz (estimada)
Evento CPU_CYCLES (ciclos de CPU) con máscara de unidad 0x00 (sin máscara de unidad)) contar 100000
muestra
es nombre de la imagen nombre del símbolo
15293 58.6253 libc-2.17.so /lib/libc-2.17.so
2044 7.8356 libjpeg.so.9.0.0 ycc_rgb_convert
1964 7.5289 libjpeg.so.9.0.0 jpeg_ idct_16x16
1918 7.3526 libjpeg.so.9.0.0 decode_mcu
1570 6.0186 libjpeg.so.9.0.0 jpeg_idct_islow
1567 6.0071 djpeg finish_output_bmp
528 2.0241 libjpeg.so.9.0.0 jpeg_fill_bit_buffer
397 1.5219 djpeg put_pixel_rows
73 0.2798 vmlinux __copy_from _user p> p>
70 0.2683 libjpeg.so.9.0.0 decompress_onepass
65 0.2492 libjpeg.so.9.0.0 jpeg_huff_decode
56 0.2147 vmlinux get_ page_from_freelist
50 0.1917 vmlinux __memzero
45 0.1725 vmlinux __copy_too_user_std
41 0.1572 vmlinux _raw_spin_unlock_ irqrestore
15 0.0575 vmlinux do_page_fault
14 0.053 7 vmlinux __generic_file_aio_write
13 0.0498 vmlinux _raw_spin_unlock_ irq
11 0.0422 vmlinux free_hot_cold_page
11 0.0422 vmlinux vector_swi
10 0.0383 vmlinux handle_pte_fault p>
A partir de los resultados, podemos ver que los nombres de los símbolos en libjpeg.so.9.0.0, djpeg y vmlinux se pueden analizar correctamente, lo que básicamente es consistente con los resultados de gprof.
También podemos utilizar el siguiente comando para observar el tiempo de ejecución de líneas específicas en el código fuente, reduciendo así aún más el alcance de la optimización y logrando el doble de resultado con la mitad de esfuerzo.
opannotate --source ./djpeg gt; opannotate.txt
IV.Resumen
A través de experimentos, podemos ver que Oprofile puede proporcionar un análisis más rico de los resultados. puede ayudar mejor a los desarrolladores a encontrar cuellos de botella y mejorar el rendimiento del software mediante la optimización específica. Los resultados de la creación de perfiles también pueden ayudar a los desarrolladores a darse cuenta de los cuellos de botella en el rendimiento del código a través del acelerador del hardware de las herramientas Xilinx HLS. Esto abre la puerta a mayores mejoras en el rendimiento general del sistema integrado.