Interception library

The libioil library can be used to improve the performance of read and write operations to DFuse from applications which use libc. The library bypasses the kernel by intercepting POSIX read and write calls from the application and servicing them directly in user-space.

Using libioil

To use the interception library, set LD_PRELOAD to point to the shared library in the DAOS install directory:

  LD_PRELOAD 
 = 
/usr/lib64/libioil.so 

For example:

 $  
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 

It is also possible to link applications with the interception library at compile time with the -lioil flag.

For evaluating performance using the interception library, see Performance considerations and Test performance .

Monitor activity

To enable activity reports for the interception library, set the D_IL_REPORT environment variable. This returns a short summary of activity in the shared library destructor, typically as a program exits.

The value assigned to D_IL_REPORT defines the number of read and write calls to log to stderr. To log all calls, set the value to -1 . To print the summary at program exit only, set the value to 0 .

For example:

 $  
 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 

Some programs, including most GNU utilities from the coreutils package, have a destructor function to close stderr on exit. This means that, while the interception library works for many basic commands such as cp and cat, it's not possible to see the summary generated by the interception library.

Design a Mobile Site
View Site in Mobile | Classic
Share by: