efficient/rdma_bench

Name: rdma_bench

Owner: Efficient Computing at Carnegie Mellon

Description: A framework to understand RDMA

Created: 2016-01-31 18:39:43.0

Updated: 2018-05-16 08:02:35.0

Pushed: 2018-05-10 22:39:17.0

Homepage: null

Size: 443

Language: C

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

RDMA-bench

A framework to understand RDMA performance. This is the source code for our USENIX ATC paper.

Required hardware and software
Required settings

All benchmarks require one server machine and multiple client machines. Every benchmark is contained in one directory.

Benchmark description

The benchmarks used in the paper are described below. This repository contains a few other benchmarks as well.

| Benchmark | Description | | ————- | ————- | | herd | An improved implementation of the HERD key-value cache. | | mica | A simplified implementation of MICA. | | | | | atomics-sequencer | Sequencer using one-sided fetch-and-add. Also emulates DrTM-KV. | | ws-sequencer | Sequencer using HERD RPCs (UC WRITE requests, UD SEND responses). | | ss-sequencer | Sequencer using header-only datagram RPCs (i.e., UD SENDs only). | | | | | rw-tput-sender | Microbenchmark to measure throughput of outbound READs and WRITEs. | | rw-tput-receiver | Microbenchmark to measure throughput of inbound READs and WRITEs. | | ud-sender | Microbenchmark to measure throughput of outbound SENDs. | | ud-receiver | Microbenchmark to measure throughput of inbound SENDs. | | | | | rw-allsig | WQE cache misses for outbound READs and WRITEs. |

Implementation details
libhrd

The libhrd library is used to implement all benchmarks. It consists of convenience functions for initial RDMA setup, such as creating and connecting QPs, and allocating hugepage memory.

Memcached

Distributing QP information (required for connection setup in connected transports, and routing in datagram transports) requires a temporary out-of-band communication channel. To simplify this process, we use a memcached instance to publish (e.g., hrd_publish_conn_qp()) and pull QP information (e.g., hrd_get_published_qp) using global QP names.

Client connection logic

The code was written to work on a cluster that has dual-port NICs, but the switch connectivity does not allow cross-port communication. Using both ports in this constrained environment makes the initial QP connection setup slightly complicated. All benchmarks also work on single-port NICs. Usually, we use the following logic while setting up connections:

Selective signaling logic

Most benchmarks post one signaled work request per UNSIG_BATCH work requests. This is done to reduce CQE DMAs. With UNSIG_BATCH = 4, a sequence of work requests looks as follows. Note that a work request is not post()ed immediately; it is added to a list and posted when the number of work requests in the list equals postlist.

 -> signaled
 -> unsignaled
 -> unsignaled
 -> unsignaled
Poll for wr 0's completion. A postlist should have ended.
 -> signaled

 -> unsignaled
Poll for wr 4's completion. Another postlist should have ended.

This imposes 2 requirements:

Work in progress

The benchmarks are being ported to use C++ and CMake. Some benchmarks will continue to use C (i.e., libhrd); others will move to C++ (i.e., libhrd_cpp).

Contact

Anuj Kalia (akalia@cs.cmu.edu)

License
    Copyright 2016, Carnegie Mellon University

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.