![생산자가 소비자보다 파이프라인에서 더 빠르게 움직이는지 확인](https://linux55.com/image/132278/%EC%83%9D%EC%82%B0%EC%9E%90%EA%B0%80%20%EC%86%8C%EB%B9%84%EC%9E%90%EB%B3%B4%EB%8B%A4%20%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%97%90%EC%84%9C%20%EB%8D%94%20%EB%B9%A0%EB%A5%B4%EA%B2%8C%20%EC%9B%80%EC%A7%81%EC%9D%B4%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8.png)
만약 내가 가지고 있다면:
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_SOURCE
stderr 리디렉션이 발생한다는 경고 메시지가 나타납니다 . 읽은 길이 dd
가 의 길이보다 작 date
으므로 결과가 점차 증가하는 것을 볼 수 있습니다.
완전성을 위해 up을 사용하여 파이프의 용량을 가져와 fcntl(,F_GETPIPE_SZ)
설정할 수 있습니다(루트 또는 has가 아닌 경우). 바라보다.fcntl(,F_SETPIPE_SZ,newvalue)
/proc/sys/fs/pipe-max-size
CAP_SYS_RESOURCE
man fcntl