1P by neo 7달전 | favorite | 댓글 1개
  • Unix 파이프의 Linux에서의 구현과 파이프를 통해 데이터를 쓰고 읽는 테스트 프로그램 최적화 방법 탐구
  • 초기 프로그램은 약 3.5GiB/s의 처리량을 가졌으며, 다양한 최적화를 통해 이를 20배로 향상
  • 이러한 최적화는 Linux의 perf 도구를 사용하여 프로그램을 프로파일링함으로써 이루어짐
  • 본문은 ~35GiB/s의 속도로 파이프에 출력을 밀어넣는 최적화된 FizzBuzz 프로그램에 영감을 받음
  • 파이프의 내부 작동 방식, 그것들로부터 쓰고 읽는 것이 느린 이유, 그리고 vmsplice와 splice 시스템 호출이 성능을 향상시키는 방법에 대해 깊이 파고듬
  • Linux 페이징과 huge pages 사용이 프로그램의 더 빠른 버전으로 이어질 수 있는 방법에 대해 논의
  • 최종 최적화는 폴링을 바쁜 루프로 대체하는 것을 포함
  • 테스트는 Intel Skylake i7-8550U CPU와 Linux 5.17에서 수행됨
  • 본문은 메모리가 일정한 크기의 덩어리인 페이지로 구성되는 방법과 CPU가 페이지 테이블을 사용하여 가상 주소를 물리 주소로 변환하는 방법에 대해 자세히 설명
  • 본문은 프로그램에서 huge pages로 전환하면 성능이 약 50% 향상된다는 관찰로 결론
  • 본문은 CPU에서 huge pages의 사용과 Translation Lookaside Buffer (TLB) 미스를 줄이는 방법에 대해 논의, 이는 성능을 향상시킬 수 있음
  • 커널 코드는 struct page가 현재 아키텍처의 표준 크기 페이지를 가리킨다고 가정. huge pages의 경우, "head" struct page에 실제 물리 페이지에 대한 정보가 포함되며, 연속적인 "tail" 페이지는 head 페이지를 가리키는 포인터만 포함
  • 최근 커널(5.17 이후)은 head 페이지를 명시적으로 식별하는 새로운 타입인 struct folio를 포함. 이는 런타임에 struct page가 head 페이지인지 tail 페이지인지 확인하는 필요성을 줄여 성능을 향상시킴
  • 본문은 동기화 비용을 회피하기 위한 바쁜 루프 개념에 대해 논의. 이는 파이프에 쓸 수 없는 경우 vmsplice가 반환하도록 요청하고, 준비될 때까지 바쁜 루프를 돌게 함. 이는 25%의 성능 향상을 가져올 수 있지만, vmsplice가 준비될 때까지 CPU 코어를 완전히 점유하는 비용이 따름
  • 저자는 본문에서 다룬 주요 주제들을 요약: 제로 복사 작업, 링 버퍼, 페이징 & 가상 메모리, 동기화 오버헤드
  • 저자는 또한 본문에서 논의되지 않은 많은 다른 옵션과 세부 사항들이 있음을 인정, 이는 그들의 관련성이 없거나 관심이 부족하기 때문
  • 본문은 독자들로부터 잘 받아들여짐, 이는 그들에게 도움이 되고 흥미롭다고 발견되었기 때문
Hacker News 의견
  • Linux 파이프의 속도에 대한 기사, 두 프로세스 간의 미니 공유 메모리 메커니즘으로 작동하는 vmsplice에 초점을 맞춤
  • vmsplice의 사용은 읽기와 쓰기 시 버퍼의 신중한 처리를 필요로 하며, 복잡하지만 효율적일 수 있음
  • Linux 파이프의 표준 구현은 최적의 속도보다 20배 느리다고 보고됨
  • 기사는 잘 받아들여지며, 독자들은 그것의 정보적인 성격을 칭찬함
  • 한 독자는 Linux 파이프가 결정론적인 행동을 만들 수 있다고 지적하며, 추가적인 읽기를 위해 외부 소스를 연결함
  • 파이프, 소켓, 파일, 메모리 위에 추상화를 제공하는 데이터 처리 라이브러리에 대한 질문이 제기되며, 그들이 기사에서 논의된 최적화를 구현하는지 여부에 대해 논의됨
  • 기사는 splice() 및 vmsplice()와 같은 API를 언급하며, 이들은 대부분의 프로그램에서 사용하기 어렵고 활용되지 않는다고 보고됨
  • Linux 파이프의 속도는 시스템 내 단일 코어의 속도와 비교되며, 커널은 같은 물리 메모리 페이지를 한 프로그램의 stdout에서 다른 프로그램의 stdin으로 매핑하여, 작업을 zerocopy 또는 덜 최적화된 상황에서 빠른 onecopy로 만듦
  • 기사는 페이지 테이블의 개념을 perf를 이용한 성능 분석에 연결하며, 그것의 처리량에 대한 중요성을 강조함
  • 한 독자는 Cygwin 파이프 구현에 대한 경험을 공유하며, Linux에 비해 느린 속도를 언급함
  • Linux 파이프의 속도는 cat, sed, awk, cut, grep, uniq, jq 등의 명령어를 반복하고 구성하는 데 충분하다고 판단됨