Go crypto/ssh 包,stdoutpipe() 的缓冲区限制是多少 io.Reader
Go crypto/ssh package, what is the buffer limit for stdoutpipe() io.Reader
我正在编写一个实用程序,使用 crypto/ssh 包在远程服务器上执行命令。我目前正在从 session.stdoutpipe() io.Reader 读取到 bytes.Buffer ,我可以在会话完成后格式化并打印出来。
文档指出:
StdoutPipe func() (io.Reader, error)
StdoutPipe returns a pipe that will be connected to the remote command's standard output when the command starts. There is a fixed amount of buffering that is shared between stdout and stderr streams. If the StdoutPipe reader is not serviced fast enough it may eventually cause the remote command to block.
到目前为止,我的测试没有遇到任何问题,但我很想知道固定金额是多少。在命令完成之前,我没有读取管道 Reader 就成功地流式传输了高达 6.5mb 的文本。
有谁知道固定数量是多少,或者命令什么时候开始阻塞?我在源码里找不到。
它不在 Go 源代码中,因为它是 OS 依赖的。
应用程序不应依赖于特定的容量:应用程序的设计应确保读取进程在数据可用时立即使用数据,这样写入进程就不会一直处于阻塞状态。
例如,在 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.
我正在编写一个实用程序,使用 crypto/ssh 包在远程服务器上执行命令。我目前正在从 session.stdoutpipe() io.Reader 读取到 bytes.Buffer ,我可以在会话完成后格式化并打印出来。
文档指出:
StdoutPipe func() (io.Reader, error) StdoutPipe returns a pipe that will be connected to the remote command's standard output when the command starts. There is a fixed amount of buffering that is shared between stdout and stderr streams. If the StdoutPipe reader is not serviced fast enough it may eventually cause the remote command to block.
到目前为止,我的测试没有遇到任何问题,但我很想知道固定金额是多少。在命令完成之前,我没有读取管道 Reader 就成功地流式传输了高达 6.5mb 的文本。
有谁知道固定数量是多少,或者命令什么时候开始阻塞?我在源码里找不到。
它不在 Go 源代码中,因为它是 OS 依赖的。
应用程序不应依赖于特定的容量:应用程序的设计应确保读取进程在数据可用时立即使用数据,这样写入进程就不会一直处于阻塞状态。
例如,在 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.