• ranshid's avatar
    introduce dynamic client reply buffer size - save memory on idle clients (#9822) · 47c51d0c
    ranshid authored
    
    
    Current implementation simple idle client which serves no traffic still
    use ~17Kb of memory. this is mainly due to a fixed size reply buffer
    currently set to 16kb.
    
    We have encountered some cases in which the server operates in a low memory environments.
    In such cases a user who wishes to create large connection pools to support potential burst period,
    will exhaust a large amount of memory  to maintain connected Idle clients.
    Some users may choose to "sacrifice" performance in order to save memory.
    
    This commit introduce a dynamic mechanism to shrink and expend the client reply buffer based on
    periodic observed peak.
    the algorithm works as follows:
    1. each time a client reply buffer has been fully written, the last recorded peak is updated: 
    new peak = MAX( last peak, current written size)
    2. during clients cron we check for each client if the last observed peak was:
         a. matching the current buffer size - in which case we expend (resize) the buffer size by 100%
         b. less than half the buffer size - in which case we shrink the buffer size by 50%
    3. In any case we will **not** resize the buffer in case:
        a. the current buffer peak is less then the current buffer usable size and higher than 1/2 the
          current buffer usable size
        b. the value of (current buffer usable size/2) is less than 1Kib
        c. the value of  (current buffer usable size*2) is larger than 16Kib
    4. the peak value is reset to the current buffer position once every **5** seconds. we maintain a new
       field in the client structure (buf_peak_last_reset_time) which is used to keep track of how long it
       passed since the last buffer peak reset.
    
    ### **Interface changes:**
    **CIENT LIST** - now contains 2 new extra fields:
    rbs= < the current size in bytes of the client reply buffer >
    rbp=< the current value in bytes of the last observed buffer peak position >
    
    **INFO STATS** - now contains 2 new statistics:
    reply_buffer_shrinks = < total number of buffer shrinks performed >
    reply_buffer_expends = < total number of buffer expends performed >
    Co-authored-by: default avatarOran Agra <oran@redislabs.com>
    Co-authored-by: default avatarYoav Steinberg <yoav@redislabs.com>
    47c51d0c
test_helper.tcl 27.5 KB