Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zebra: backpressure - Zebra push back on Buffer/Stream creation #15411

Commits on Mar 7, 2024

  1. zebra: backpressure - Zebra push back on Buffer/Stream creation

    Currently, the way zebra works is it creates pthread per client (BGP is
    of interest in this case) and this thread loops itself in zserv_read()
    to check for any incoming data. If there is one, then it reads,
    validates and adds it in the ibuf_fifo signalling the main thread to
    process the message. The main thread when it gets a change, processes
    the message, and invokes the function pointer registered in the header
    command. (Ex: zserv_handlers).
    
    Finally, if all of this was successful, this task reschedules itself and
    loops in zserv_read() again
    
    However, if there are already items on ibuf FIFO, that means zebra is
    slow in processing. And with the current mechanism if Zebra main is
    busy, the ibuf FIFO keeps growing holding up the memory.
    
    Show memory zebra:(Example: 15k streams hoarding ~160 MB of data)
    --- qmem libfrr ---
    Stream             :       44 variable   3432352    15042 161243800
    
    Fix:
    Client IO Thread: (zserv_read)
     - Stop doing the read events when we know there are X number of items
       on the FIFO already.(X - zebra zapi-packets <1-10000> (Default-1000)
    
     - Determine the number of items on the zserv->ibuf_fifo. Subtract this
       from the work items and only pull the number of items off that would
       take us to X items on the ibuf_fifo again.
    
     - If the number of items in the ibuf_fifo has reached to the maximum
          * Either initially when zserv_read() is called (or)
          * when processing the remainders of the incoming buffer
       the client IO thread is woken by the the zebra main.
    
    Main thread: (zserv_process_message)
    If the client ibuf always schedules a wakeup to the client IO to read
    more items from the socked buffer. This way we ensure
     - Client IO thread always tries to read the socket buffer and add more
       items to the ibuf_fifo (until max limit)
     - hidden config change (zebra zapi-packets <>) is taken into account
    
    Ticket: #3390099
    
    Signed-off-by: Donald Sharp <sharpd@nvidia.com>
    Signed-off-by: Rajasekar Raja <rajasekarr@nvidia.com>
    raja-rajasekar committed Mar 7, 2024
    Configuration menu
    Copy the full SHA
    a8efa99 View commit details
    Browse the repository at this point in the history