저는 여러 스레드에서 파일에 추가 전용 쓰기를 포함하는 Linux 응용 프로그램을 개발 중입니다. 현재 각 스레드에서 뮤텍스를 얻은 다음 파일에 추가하고 있습니다. 나는 내 애플리케이션의 성능을 최적화하고 여러 파일을 생성하는 것을 고려했으며(세그먼트를 호출하자) 각 스레드는 자체 세그먼트에 쓸 수 있었습니다. 이 파일은 미리 쓰기 로그와 유사하며 애플리케이션 시작 중에만 사용됩니다.
위의 내용이 IO 최적화를 위한 좋은 전략인지 궁금합니다.
쓰기를 위해 동일한 로컬 디스크에 여러 파일을 생성하는 데 오버헤드가 있습니까?
답변1
에서 man 2 write
:
POSIX.1-2008/SUSv4 섹션 XSI 2.9.7("일반 파일 작업과 스레드의 상호 작용")에 따르면:
일반 파일이나 기호 링크에서 작동할 때 다음 함수는 모두 POSIX.1-2008에 지정된 효과에 대해 서로 원자적이어야 합니다.
이후에 나열된 API에는 write() 및 writev(2)가 포함됩니다. 스레드(및 프로세스) 전체에서 원자성이어야 하는 효과 중 하나는 파일 오프셋 업데이트입니다. 그러나 Linux 3.14 이전 버전에서는 그렇지 않았습니다. 열린 파일 설명(open(2) 참조)을 공유하는 두 프로세스가 동시에 write()(또는 writev(2))를 실행한 경우 I/O 작업이 업데이트 중이었습니다. 파일 오프셋 측면은 원자성 작업이 아니므로 두 프로세스에서 출력되는 데이터 블록이 (부정확하게) 겹칠 수 있습니다. 이 문제는 Linux 3.14에서 해결되었습니다.
즉, 프로세스의 여러 스레드일 경우 커널이 3.14보다 크면 실제 파일 시스템과 관련이 없습니다.