生産者が消費者よりもパイプラインでより速く動くことを確認する

生産者が消費者よりもパイプラインでより速く動くことを確認する

私が持っているなら:

node foo.js | node bar.js

キューがそれらの間に構築されていることを確認する方法はありますか?つまり、生産者はstdioの面で消費者を超えていますか?

答え1

ioctl(,FIONREAD,)Linuxでは、パイプを使用して現在読めるバイト数を取得できます。これはman 7 pipeFIONREADまた)で見つけることができますman tty_ioctl。これをアプリケーションに組み込むか、標準入力としてパイプを使用してPerlのようなものを並列に実行できます。

#!/usr/bin/perl
# https://unix.stackexchange.com/a/440361/119298
use strict;
require 'sys/ioctl.ph';
my $v = pack("l",0);
$| = 1;
# while(1)
{
  die "ioctl: $!" if ioctl(STDIN, &FIONREAD, $v)!=0;
  my @r = unpack("l",$v);
  printf "%d ",$r[0];
#  sleep 1;
}

だから使い方は

node foo.js | (myperl & node bar.js)

次のことを試してください

while sleep 1;do date;done |
while sleep 1.1;do myperl 2>/dev/null; dd status=none count=1 bs=20;done

perl_FORTIFY_SOURCEstderrリダイレクトが発生するという警告メッセージが表示されます。読み取った長さddがの長さより小さいdateので、結果が徐々に増加することがわかります。

完全性のために、upを使用してパイプの容量を取得してfcntl(,F_GETPIPE_SZ)設定できます(ルートまたはhasでない場合)。望むより。fcntl(,F_SETPIPE_SZ,newvalue)/proc/sys/fs/pipe-max-sizeCAP_SYS_RESOURCEman fcntl

関連情報