• Chuck Lever's avatar
    SUNRPC: Ensure all transports set rq_xtime consistently · b22602a6
    Chuck Lever authored
    The RPC client uses the rq_xtime field in each RPC request to determine the
    round-trip time of the request.  Currently, the rq_xtime field is
    initialized by each transport just before it starts enqueing a request to
    be sent.  However, transports do not handle initializing this value
    consistently; sometimes they don't initialize it at all.
    
    To make the measurement of request round-trip time consistent for all
    RPC client transport capabilities, pull rq_xtime initialization into the
    RPC client's generic transport logic.  Now all transports will get a
    standardized RTT measure automatically, from:
    
      xprt_transmit()
    
    to
    
      xprt_complete_rqst()
    
    This makes round-trip time calculation more accurate for the TCP transport.
    The socket ->sendmsg() method can return "-EAGAIN" if the socket's output
    buffer is full, so the TCP transport's ->send_request() method may call
    the ->sendmsg() method repeatedly until it gets all of the request's bytes
    queued in the socket's buffer.
    
    Currently, the TCP transport sets the rq_xtime field every time through
    that loop so the final value is the timestamp just before the *last* call
    to the underlying socket's ->sendmsg() method.  After this patch, the
    rq_xtime field contains a timestamp that reflects the time just before the
    *first* call to ->sendmsg().
    
    This is consequential under heavy workloads because large requests often
    take multiple ->sendmsg() calls to get all the bytes of a request queued.
    The TCP transport causes the request to sleep until the remote end of the
    socket has received enough bytes to clear space in the socket's local
    output buffer.  This delay can be quite significant.
    
    The method introduced by this patch is a more accurate measure of RTT
    for stream transports, since the server can cause enough back pressure
    to delay (ie increase the latency of) requests from the client.
    
    Additionally, this patch corrects the behavior of the RDMA transport, which
    entirely neglected to initialize the rq_xtime field.  RPC performance
    metrics for RDMA transports now display correct RPC request round trip
    times.
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Acked-by: default avatarTom Talpey <thomas.talpey@netapp.com>
    Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
    b22602a6
xprt.c 29.4 KB