Biblioteca de intercepción

La biblioteca libioil se puede usar para mejorar el rendimiento de las operaciones de lectura y escritura en DFuse desde aplicaciones que usan libc. La biblioteca evita el kernel interceptando las llamadas de lectura y escritura de POSIX de la aplicación y atendiéndolas directamente en el espacio de usuario.

Usar libioil

Para usar la biblioteca de intercepción, define LD_PRELOAD para que apunte a la biblioteca compartida en el directorio de instalación de DAOS:

LD_PRELOAD=/usr/lib64/libioil.so

Por ejemplo:

$ dd if=/dev/zero of=./foo bs=1G count=20
20+0 records in
20+0 records out
21474836480 bytes (21 GB, 20 GiB) copied, 45.6925 s, 470 MB/s

$ LD_PRELOAD=/usr/lib64/libioil.so dd if=/dev/zero of=./bar bs=1G count=20
20+0 records in
20+0 records out
21474836480 bytes (21 GB, 20 GiB) copied, 15.735 s, 1.4 GB/s

También es posible vincular aplicaciones con la biblioteca de intercepción en tiempo de compilación con la marca -lioil.

Para evaluar el rendimiento con la biblioteca de intercepción, consulte las secciones Consideraciones sobre el rendimiento y Probar el rendimiento.

Monitorizar la actividad

Para habilitar los informes de actividad de la biblioteca de intercepción, define la variable de entorno D_IL_REPORT. Devuelve un breve resumen de la actividad en el destructor de la biblioteca compartida, normalmente cuando se cierra un programa.

El valor asignado a D_IL_REPORT define el número de llamadas de lectura y escritura que se registrarán en stderr. Para registrar todas las llamadas, asigna el valor -1. Para imprimir el resumen solo al salir del programa, asigna el valor 0.

Por ejemplo:

$ D_IL_REPORT=1 LD_PRELOAD=/usr/lib64/libioil.so dd if=/dev/zero of=./bar bs=1G count=5
[libioil] Intercepting write of size 1073741824
5+0 records in
5+0 records out
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 4.13708 s, 1.3 GB/s

$ D_IL_REPORT=3 LD_PRELOAD=/usr/lib64/libioil.so dd if=/dev/zero of=./bar bs=1G count=5
[libioil] Intercepting write of size 1073741824
[libioil] Intercepting write of size 1073741824
[libioil] Intercepting write of size 1073741824
5+0 records in
5+0 records out
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 4.18626 s, 1.3 GB/s

$ D_IL_REPORT=-1 LD_PRELOAD=/usr/lib64/libioil.so dd if=/dev/zero of=./bar bs=1G count=5
[libioil] Intercepting write of size 1073741824
[libioil] Intercepting write of size 1073741824
[libioil] Intercepting write of size 1073741824
[libioil] Intercepting write of size 1073741824
[libioil] Intercepting write of size 1073741824
5+0 records in
5+0 records out
5368709120 bytes (5.4 GB, 5.0 GiB) copied, 4.12114 s, 1.3 GB/s

Algunos programas, incluidas la mayoría de las utilidades de GNU del paquete coreutils, tienen una función de destructor para cerrar stderr al salir. Esto significa que, aunque la biblioteca de interceptación funciona con muchos comandos básicos, como cp y cat, no es posible ver el resumen generado por la biblioteca de interceptación.