Bibliothèque d'interception

La bibliothèque libioil peut être utilisée pour améliorer les performances des opérations de lecture et d'écriture dans DFuse à partir d'applications qui utilisent libc. La bibliothèque contourne le kernel en interceptant les appels de lecture et d'écriture POSIX de l'application et en les gérant directement dans l'espace utilisateur.

Utiliser libioil

Pour utiliser la bibliothèque d'interception, définissez LD_PRELOAD pour qu'il pointe vers la bibliothèque partagée dans le répertoire d'installation de DAOS:

LD_PRELOAD=/usr/lib64/libioil.so

Exemple :

$ 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

Il est également possible d'associer des applications à la bibliothèque d'interception au moment de la compilation avec l'indicateur -lioil.

Pour évaluer les performances à l'aide de la bibliothèque d'interception, consultez les sections Considérations sur les performances et Tester les performances.

Surveiller l'activité

Pour activer les rapports d'activité pour la bibliothèque d'interception, définissez la variable d'environnement D_IL_REPORT. Cette opération renvoie un bref résumé de l'activité dans le destructeur de la bibliothèque partagée, généralement à la sortie d'un programme.

La valeur attribuée à D_IL_REPORT définit le nombre d'appels de lecture et d'écriture à consigner dans stderr. Pour journaliser tous les appels, définissez la valeur sur -1. Pour imprimer le résumé à la sortie du programme uniquement, définissez la valeur sur 0.

Exemple :

$ 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

Certains programmes, y compris la plupart des utilitaires GNU du package coreutils, disposent d'une fonction de destruction pour fermer stderr à la sortie. Cela signifie que, bien que la bibliothèque d'interception fonctionne pour de nombreuses commandes de base telles que cp et cat, il n'est pas possible d'afficher le résumé généré par la bibliothèque d'interception.