Difference in buffer behaviour between 8.89 and 8.9?

rsbecker at nexbridge.com rsbecker at nexbridge.com
Fri May 20 04:33:05 AEST 2022


This may be part of it for me also, but in the other direction. I cannot
exceed 56000 bytes for any I/O unless through a buffered stream.

>-----Original Message-----
>From: openssh-unix-dev <openssh-unix-dev-
>bounces+rsbecker=nexbridge.com at mindrot.org> On Behalf Of rapier
>Sent: May 19, 2022 2:22 PM
>To: Damien Miller <djm at mindrot.org>
>Cc: openssh-unix-dev at mindrot.org
>Subject: Re: Difference in buffer behaviour between 8.89 and 8.9?
>
>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.
>
>Chris
>
>This patch is against the head of the master branch of openssh-portable.
>
>diff --git a/channels.h b/channels.h
>index 828c1b61b..ae897680c 100644
>--- a/channels.h
>+++ b/channels.h
>@@ -210,7 +210,7 @@ struct Channel {
>
>  /* default window/packet sizes for tcp/x11-fwd-channel */
>  #define CHAN_SES_PACKET_DEFAULT        (32*1024)
>-#define CHAN_SES_WINDOW_DEFAULT        (64*CHAN_SES_PACKET_DEFAULT)
>+#define CHAN_SES_WINDOW_DEFAULT
>(4096*CHAN_SES_PACKET_DEFAULT)
>  #define CHAN_TCP_PACKET_DEFAULT        (32*1024)
>  #define CHAN_TCP_WINDOW_DEFAULT        (64*CHAN_TCP_PACKET_DEFAULT)
>  #define CHAN_X11_PACKET_DEFAULT        (16*1024)
>diff --git a/sshbuf.c b/sshbuf.c
>index 840b899b1..b45720e1f 100644
>--- a/sshbuf.c
>+++ b/sshbuf.c
>@@ -27,6 +27,7 @@
>  #include "ssherr.h"
>  #include "sshbuf.h"
>  #include "misc.h"
>+#include "log.h"
>
>  static inline int
>  sshbuf_check_sanity(const struct sshbuf *buf) @@ -327,9 +328,27 @@
>sshbuf_allocate(struct sshbuf *buf, size_t len)
>          */
>         need = len + buf->size - buf->alloc;
>         rlen = ROUNDUP(buf->alloc + need, SSHBUF_SIZE_INC);
>+       /* I think the receive buffer is the one that is
>+        * growing slowly. This buffer quickly ends up being larger
>+        * than the typical packet buffer (usually 32.25KB) so if
>+        * we explicitly test for growth needs larger than that we
>+        * can accelerate the growth of this buffer and reduce load
>+        * the CPU and improve throughput. Ideally we would use
>+        * (local_window_max - rlen) as need but we don't have access
>+        * to that here */
>+       if (rlen > 34*1024) {
>+               need = 4 * 1024 * 1024;
>+               rlen = ROUNDUP(buf->alloc + need, SSHBUF_SIZE_INC);
>+               if (rlen > buf->max_size)
>+                       rlen = buf->max_size;
>+       }
>         SSHBUF_DBG(("need %zu initial rlen %zu", need, rlen));
>         if (rlen > buf->max_size)
>                 rlen = buf->alloc + need;
>+       /* be sure to include log.h if you uncomment the debug
>+        * this debug helped identify the buffer growth issue in v8.9
>+        * see the git log about it. search for sshbuf_read */
>+       debug("adjusted rlen: %zu, len: %lu for %p", rlen, len, buf);
>         SSHBUF_DBG(("adjusted rlen %zu", rlen));
>         if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL) {
>                 SSHBUF_DBG(("realloc fail")); @@ -401,4 +420,3 @@
>sshbuf_consume_end(struct sshbuf *buf, size_t len)
>         SSHBUF_TELL("done");
>         return 0;
>  }
>
>
>On 5/19/22 11:23 AM, rapier wrote:
>> Damien
>>
>>> 8.9 switch from select() to poll() and included a couple of bugs that
>>> could cause weird problems. IMO you should try to port to what's on
>>> the top of the V_9_0 git branch, which is 9.0 + one more poll()-
>>> related fix.
>>
>> I just tried it with the head (commit bedb93415b) of the master branch.
>> Unfortunately, I'm still seeing the issue.
>>
>> debug1: adjusted rlen: 33024, len: 32788 for 0x5609805a3eb0
>> debug1: adjusted rlen: 36438016, len: 32768 for 0x5609805b0ed0
>> debug1: adjusted rlen: 33024, len: 32788 for 0x5609805a3eb0
>> debug1: adjusted rlen: 36470784, len: 32768 for 0x5609805b0ed0
>> debug1: adjusted rlen: 33024, len: 32788 for 0x5609805a3eb0
>> debug1: adjusted rlen: 36503552, len: 32768 for 0x5609805b0ed0
>>
>> Chris
>_______________________________________________
>openssh-unix-dev mailing list
>openssh-unix-dev at mindrot.org
>https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev



More information about the openssh-unix-dev mailing list