Mellanox Performance Data

Information for 5/24 phone call.

Basic Performance Graph

Throughput as a function of # clients, # transmit buffers, # receive buffers.

Best case: 1.1us/request
Under load: 2.35us/request

Graph showing performance with 128 Rx/ 128 Tx buffers

Code for getTransmitBuffer

Include code for the method here.

getTransmitBuffer()
/**                                                                        
 * Return a free transmit buffer, wrapped by its corresponding             
 * BufferDescriptor. If there are none, block until one is available.      
 *                                                                         
 */
template<typename Infiniband>
typename Infiniband::BufferDescriptor*
InfRcTransport<Infiniband>::getTransmitBuffer()
{
    CycleCounter<uint64_t> timeThis2;
    // if we've drained our free tx buffer pool, we must wait.             
    while (txBuffers.empty()) {

        ibv_wc retArray[MAX_TX_QUEUE_DEPTH];
        CycleCounter<uint64_t> timeThis;
        int n = infiniband->pollCompletionQueue(commonTxCq,
                                                MAX_TX_QUEUE_DEPTH,
                                                retArray);
        uint64_t gtbPollNanos = cyclesToNanoseconds(timeThis.stop());
        serverStats.gtbPollNanos += gtbPollNanos;
        serverStats.gtbPollCount++;

        if (0 >= n) {
             serverStats.gtbPollZeroNCount++;
             serverStats.gtbPollZeroNanos += gtbPollNanos;
        } else {
             serverStats.gtbPollNonZeroNAvg += n;
             serverStats.gtbPollNonZeroNanos += gtbPollNanos;
        }

        for (int i = 0; i < n; i++) {
            BufferDescriptor* bd =
                reinterpret_cast<BufferDescriptor*>(retArray[i].wr_id);
            txBuffers.push_back(bd);

            if (retArray[i].status != IBV_WC_SUCCESS) {
                LOG(ERROR, "Transmit failed: %s",
                    infiniband->wcStatusToString(retArray[i].status));
            }
        }

    }


    BufferDescriptor* bd = txBuffers.back();
    txBuffers.pop_back();

    serverStats.infrcGetTxBufferNanos += timeThis2.stop();
    return bd;
}

Graph of getTransmitBuffer Running Time

Best case: 80ns
Under load: 1.3us
Accounts for all of the additional time

Graph of how many times pollCompletionQueue is called

Graph of avg. # buffers returned by pollCompletionQueue