cygrunsrv + sshd + rsync = 20 times too slow -- throttled?

Takashi Yano takashi.yano@nifty.ne.jp
Mon Sep 6 11:16:43 GMT 2021


Hi Corinna,

On Mon, 6 Sep 2021 10:13:10 +0200
Corinna Vinschen wrote:
> On Sep  6 05:09, Takashi Yano wrote:
> > On Sun, 5 Sep 2021 14:47:26 -0400
> > Ken Brown wrote:
> > > On 9/5/2021 9:50 AM, Takashi Yano wrote:
> > > > On Sun, 5 Sep 2021 22:40:59 +0900
> > > > Takashi Yano wrote:
> > > >> On Sun, 5 Sep 2021 08:15:23 +0900
> > > >> Takashi Yano wrote:
> > > >>> On Sat, 4 Sep 2021 10:04:12 -0400
> > > >>> Ken Brown wrote:
> > > >>>> On 9/4/2021 8:37 AM, Takashi Yano wrote:
> > > >>>>> On Sat, 4 Sep 2021 21:02:58 +0900
> > > >>>>> Takashi Yano wrote:
> > > >>>>>> On Fri, 3 Sep 2021 09:27:37 -0400
> > > >>>>>> Ken Brown wrote:
> > > >>>>>>> On 9/3/2021 8:22 AM, Takashi Yano wrote:
> > > >>>>>>>> POSIX says:
> > > >>>>>>>>        The value returned may be less than nbyte if the number of bytes left
> > > >>>>>>>>        in the file is less than nbyte, if the read() request was interrupted
> > > >>>>>>>>        by a signal, or if the file is a pipe or FIFO or special file and has
> > > >>>>>>>>                                                                          ~~~
> > > >>>>>>>>        fewer than nbyte bytes immediately available for reading.
> > > >>>>>>>>        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> > > >>>>>>>>
> > > >>>>>>>> https://pubs.opengroup.org/onlinepubs/009604599/functions/read.html
> > > >>>>>>>>
> > > >>>>>>>> If it is turned over, read() should read all data immediately available,
> > > >>>>>>>> I think.
> > > >>>>>>> [...]
> > > >>>>>> Corinna Vinschen wrote:
> > > >>>>>>> We can't keep the mutex while waiting on the pending read, and there
> > > >>>>>>> could be more than one pending read running at the time.  if so,
> > > >>>>>>> chances are extremly high, that the data written to the buffer gets
> > > >>>>>>> split like this:
> > > >>>>>>> [...]
> > > >>>>> Takashi Yano wrote:
> > > >>>>>> Why can't we keep the mutex while waiting on the pending read?
> > > >>>>>> If we can keep the mutex, the issue above mentioned does not
> > > >>>>>> happen, right?
> > [...]
> > @@ -239,43 +237,51 @@ fhandler_pipe::raw_read (void *ptr, size_t& len)
> >        return;
> >      }
> >  
> > -  do
> > +  DWORD timeout = is_nonblocking () ? 0 : INFINITE;
> > +  if (WAIT_TIMEOUT == WaitForSingleObject (read_mtx, timeout))
> 
> My code was originally not supposed to serialise the readers.  The
> mutex block should be short lived and only create an atomic block
> for the two calls NtQueryInformationFile and NtReadFile.
> 
> If you have multiple readers, all but one of them will hang in this
> WFSO.  They will block here without a chance to kill or Ctrl-C them
> and thread cancellation won't work.
> 
> To fix that you have to use cygwait and handle signals and thread
> cancellation the same way as in the below code following the NtReadFile.

OK. Thanks for the advice. Then what about the patch attached?

> >  	  /* If the pipe is empty, don't request more bytes than half the
> > -	     pipe buffer size.  Every pending read lowers WriteQuotaAvailable
> > -	     on the write side and thus affects select's ability to return
> > -	     more or less reliable info whether a write succeeds or not.
> > -
> > -	     Let the size of the request depend on the number of readers
> > -	     at the time. */
> > +	     pipe buffer size. Pending read lowers WriteQuotaAvailable on
> > +	     the write side and thus affects select's ability to return
> > +	     more or less reliable info whether a write succeeds or not. */
> > +	  ULONG chunk = max_atomic_write / 2;
> >  	  status = NtQueryInformationFile (get_handle (), &io,
> >  					   &fpli, sizeof (fpli),
> >  					   FilePipeLocalInformation);
> > -	  if (NT_SUCCESS (status) && fpli.ReadDataAvailable == 0)
> 
> If the readers are serialized anyway, why fetch only half the remaining
> buffer size?  In that case fetching fpli.InboundQuota - 1 is as good
> as fetching just the half of it, isn't it?

It sounds reasonable. Adopted in the attached patch.

-- 
Takashi Yano <takashi.yano@nifty.ne.jp>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Cygwin-pipe-Stop-counting-reader-and-read-all-availa.patch
Type: application/octet-stream
Size: 5370 bytes
Desc: not available
URL: <https://cygwin.com/pipermail/cygwin-developers/attachments/20210906/daed3fa3/attachment.obj>


More information about the Cygwin-developers mailing list