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.