Перейдите в пакет crypto / ssh, каково ограничение буфера для stdoutpipe () io.Reader - PullRequest
0 голосов
/ 10 февраля 2019

Я пишу утилиту для выполнения команд на удаленных серверах с пакетом crypto / ssh.В настоящее время я читаю из session.stdoutpipe () io.Reader в bytes.Buffer, который я могу отформатировать и распечатать после завершения сеанса.

Документация гласит:

StdoutPipe func () (io.Reader, error) StdoutPipe возвращает канал, который будет подключен к стандартному выводу удаленной команды при запуске команды. Существует фиксированный объем буферизации , который распределяется между потоками stdout и stderr.Если устройство чтения StdoutPipe не обслуживается достаточно быстро, это может в конечном итоге привести к блокировке удаленной команды.

У меня пока не было проблем с тестированием, но мне было любопытно узнать, что это такое.фиксированная сумма.Я успешно транслировал текст до 6,5 Мб, не читая программу чтения каналов, пока команда не будет выполнена.

Кто-нибудь знает, что такое фиксированная сумма или когда команда начнет блокироваться?Я не могу найти его в источнике.

1 Ответ

0 голосов
/ 10 февраля 2019

Он отсутствует в исходном коде Go, поскольку зависит от ОС.

Приложения не должны полагаться на определенную емкость: приложение должно быть спроектировано так, чтобы процесс чтения потреблял данные, как только он стал доступным, чтобы процесс записи не оставался заблокированным.

Например, в Linux:

$ man pipe

PIPE(2)                    Linux Programmer's Manual                   PIPE(2)

NAME
       pipe, pipe2 - create pipe

Pipe capacity

       A pipe has a limited capacity.  If the pipe is full, then a write(2)
       will block or fail, depending on whether the O_NONBLOCK flag is set
       (see below).  Different implementations have different limits for the
       pipe capacity.  Applications should not rely on a particular
       capacity: an application should be designed so that a reading process
       consumes data as soon as it is available, so that a writing process
       does not remain blocked.

       In Linux versions before 2.6.11, the capacity of a pipe was the same
       as the system page size (e.g., 4096 bytes on i386).  Since Linux
       2.6.11, the pipe capacity is 16 pages (i.e., 65,536 bytes in a system
       with a page size of 4096 bytes).  Since Linux 2.6.35, the default
       pipe capacity is 16 pages, but the capacity can be queried and set
       using the fcntl(2) F_GETPIPE_SZ and F_SETPIPE_SZ operations.  See
       fcntl(2) for more information.
...