cygrunsrv + sshd + rsync = 20 times too slow -- throttled?
Corinna Vinschen
corinna-cygwin@cygwin.com
Mon Aug 30 14:12:29 GMT 2021
On Aug 30 09:41, Ken Brown wrote:
> On 8/30/2021 9:20 AM, Corinna Vinschen wrote:
> > On Aug 30 15:00, Corinna Vinschen wrote:
> > > On Aug 30 10:27, Corinna Vinschen wrote:
> > > > [Moving discussion to cygwin-developers]
> > > >
> > > > On Aug 29 11:57, Ken Brown via Cygwin wrote:
> > > > > Corinna, do you still see any benefit to switching to PIPE_NOWAIT? AFAICT,
> > > > > it wouldn't decrease the code size at this point, so the only question is
> > > > > whether it might improve performance.
> > > >
> > > > Pipes are already using PIPE_NOWAIT aka FILE_PIPE_COMPLETE_OPERATION
> > > > mode, see set_pipe_non_blocking. The problem is that it's not used for
> > > > blocking pipes. Rather, blocking pipes use overlapped IO. Overlapped
> > > > IO is conceptually upside-down from the POSIX concept of non-blocking.
> > > > Also, the information returned in FilePipeLocalInformation is historically
> > > > borderline. For kicks, see
> > > > https://cygwin.com/pipermail/cygwin-patches/2004q4/005002.html
> > > >
> > > > So my suggestion is to try switching to non-blocking Windows pipes
> > > > entirely, even for blocking pipes on the user level. It works nicely
> > > > for sockets.
> > >
> > > On second thought, I'm not so sure how to block on non-blocking pipes
> > > on writing. Assuming a write fails because the buffer is full, we
> > > don't have a waitable object to wait on. Unless the pipe handle is
> > > signalled if writing is allowed, but that would be a first in Windows.
> > > So in theory this would still require overlapped IO. Does that still
> > > work as desired if the pipe mode is non-blocking? I don't think I ever
> > > tried that...
> >
> > That probably doesn't make sense. If WriteFile returns without writing
> > something, what should overlapped io be waiting on?
>
> The approach I've taken on the topic/pipe branch is to stop using overlapped
> I/O and to always keep the blocking mode of the Windows pipe in sync with
> the blocking mode of the fhandler. This seems to work pretty well so far,
> although problems could certainly show up after further testing.
Erm... afaics, fhandler_pipe::raw_read and fhandler_pipe::raw_write are
still using overlapped IO on blocking sockets. Otherwise, how'd you
handle signals?
Just to be clear, Windows pipes can be read/write in three modes:
- non-blocking (FILE_PIPE_COMPLETE_OPERATION)
- synchronous (FILE_PIPE_QUEUE_OPERATION, non-overlapped)
- asynchronous (FILE_PIPE_QUEUE_OPERATION, overlapped)
Right now the pipe code uses non-blocking mode for non-blocking sockets
and asynchronous mode for blocking sockets. This looks like the most
promising approach, afaics.
Corinna
More information about the Cygwin-developers
mailing list