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 desde la aplicación y prestándolas directamente en el espacio de usuario.

Cómo usar libioil

Para usar la biblioteca de intercepción, establece 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, 14.1946 s, 1.5 GB/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, 5.0483 s, 4.3 GB/s

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

Supervisar la actividad

Para habilitar los informes de actividad de la biblioteca de intercepción, configura la variable de entorno D_IL_REPORT. Esto muestra un breve resumen de la actividad en el destructor de bibliotecas compartidas, por lo general, cuando se cierra un programa.

El valor asignado a D_IL_REPORT define la cantidad de llamadas de lectura y escritura para registrar en stderr. Para registrar todas las llamadas, establece el valor en -1. Para imprimir el resumen solo cuando finalice el programa, establece el valor en 0.

Por ejemplo:

$ D_IL_REPORT=1 LD_PRELOAD=/usr/lib64/libioil.so dd if=/dev/zero of=./bar bs=1G count=20
[libioil] Intercepting write of size 1073741824
20+0 records in
20+0 records out
21474836480 bytes (21 GB, 20 GiB) copied, 5.17297 s, 4.2 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, 1.27362 s, 4.2 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, 1.29935 s, 4.1 GB/s

Algunos programas, incluida 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, si bien la biblioteca de intercepción funciona para muchos comandos básicos, como cp y cat, no es posible ver el resumen que genera la biblioteca de intercepción.