Re: [PATCH] Reduce delays to improve iscsi boot performance
On Monday, April 16, 2018 at 2:38:01 PM UTC-7, The Lee-Man wrote: > > On Friday, April 13, 2018 at 3:19:11 PM UTC-7, cathy.z...@oracle.com > wrote: >> >> From: Cathy Zhou>> >> iscsi boot performance can be improved by sleep() with finer >> grained interval and exponential backoff. >> >> Signed-off-by: Cathy Zhou >> --- >> usr/iscsistart.c | 35 --- >> 1 file changed, 24 insertions(+), 11 deletions(-) >> >> diff --git a/usr/iscsistart.c b/usr/iscsistart.c >> index 67ac475..1e77e40 100644 >> --- a/usr/iscsistart.c >> +++ b/usr/iscsistart.c >> @@ -27,6 +27,7 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -224,7 +225,8 @@ static int login_session(struct node_rec *rec) >> { >> iscsiadm_req_t req; >> iscsiadm_rsp_t rsp; >> -int rc, retries = 0; >> +int rc, msec, err; >> +struct timespec ts; >> >> rc = apply_params(rec); >> if (rc) >> @@ -237,18 +239,29 @@ static int login_session(struct node_rec *rec) >> req.command = MGMT_IPC_SESSION_LOGIN; >> memcpy(, rec, sizeof(*rec)); >> >> -retry: >> -rc = iscsid_exec_req(, , 0, ISCSID_REQ_TIMEOUT); >> /* >> - * handle race where iscsid proc is starting up while we are >> - * trying to connect. >> + * Need to handle race where iscsid proc is starting up while we >> are >> + * trying to connect. Retry with exponential backoff, start from >> 50 ms. >> */ >> -if (rc == ISCSI_ERR_ISCSID_NOTCONN && retries < 30) { >> -retries++; >> -sleep(1); >> -goto retry; >> -} else if (rc) >> -iscsi_err_print_msg(rc); >> +for (msec = 50; msec <= 15000; msec <<= 1) { >> > > Why are you using 50 -> 15000? Isn't the sequence then going to be: > -> 50 > -> 100 > -> 200 > -> 400 > -> 800 > -> 1600 (too large) > > So why not either go to 800 or to 1600? > > Doh! I am off by a factor of 10! -> 3200, 6400, 12800 Still, the point is that maybe the max should be the a power of 10 of the min? (It's really just a nit) > +rc = iscsid_exec_req(, , 0, ISCSID_REQ_TIMEOUT); >> +if (rc == 0) { >> +return rc; >> +} else if (rc == ISCSI_ERR_ISCSID_NOTCONN) { >> +ts.tv_sec = msec / 1000; >> +ts.tv_nsec = (msec % 1000) * 100L; >> + >> +/* On EINTR, retry nanosleep with remaining >> time. */ >> +while ((err = nanosleep(, )) < 0 && >> + errno == EINTR); >> > > I'd feel better about this if you used one more level of parenthesis. > > Also, why are you supplying two timespec values? You don't care about > the remainder, so pass in a NULL as the second argument? > >> +if (err < 0) >> +break; >> +} else { >> +break; >> +} >> +} >> + >> +iscsi_err_print_msg(rc); >> return rc; >> } >> >> > > Also, what kind of time improvement did you see with this? > >> -- >> 2.17.0 >> >> -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscr...@googlegroups.com. To post to this group, send email to open-iscsi@googlegroups.com. Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Re: [PATCH] Reduce delays to improve iscsi boot performance
On Friday, April 13, 2018 at 3:19:11 PM UTC-7, cathy.z...@oracle.com wrote: > > From: Cathy Zhou> > iscsi boot performance can be improved by sleep() with finer > grained interval and exponential backoff. > > Signed-off-by: Cathy Zhou > --- > usr/iscsistart.c | 35 --- > 1 file changed, 24 insertions(+), 11 deletions(-) > > diff --git a/usr/iscsistart.c b/usr/iscsistart.c > index 67ac475..1e77e40 100644 > --- a/usr/iscsistart.c > +++ b/usr/iscsistart.c > @@ -27,6 +27,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -224,7 +225,8 @@ static int login_session(struct node_rec *rec) > { > iscsiadm_req_t req; > iscsiadm_rsp_t rsp; > -int rc, retries = 0; > +int rc, msec, err; > +struct timespec ts; > > rc = apply_params(rec); > if (rc) > @@ -237,18 +239,29 @@ static int login_session(struct node_rec *rec) > req.command = MGMT_IPC_SESSION_LOGIN; > memcpy(, rec, sizeof(*rec)); > > -retry: > -rc = iscsid_exec_req(, , 0, ISCSID_REQ_TIMEOUT); > /* > - * handle race where iscsid proc is starting up while we are > - * trying to connect. > + * Need to handle race where iscsid proc is starting up while we > are > + * trying to connect. Retry with exponential backoff, start from > 50 ms. > */ > -if (rc == ISCSI_ERR_ISCSID_NOTCONN && retries < 30) { > -retries++; > -sleep(1); > -goto retry; > -} else if (rc) > -iscsi_err_print_msg(rc); > +for (msec = 50; msec <= 15000; msec <<= 1) { > Why are you using 50 -> 15000? Isn't the sequence then going to be: -> 50 -> 100 -> 200 -> 400 -> 800 -> 1600 (too large) So why not either go to 800 or to 1600? +rc = iscsid_exec_req(, , 0, ISCSID_REQ_TIMEOUT); > +if (rc == 0) { > +return rc; > +} else if (rc == ISCSI_ERR_ISCSID_NOTCONN) { > +ts.tv_sec = msec / 1000; > +ts.tv_nsec = (msec % 1000) * 100L; > + > +/* On EINTR, retry nanosleep with remaining time. > */ > +while ((err = nanosleep(, )) < 0 && > + errno == EINTR); > I'd feel better about this if you used one more level of parenthesis. Also, why are you supplying two timespec values? You don't care about the remainder, so pass in a NULL as the second argument? > +if (err < 0) > +break; > +} else { > +break; > +} > +} > + > +iscsi_err_print_msg(rc); > return rc; > } > > Also, what kind of time improvement did you see with this? > -- > 2.17.0 > > -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscr...@googlegroups.com. To post to this group, send email to open-iscsi@googlegroups.com. Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.
Re: [PATCH] Reduce delays to improve iscsi boot performance
Leeman, Thanks very much for your comments. See inline: On Mon, Apr 16, 2018 at 2:38 PM, The Lee-Manwrote: ... >> -retry: >> -rc = iscsid_exec_req(, , 0, ISCSID_REQ_TIMEOUT); >> /* >> - * handle race where iscsid proc is starting up while we are >> - * trying to connect. >> + * Need to handle race where iscsid proc is starting up while we are >> + * trying to connect. Retry with exponential backoff, start from 50 ms. >> */ >> -if (rc == ISCSI_ERR_ISCSID_NOTCONN && retries < 30) { >> -retries++; >> -sleep(1); >> -goto retry; >> -} else if (rc) >> -iscsi_err_print_msg(rc); >> +for (msec = 50; msec <= 15000; msec <<= 1) { > > > Why are you using 50 -> 15000? Isn't the sequence then going to be: > -> 50 > -> 100 > -> 200 > -> 400 > -> 800 > -> 1600 (too large) > > So why not either go to 800 or to 1600? I saw your another email. Yes, with the old implementation, retry gives up until 30 seconds, that is why we choose to stop at 30s/2. > > >> +rc = iscsid_exec_req(, , 0, ISCSID_REQ_TIMEOUT); >> +if (rc == 0) { >> +return rc; >> +} else if (rc == ISCSI_ERR_ISCSID_NOTCONN) { >> +ts.tv_sec = msec / 1000; >> +ts.tv_nsec = (msec % 1000) * 100L; >> + >> +/* On EINTR, retry nanosleep with remaining time. */ >> +while ((err = nanosleep(, )) < 0 && >> + errno == EINTR); > > > I'd feel better about this if you used one more level of parenthesis. > > > Also, why are you supplying two timespec values? You don't care about > the remainder, so pass in a NULL as the second argument? As the comments explained: on EINTR, we will retry nanosleep with the remaining time, that is why we care about the remainder. Hopefully this also explains why we don't need one more level of parenthesis. >> >> +if (err < 0) >> +break; >> +} else { >> +break; >> +} >> +} >> + >> +iscsi_err_print_msg(rc); >> return rc; >> } >> > > > Also, what kind of time improvement did you see with this? >From what we can see, the interval between below two log messages has been reduced from 1s to 0.05s. systemd[689]: Executing: /usr/sbin/iscsistart -i ... scsi host2: iSCSI Initiator over TCP/IP Thanks - Cathy >> >> -- >> 2.17.0 >> > -- > You received this message because you are subscribed to the Google Groups "open-iscsi" group. > To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscr...@googlegroups.com. > To post to this group, send email to open-iscsi@googlegroups.com. > Visit this group at https://groups.google.com/group/open-iscsi. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "open-iscsi" group. To unsubscribe from this group and stop receiving emails from it, send an email to open-iscsi+unsubscr...@googlegroups.com. To post to this group, send email to open-iscsi@googlegroups.com. Visit this group at https://groups.google.com/group/open-iscsi. For more options, visit https://groups.google.com/d/optout.