On Wed, Oct 17, 2018 at 02:37:48PM +0200, Claudio Jeker wrote: > I noticed that the throttling for peers which was added some time ago is > incomplete. The following diff solved these issues. > > In rde_update_queue_runner() only process peers which are currently not > throttled. Additionally only run the runners if not too many imsg are > pending in the RDE. Both these changes should help imporve responsiveness. > In the SE only set the throttled flag if the imsg sending was successful. > > Does work fine on my systems with little or no effect on convergance time. > Please test on your systems and look for preformance changes.
Updated version after recent commit. -- :wq Claudio Index: rde.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v retrieving revision 1.437 diff -u -p -r1.437 rde.c --- rde.c 18 Oct 2018 12:19:09 -0000 1.437 +++ rde.c 19 Oct 2018 15:49:43 -0000 @@ -334,15 +334,16 @@ rde_main(int debug, int verbose) mctx = LIST_NEXT(mctx, entry); } - rde_update_queue_runner(); - for (aid = AID_INET6; aid < AID_MAX; aid++) - rde_update6_queue_runner(aid); + if (ibuf_se && ibuf_se->w.queued < SESS_MSG_HIGH_MARK) { + rde_update_queue_runner(); + for (aid = AID_INET6; aid < AID_MAX; aid++) + rde_update6_queue_runner(aid); + } if (rde_dump_pending() && ibuf_se_ctl && ibuf_se_ctl->w.queued <= 10) rde_dump_runner(); - if (softreconfig) { + if (softreconfig) rde_reload_runner(); - } } /* do not clean up on shutdown on production, it takes ages. */ @@ -2664,6 +2665,8 @@ rde_update_queue_runner(void) continue; if (peer->state != PEER_UP) continue; + if (peer->throttled) + continue; eor = 0; /* first withdraws */ wpos = 2; /* reserve space for the length field */ @@ -2730,6 +2733,8 @@ rde_update6_queue_runner(u_int8_t aid) continue; if (peer->state != PEER_UP) continue; + if (peer->throttled) + continue; len = sizeof(queue_buf) - MSGSIZE_HEADER; b = up_dump_mp_unreach(queue_buf, &len, peer, aid); @@ -2753,6 +2758,8 @@ rde_update6_queue_runner(u_int8_t aid) if (peer->conf.id == 0) continue; if (peer->state != PEER_UP) + continue; + if (peer->throttled) continue; len = sizeof(queue_buf) - MSGSIZE_HEADER; r = up_dump_mp_reach(queue_buf, &len, peer, aid); Index: session.c =================================================================== RCS file: /cvs/src/usr.sbin/bgpd/session.c,v retrieving revision 1.369 diff -u -p -r1.369 session.c --- session.c 29 Sep 2018 07:58:06 -0000 1.369 +++ session.c 17 Oct 2018 12:18:51 -0000 @@ -1382,7 +1382,8 @@ session_sendmsg(struct bgp_msg *msg, str if (!p->throttled && p->wbuf.queued > SESS_MSG_HIGH_MARK) { if (imsg_rde(IMSG_XOFF, p->conf.id, NULL, 0) == -1) log_peer_warn(&p->conf, "imsg_compose XOFF"); - p->throttled = 1; + else + p->throttled = 1; } free(msg); @@ -1773,7 +1774,8 @@ session_dispatch_msg(struct pollfd *pfd, if (p->throttled && p->wbuf.queued < SESS_MSG_LOW_MARK) { if (imsg_rde(IMSG_XON, p->conf.id, NULL, 0) == -1) log_peer_warn(&p->conf, "imsg_compose XON"); - p->throttled = 0; + else + p->throttled = 0; } if (!(pfd->revents & POLLIN)) return (1);