단방향 프로세스 간 통신을 간소화할 수 있도록 명명된 파이프가 작동하는 방식을 이해하려고 합니다. 데이터를 순환 버퍼에 복사하면 약간의 오버헤드가 발생할 것으로 예상됩니다. 이는 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은 두 경우 모두 동일합니다. 그러나 이러한 설명을 고려할 때 파이핑과 실제로 디스크에 쓰는 것 사이에는 왜 2배만 존재합니까? RAM 디스크에 대해 설명하는 웹사이트RAM 디스크는 하드 디스크보다 50~200배 빠르다고 합니다.
답변1
파일을 사용할 때 실제로 디스크에 액세스하지 않기 때문에 어떤 성능 이점도 볼 수 없습니다. 데이터는 디스크로 이동하는 중이지만 실행 스레드는 디스크에 도달할 때까지 기다릴 필요가 없습니다. 실제로는하지 마십시오보다디스크에 충격을 가하면 속도가 손실됩니다.
얼마나 느린지 확인하기 위해 디스크 작업이 완료될 때까지 기다리려면 다음을 호출하세요. sync()
(이것이 Python 버전에 따라 어떻게 달라지는지는 다음을 참조하세요.)여기) - 디스크가 파일을 쓰기 위해 몇 번 검색하도록 만드는 데 수만 마이크로초를 소비하게 됩니다(RAID 컨트롤러와 같은 일종의 빠른 쓰기 캐시가 없다고 가정).