Re: [ovs-dev] [PATCH] Optimize the poll loop for poll_immediate_wake()

2021-07-15 Thread Ben Pfaff
I'm impressed by the improvement.  I didn't really expect any.

On Tue, Jul 13, 2021 at 09:19:34AM +0100, Anton Ivanov wrote:
> I ran the revised patch series (v2) which addresses your comments on the 
> ovn-heater benchmark.
> 
> With 9 fake nodes, 50 fake pods per node I get ~ 2% reproducible improvement. 
> IMHO it should be even more noticeable at high scale.
> 
> Best regards,
> 
> A
> 
> On 09/07/2021 19:45, Ben Pfaff wrote:
> > On Fri, Jul 09, 2021 at 06:19:06PM +0100, anton.iva...@cambridgegreys.com 
> > wrote:
> > > From: Anton Ivanov 
> > > 
> > > If we are not obtaining any useful information out of the poll(),
> > > such as is a fd busy or not, we do not need to do a poll() if
> > > an immediate_wake() has been requested.
> > > 
> > > This cuts out all the pollfd hash additions, forming the poll
> > > arguments and the actual poll() after a call to
> > > poll_immediate_wake()
> > > 
> > > Signed-off-by: Anton Ivanov 
> > Thanks for the patch.
> > 
> > I think that this will have some undesirable side effects because it
> > avoids calling time_poll() if the wakeup should happen immediately, and
> > time_poll() does some thing that we always want to happen between one
> > main loop and another.  In particular the following calls from
> > time_poll() are important:
> > 
> >  coverage_clear();
> >  coverage_run();
> >  if (*last_wakeup && !thread_is_pmd()) {
> >  log_poll_interval(*last_wakeup);
> >  }
> > 
> > ...
> > 
> >  if (!time_left) {
> >  ovsrcu_quiesce();
> >  } else {
> >  ovsrcu_quiesce_start();
> >  }
> > 
> > ...
> > 
> >  if (deadline <= time_msec()) {
> > #ifndef _WIN32
> >  fatal_signal_handler(SIGALRM);
> > #else
> >  VLOG_ERR("wake up from WaitForMultipleObjects after deadline");
> >  fatal_signal_handler(SIGTERM);
> > #endif
> >  if (retval < 0) {
> >  retval = 0;
> >  }
> >  break;
> >  }
> > 
> > ...
> > 
> >  *last_wakeup = time_msec();
> >  refresh_rusage();
> > 
> > Instead of this change, I'd suggest something more like the following,
> > along with the changes you made to suppress the file descriptors if the
> > timeout is already zero:
> > 
> > diff --git a/lib/timeval.c b/lib/timeval.c
> > index 193c7bab1781..f080a742 100644
> > --- a/lib/timeval.c
> > +++ b/lib/timeval.c
> > @@ -323,7 +323,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE 
> > *handles OVS_UNUSED,
> >   }
> >   #ifndef _WIN32
> > -retval = poll(pollfds, n_pollfds, time_left);
> > +retval = time_left ? poll(pollfds, n_pollfds, time_left) : 0;
> >   if (retval < 0) {
> >   retval = -errno;
> >   }
> > 
> > 
> -- 
> Anton R. Ivanov
> Cambridgegreys Limited. Registered in England. Company Number 10273661
> https://www.cambridgegreys.com/
> 
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH] Optimize the poll loop for poll_immediate_wake()

2021-07-13 Thread Anton Ivanov

I ran the revised patch series (v2) which addresses your comments on the 
ovn-heater benchmark.

With 9 fake nodes, 50 fake pods per node I get ~ 2% reproducible improvement. 
IMHO it should be even more noticeable at high scale.

Best regards,

A

On 09/07/2021 19:45, Ben Pfaff wrote:

On Fri, Jul 09, 2021 at 06:19:06PM +0100, anton.iva...@cambridgegreys.com wrote:

From: Anton Ivanov 

If we are not obtaining any useful information out of the poll(),
such as is a fd busy or not, we do not need to do a poll() if
an immediate_wake() has been requested.

This cuts out all the pollfd hash additions, forming the poll
arguments and the actual poll() after a call to
poll_immediate_wake()

Signed-off-by: Anton Ivanov 

Thanks for the patch.

I think that this will have some undesirable side effects because it
avoids calling time_poll() if the wakeup should happen immediately, and
time_poll() does some thing that we always want to happen between one
main loop and another.  In particular the following calls from
time_poll() are important:

 coverage_clear();
 coverage_run();
 if (*last_wakeup && !thread_is_pmd()) {
 log_poll_interval(*last_wakeup);
 }

...

 if (!time_left) {
 ovsrcu_quiesce();
 } else {
 ovsrcu_quiesce_start();
 }

...

 if (deadline <= time_msec()) {
#ifndef _WIN32
 fatal_signal_handler(SIGALRM);
#else
 VLOG_ERR("wake up from WaitForMultipleObjects after deadline");
 fatal_signal_handler(SIGTERM);
#endif
 if (retval < 0) {
 retval = 0;
 }
 break;
 }

...

 *last_wakeup = time_msec();
 refresh_rusage();

Instead of this change, I'd suggest something more like the following,
along with the changes you made to suppress the file descriptors if the
timeout is already zero:

diff --git a/lib/timeval.c b/lib/timeval.c
index 193c7bab1781..f080a742 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -323,7 +323,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE 
*handles OVS_UNUSED,
  }
  
  #ifndef _WIN32

-retval = poll(pollfds, n_pollfds, time_left);
+retval = time_left ? poll(pollfds, n_pollfds, time_left) : 0;
  if (retval < 0) {
  retval = -errno;
  }



--
Anton R. Ivanov
Cambridgegreys Limited. Registered in England. Company Number 10273661
https://www.cambridgegreys.com/

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH] Optimize the poll loop for poll_immediate_wake()

2021-07-09 Thread Anton Ivanov

Good point,

I forgot about the rcu.

I will redo the patch as per your suggestions and resubmit it next week.

A.

On 09/07/2021 19:45, Ben Pfaff wrote:

On Fri, Jul 09, 2021 at 06:19:06PM +0100, anton.iva...@cambridgegreys.com wrote:

From: Anton Ivanov 

If we are not obtaining any useful information out of the poll(),
such as is a fd busy or not, we do not need to do a poll() if
an immediate_wake() has been requested.

This cuts out all the pollfd hash additions, forming the poll
arguments and the actual poll() after a call to
poll_immediate_wake()

Signed-off-by: Anton Ivanov 

Thanks for the patch.

I think that this will have some undesirable side effects because it
avoids calling time_poll() if the wakeup should happen immediately, and
time_poll() does some thing that we always want to happen between one
main loop and another.  In particular the following calls from
time_poll() are important:

 coverage_clear();
 coverage_run();
 if (*last_wakeup && !thread_is_pmd()) {
 log_poll_interval(*last_wakeup);
 }

...

 if (!time_left) {
 ovsrcu_quiesce();
 } else {
 ovsrcu_quiesce_start();
 }

...

 if (deadline <= time_msec()) {
#ifndef _WIN32
 fatal_signal_handler(SIGALRM);
#else
 VLOG_ERR("wake up from WaitForMultipleObjects after deadline");
 fatal_signal_handler(SIGTERM);
#endif
 if (retval < 0) {
 retval = 0;
 }
 break;
 }

...

 *last_wakeup = time_msec();
 refresh_rusage();

Instead of this change, I'd suggest something more like the following,
along with the changes you made to suppress the file descriptors if the
timeout is already zero:

diff --git a/lib/timeval.c b/lib/timeval.c
index 193c7bab1781..f080a742 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -323,7 +323,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE 
*handles OVS_UNUSED,
  }
  
  #ifndef _WIN32

-retval = poll(pollfds, n_pollfds, time_left);
+retval = time_left ? poll(pollfds, n_pollfds, time_left) : 0;
  if (retval < 0) {
  retval = -errno;
  }




--
Anton R. Ivanov
Cambridgegreys Limited. Registered in England. Company Number 10273661
https://www.cambridgegreys.com/

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH] Optimize the poll loop for poll_immediate_wake()

2021-07-09 Thread Ben Pfaff
On Fri, Jul 09, 2021 at 06:19:06PM +0100, anton.iva...@cambridgegreys.com wrote:
> From: Anton Ivanov 
> 
> If we are not obtaining any useful information out of the poll(),
> such as is a fd busy or not, we do not need to do a poll() if
> an immediate_wake() has been requested.
> 
> This cuts out all the pollfd hash additions, forming the poll
> arguments and the actual poll() after a call to
> poll_immediate_wake()
> 
> Signed-off-by: Anton Ivanov 

Thanks for the patch.

I think that this will have some undesirable side effects because it
avoids calling time_poll() if the wakeup should happen immediately, and
time_poll() does some thing that we always want to happen between one
main loop and another.  In particular the following calls from
time_poll() are important:

coverage_clear();
coverage_run();
if (*last_wakeup && !thread_is_pmd()) {
log_poll_interval(*last_wakeup);
}

...

if (!time_left) {
ovsrcu_quiesce();
} else {
ovsrcu_quiesce_start();
}

...

if (deadline <= time_msec()) {
#ifndef _WIN32
fatal_signal_handler(SIGALRM);
#else
VLOG_ERR("wake up from WaitForMultipleObjects after deadline");
fatal_signal_handler(SIGTERM);
#endif
if (retval < 0) {
retval = 0;
}
break;
}

...

*last_wakeup = time_msec();
refresh_rusage();

Instead of this change, I'd suggest something more like the following,
along with the changes you made to suppress the file descriptors if the
timeout is already zero:

diff --git a/lib/timeval.c b/lib/timeval.c
index 193c7bab1781..f080a742 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -323,7 +323,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds, HANDLE 
*handles OVS_UNUSED,
 }
 
 #ifndef _WIN32
-retval = poll(pollfds, n_pollfds, time_left);
+retval = time_left ? poll(pollfds, n_pollfds, time_left) : 0;
 if (retval < 0) {
 retval = -errno;
 }

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev