You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+8-35Lines changed: 8 additions & 35 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,10 @@
1
1
# DiSNI: Direct Storage and Networking Interface
2
2
3
-
DiSNI is a Java library for direct storage and networking access from userpace. It currently provides an RDMA interface to access remote memory, and an NVMf interface to access remote NVMe storage. DiSNI enables the development of Java applications for high performance RDMA networks, such as InfiniBand, iWARP, or RoCE. The RDMA API is implemented based on the Open Fabrics Enterprise Distribution (OFED) RDMA user libraries. The NVMf APIs are implemented on top of the Storage Performance Development Kit ([SPDK](http://www.spdk.io)). Both APIs provide RDMA semantics including asynchronous operations, zero-copy transmission and direct data placement.
3
+
DiSNI is a Java library for direct storage and networking access from userpace. It provides an RDMA interface to access remote memory. DiSNI enables the development of Java applications for high performance RDMA networks, such as InfiniBand, iWARP, or RoCE. The RDMA API is implemented based on the Open Fabrics Enterprise Distribution (OFED) RDMA user libraries. It provides RDMA semantics including asynchronous operations, zero-copy transmission and direct data placement.
4
+
5
+
## Changelog
6
+
7
+
* Version 1.5 removes NVMf/SPDK code. For user of the DiSNI NVMf API we provide a new NVMf library called [jNVMf](https://github.com/zrlio/jnvmf)
4
8
5
9
## Building DiSNI
6
10
@@ -10,16 +14,6 @@ To build DiSNI and its example programs, obtain a copy of DiSNI from [Github](ht
10
14
1. Compile the Java sources using: mvn -DskipTests install
11
15
2. Compile libdisni using: cd libdisni; ./autoprepare.sh; ./configure --with-jdk=\<path\>; make install
12
16
13
-
By default DiSNI will only build with RDMA support. To enable NVMf you will need to install DPDK and SPDK using following steps. Below, \<target\> refers to the DPDK 4-tuple for your platform, which would be `x86_64-native-linuxapp-gcc` for Intel/AMD processors and `ppc_64-power8-linuxapp-gcc` for Power (run `make help` in the DPDK top source directory for a list of 4-tuples supported by DPDK):
14
-
15
-
2. Obtain dpdk from [dpdk.org](http://dpdk.org/download) (version 17.11)\
16
-
3. Build dpdk using: make install T=\<target\> DESTDIR=. EXTRA_CFLAGS="-fPIC"
17
-
4. Obtain spdk from [Github](https://github.com/spdk/spdk) (version 17.10)
18
-
5. Build spdk using: make DPDK_DIR=\<dpdk-path/x86_64-native-linuxapp-gcc\> CONFIG_RDMA=y
19
-
6. Configure libdisni for NVMf: ./configure --with-jdk=\<path\> --with-spdk=\<path\> --with-dpdk=\<path\>/\<target\>
20
-
7. Build libdisni: make install
21
-
8. Make sure shared libraries of DPDK are in the LD_LIBRARY_PATH
22
-
23
17
## How to Run the Examples
24
18
25
19
Common steps:
@@ -32,11 +26,6 @@ Common steps:
32
26
2. Run the server\: java com.ibm.disni.examples.ReadServer -a \<server IP\>
33
27
3. Run the client\: java com.ibm.disni.examples.ReadClient -a \<server IP\>
34
28
35
-
### NVMf example
36
-
1. Include DPDK library dependencies in LD_LIBRARY_PATH (\*.so files are required)
37
-
2. Run the server\: java com.ibm.disni.benchmarks.NvmfEndpointServer \<local NVMe PCI address\>\<NVMe qualified name\>\<server ip\>\<port\>
38
-
3. Run the client\: java.com.ibm.disni.benchmarks.NvmfEndpointClient \<server ip\>\<port\>\<NVMe qualified name\>
39
-
40
29
## Programming with DiSNI
41
30
42
31
DiSNI is part of maven central, therefore the simplest way to use DiSNI in your maven application is to add the following snippet to your application pom.xml file.
@@ -47,39 +36,23 @@ DiSNI is part of maven central, therefore the simplest way to use DiSNI in your
47
36
<version>1.5</version>
48
37
</dependency>
49
38
50
-
The RDMA and NVMf APIs in DiSNI are both following the Group/Endpoint model which is based on three key data types (interfaces):
39
+
The DiSNI API follows a Group/Endpoint model which is based on three key data types (interfaces):
51
40
52
41
* DiSNIServerEndpoint:
53
42
* represents a listerning server waiting for new connections
54
43
* contains methods to bind() to a specific port and to accept() new connections
55
44
* DiSNIEndpoint:
56
-
* represents a connection to a remote (or local) resource (e.g., RDMA or NVMf)
45
+
* represents a connection to a remote (or local) resource (e.g., RDMA)
57
46
* offers non-blocking methods to read() or write() the resource
58
47
* DiSNIGroup:
59
48
* a container and a factory for both client and server endpoints
60
49
61
-
Specific implementations of these interface in DiSNI/RDMA and DiSNI/NVMf are offering extra functionality tailored to their purpose.
50
+
Specific implementations of these interface like DiSNI/RDMA offers extra functionality tailored to their purpose.
62
51
63
52
### Stateful Operations
64
53
65
54
To avoid any performance impacts that are associated with passing complex parameters and arrays through the JNI interface, the DiSNI library implements stateful method calls (SMC). With this approach, the JNI serialization state for a particular call is cached in the context of an SMC object and can be reused many times. SMC objects can also be modified, for instance when transmitting data at different offsets. Modifications to SMC objects are efficient as they do not require serialization. It is key that SMC objecs are re-used whenever possible to avoid garbage collection overheads.
66
55
67
-
### Programming NVMf using DiSNI
68
-
69
-
Here is an example of a simple NVMf client. The client issues a 512 byte read operation against a remote NVMf server.
70
-
```
71
-
NvmeTransportType transports[] = new NvmeTransportType[]{NvmeTransportType.RDMA};
72
-
long memoryMB = 256;
73
-
NvmeEndpointGroup group = new NvmeEndpointGroup(transports, memoryMB);
74
-
NvmeEndpoint endpoint = group.createEndpoint();
75
-
76
-
URI uri = new URI("nvmef://192.168.0.1:5050/0/1?subsystem=nqn.2016-06.io.spdk:cnode1");
Here are the basic steps that are necessary to develop an RDMA client/server application using DiSNI. First, define your own custom endpoints by extending either extending RdmaClientEndpoint or RdmaActiveClientEndpoint
0 commit comments