A biblioteca libioil
pode ser usada para melhorar o desempenho das operações de leitura e gravação
no DFuse de aplicativos que usam libc. A biblioteca ignora o
kernel ao interceptar chamadas de leitura e gravação POSIX do aplicativo e
oferecê-las diretamente no espaço do usuário.
Como usar o libioil
Para usar a biblioteca de interceptação, defina LD_PRELOAD
para apontar para a biblioteca
compartilhada no diretório de instalação do DAOS:
LD_PRELOAD=/usr/lib64/libioil.so
Exemplo:
$ 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
Também é possível vincular aplicativos à biblioteca de intercepção no
momento da compilação com a flag -lioil
.
Monitorar atividade
Para ativar os relatórios de atividade da biblioteca de interceptação, defina a variável de ambiente
D_IL_REPORT
. Isso retorna um breve resumo da atividade no
destrutor de biblioteca compartilhada, geralmente quando um programa é encerrado.
O valor atribuído a D_IL_REPORT
define o número de chamadas de leitura e gravação
para registro no stderr. Para registrar todas as chamadas, defina o valor como -1
. Para imprimir o resumo
apenas na saída do programa, defina o valor como 0
.
Exemplo:
$ 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
Alguns programas, incluindo a maioria dos utilitários GNU do pacote coreutils
, têm
uma função de destrutor para fechar o stderr na saída. Isso significa que, embora a
biblioteca de interceptação funcione para muitos comandos básicos, como cp e cat, não é
possível ver o resumo gerado por ela.