명명 된 파이프가 파일에 쓰는 것만 큼 느린 이유는 무엇입니까?


18

일방적 프로세스 간 통신을 간소화 할 수 있도록 명명 된 파이프의 작동 방식을 이해하려고합니다. 데이터를 순환 버퍼에 복사하여 RAM에 저장되어 있다고 생각할 때 약간의 오버 헤드가 예상되므로 파이프가 파일에 쓰는 것보다 훨씬 빠를 것으로 예상했습니다 (RAM은 디스크보다 수십 배 빠릅니다).

대신 명명 된 파이프 (또는 익명 파이프)가 파일과 거의 같은 속도라는 것을 알았습니다. Ubuntu Linux를 실행하는 일반 디스크 드라이브 (솔리드 상태 아님)가있는 3GHz 데스크탑에 있습니다. 다음은 Python의 단순화 된 테스트 프로그램입니다.

import sys
import time
import random

megabyte = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for x in range(1024**2))

while True:
    before = time.time()
    sys.stdout.write(megabyte)
    after = time.time()
    sys.stderr.write("{} microseconds\n".format(1e6 * (after - before)))

배관 /dev/null:

python test.py > /dev/null

각 메가 바이트 당 2.1 마이크로 초 (일정)를 생성합니다.

파일로 배관 :

python test.py > /tmp/testout.txt

500 마이크로 초에서 930 마이크로 초 사이로 이동합니다 (파일이 커질수록 더 큰 값이 더 일반적으로 나타납니다. 아마도 디스크 공간을 찾고 있음).

그런 다음 명명 된 파이프 :

mkfifo testpipe
cat testpipe > /dev/null &
python test.py > testpipe

640 마이크로 초 (일정한) 및 명명되지 않은 파이프를 생성합니다.

python test.py | cat > /dev/null

또한 650 마이크로 초 (일정)를 산출합니다.

파이프의 속도가 왜 파일의 속도보다 속도와 비슷한 지 설명 할 수 있습니까 /dev/null? "RAM 기반 버퍼가 아닌 파일 기반 버퍼를 통해 파이프를 실행"하는 스위치가 있고 스위치를 변경할 수 있습니까? 커널 옵션이거나 쉘 변수 일 수 있습니까?

또 다른 해석 : 500은 파이핑 만하고 930은 실제로 쓰기 때문에 디스크 출력이 500에서 930 마이크로 초 사이로 점프한다고 가정합니다. 그런 다음 두 경우 모두 배관의 500 ~ 640은 같습니다. 그러나 이러한 해석에 따라 파이핑과 실제로 디스크에 쓰는 것 사이에 두 가지 요소 만있는 이유는 무엇입니까? RAM 디스크에 관해 이야기하는 웹 사이트는 RAM 디스크가 하드 디스크보다 50-200 배 빠르다고 말합니다.


1
/dev/null파일, FIFO, 파이프 등 무엇이든 쓰는 데 실제로 쓰는 것은 실제로 저렴합니다. "많은"처리 노력이 필요하기 때문에 훨씬 비쌉니다.
glglgl

답변:


31

파일을 사용할 때 실제로 디스크를 누르지 않기 때문에 성능상의 이점이 없습니다. 데이터가 디스크로가는 도중이지만 실행 스레드는 디스크가 도착하기를 기다릴 필요가 없으므로 실제로 디스크에 닿는 속도 저하를 보지 못했습니다 .

당신은 도착이, 부르는 얼마나 느린 볼을 완료하려면 디스크 작동을 위해 대기 할 경우 sync()(파이썬 버전에 따라 다름으로, 참조하는 방법을 여기에 단지 당신의 디스크는 수십 마이크로 수천에서 찾고있을거야을 -) RAID 컨트롤러와 같은 빠른 쓰기 캐시가 없다고 가정하면 파일을 몇 번 작성해야합니다.


언제 블록 장치의 탐색 시간에 대해 걱정하지 않아도 되나요? :)
EEAA

5
@EEAA 항상 모든 SSD.

1
네 말이 맞아하십시오으로 sync()디스크 쓰기 시간이 평균 74,000 마이크로된다. ( flush()내 테스트의 한 변형에서하고 있었지만 그렇게하지 못했습니다.) 그래서 메가 바이트 당 500 ~ 640 마이크로 초가 실제로 파이프 오버 헤드가 이해한다는 해석은 감사합니다.
Jim Pivarski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.