Bash stdbuf是否优先用于减少管道数据流?
如果有管道命令,例如:Bash stdbuf是否优先用于减少管道数据流?,bash,performance,io,pipe,centos7,Bash,Performance,Io,Pipe,Centos7,如果有管道命令,例如: a | b | c 为了减少管道中不必要的数据流,我会使用: 在: 第一个命令 最后的命令 每一个命令 例如: stdbuf -i0 -o0 -e0 a | b | c a | b | stdbuf -i0 -o0 -e0 c stdbuf -i0 -o0 -e0 a | stdbuf -i0 -o0 -e0 b | stdbuf -i0 -o0 -e0 c 让我们假设命令c是首先终止的,因为它涉及SIGPIPE行为 stdbuf是否优于unbuffer?上面使用
a | b | c
为了减少管道中不必要的数据流,我会使用:
在:
- 第一个命令
- 最后的命令
- 每一个命令
stdbuf -i0 -o0 -e0 a | b | c
a | b | stdbuf -i0 -o0 -e0 c
stdbuf -i0 -o0 -e0 a | stdbuf -i0 -o0 -e0 b | stdbuf -i0 -o0 -e0 c
让我们假设命令c
是首先终止的,因为它涉及SIGPIPE
行为
stdbuf
是否优于unbuffer
?上面使用的选项是否合适?其他方法在性能和代码可维护性方面是否优于其他方法
注意:此问题适用于:
- bash4.2及更高版本
- Red Hat 7、CentOS 7和相关发行版(即,不是Debian等)
- 不得使用第三方软件。软件包必须是可用的,例如,通过iso存储库中的操作系统提供程序包(RHEL 7、Fedora 7等也是如此)
a
的写入速度快于b
的读取速度,则缓冲区将填满,a
将阻塞,直到b
可以读取更多。如果a
的写入速度低于b
的读取速度,则b
将阻塞,直到数据可用。在stdout上从a
出来的所有内容都进入b
中,而在stdout
上从b
出来的所有内容都进入c
。没有不必要的流。缓冲是有原因的,通常是为了高效使用CPU。在某些边缘情况下,需要关闭缓冲,例如在调试时,这就是大多数系统默认情况下stderr
不缓冲的原因。通常,关闭缓冲会导致性能下降,尽管在许多情况下不会有可测量的差异stdbuf
是非标准的,不会影响不使用流的程序:请参见manstdbuf
。您能否定义一下“减少不必要的数据流”的含义。实际数据量不会受到影响,还会有一个进程,但缓冲区会更小。这就是你的意图吗?只是想澄清一下,避免使用缓冲区可能会减少内存使用,但会增加CPU的负载。你想优化什么?没有“不必要的”数据流;操作系统已经在管理两个进程之间的缓冲区。如果a
的写入速度快于b
的读取速度,则缓冲区将填满,a
将阻塞,直到b
可以读取更多。如果a
的写入速度低于b
的读取速度,则b
将阻塞,直到数据可用。在stdout上从a
出来的所有内容都进入b
中,而在stdout
上从b
出来的所有内容都进入c
。没有不必要的流。缓冲是有原因的,通常是为了高效使用CPU。在某些边缘情况下,需要关闭缓冲,例如在调试时,这就是大多数系统默认情况下stderr
不缓冲的原因。通常,关闭缓冲会导致性能下降,尽管在许多情况下不会有可测量的差异stdbuf
是非标准的,不会影响不使用流的程序:请参阅manstdbuf
。
stdbuf -i0 -o0 -e0 a | b | c
a | b | stdbuf -i0 -o0 -e0 c
stdbuf -i0 -o0 -e0 a | stdbuf -i0 -o0 -e0 b | stdbuf -i0 -o0 -e0 c