Linux 파일 시스템(ext4)은 동일한 디스크의 다른 파일에 대한 쓰기를 동기화합니까?

Linux 파일 시스템(ext4)은 동일한 디스크의 다른 파일에 대한 쓰기를 동기화합니까?

저는 여러 스레드에서 파일에 추가 전용 쓰기를 포함하는 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보다 크면 실제 파일 시스템과 관련이 없습니다.

관련 정보