On 5/19/22 7:29 PM, Damien Miller wrote:
On Thu, 19 May 2022, rapier wrote:
I think I have a fix, or at least a better band aid, for people in my
situation. If, at some point, you decide to increase the size of
CHAN_SES_WINDOW_DEFAULT this may be helpful.
Basically, the changes to channels.h increases the size of SSH's receive
buffer, which triggers this behaviour. The changes in sshbuf.c tests to see if
the buffer is larger than ssh buffer that seems to be handling the incoming
packets. The assumption is that if it's larger then it's the receive buffer. I
then aggressively grow that buffer (4MB at a time) but no more buf->max_size.
The debug statement is so you can see what's going on but that should be
removed for production.
If you comment out the section that grows the window aggressively you can see
the stall as the buffer grows 32k at a time. I have some concerns about
growing the buffer it such large chunks. Also, I'd ideally make it a function
of the size of c->local_window_max but I can't seem to get an extern working.
I don't understand the problem and I don't understand the fix, sorry.
I don't really understand the problem either whcih means the fix really
is a band aid at this point.
The sshbuf_read() in packet.c will always reserve PACKET_MAX_SIZE (256k)
in addition to whatever is in the buffer currently and will greedily try to
fill it (up to max_size).
The problem is that I'm not seeing that behaviour. It's pretty easy to
see though - just up the default window and drop that debug into
sshbuf.c. It's easier to see if you ramp up the delay with netem but
even with no delay it's there. Either way, I'm only seeing it ramp up by
32K at a time.
Is there some other buffer that is growing more slowly?
I honestly don't know. No small part of this is guess work on my part
but there is some buffer that's growing pretty slowly in this situation.
If so, I don't think the answer is to change the buffer code but instead
to sshbuf_reserve() an appropriate size before filling data into it.
I'll look into that but I'm in a place where figuring out where to start
can be tricky (my knowledge of the sshbuf code is, to be sure, weak) so
I'm mostly working backwards. I got to where I am by profiling via
vtune. sshbuf_reserve() is in the call stack so I'll start going
openssh-unix-dev mailing list