Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash stdbuf是否优先用于减少管道数据流?_Bash_Performance_Io_Pipe_Centos7 - Fatal编程技术网

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等也是如此)

您能否定义“减少不必要的数据流”的含义。实际数据量不会受到影响,还会有一个进程,但缓冲区会更小。这就是你的意图吗?只是想澄清一下,避免使用缓冲区可能会减少内存使用,但会增加CPU的负载。你想优化什么?没有“不必要的”数据流;操作系统已经在管理两个进程之间的缓冲区。如果
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