생산자가 소비자보다 파이프라인에서 더 빠르게 움직이는지 확인

생산자가 소비자보다 파이프라인에서 더 빠르게 움직이는지 확인

만약 내가 가지고 있다면:

node foo.js | node bar.js

대기열이 그들 사이에 구축되고 있는지 확인하는 방법이 있습니까? 즉, 생산자가 stdio 측면에서 소비자를 능가합니까?

답변1

ioctl(,FIONREAD,)Linux에서 파이프를 사용하여 현재 읽을 수 있는 바이트 수를 얻을 수 있습니다 . 이는 man 7 pipe( FIONREAD또한 ) 에서 찾을 수 있습니다 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

관련 정보