나는 대용량 파일을 가지고 있으며 디스크 I/O 용량으로 읽는 데 동의합니다. 다른 파일에 대한 무료 파일 시스템 캐싱을 원합니다. Linux에서 특정 파일에 대한 파일 시스템 캐싱을 끌 수 있습니까? 네이티브 lib + java를 통해 프로그래밍 방식으로 이 작업을 수행하고 싶습니다.
답변1
파일의 열려 있는 인스턴스에서는 이 작업을 수행할 수 있지만 파일 자체에서는 영구적으로 수행할 수 없습니다. 열려 있는 파일의 각 인스턴스에 대해 직접 IO를 사용하여 이 작업을 수행할 수 있습니다. Java에서 이 작업을 수행하는 방법을 잘 모르겠지만 C 및 C++에서는 호출 O_DIRECT
에 플래그를 전달할 수 있습니다.open()
그러나 이렇게 하면 다음과 같은 몇 가지 잠재적인 문제가 발생할 수 있습니다.
- 이는 일부 파일 시스템에서는 매우 위험할 수 있습니다. 특히 현재 버전의 BTRFS는 파일 쓰기 시 직접 IO에 심각한 문제가 있습니다.
- 어떤 형태의 동기화를 사용하지 않는 한 직접 IO와 일반 캐시 I/O를 혼합할 수 없습니다. 호출 전 또는 이전
fsync()
의 일부 직접 IO 읽기에 대해 캐시된 쓰기가 표시되지 않을 수 있으며fdatasync()
, 캐시된 IO 읽기에 대해 직접 IO 쓰기가 표시되지 않을 수 있습니다.한 번.
그러나 일시적으로 데이터를 캐시에 보관할 수 있는 경우 다른 접근 방식이 있습니다. POSIX fadvise 인터페이스( posix_fadvise
Linux의 시스템 호출을 통해)를 사용하여 파일을 읽은 후에는 파일의 데이터가 필요하지 않음을 커널에 알릴 수 있습니다. 이 플래그를 사용하면 POSIX_FADV_DONTNEED
캐시에서 특정 파일의 특정 영역을 제거하도록 커널에 지시할 수 있습니다. 파일을 처리하는 동안 실제로 이 작업을 수행할 수 있습니다(블록을 읽은 다음 posix_fadvise
읽은 후 즉시 파일의 해당 영역을 호출하여). 호출하는 영역은 시스템의 페이지 크기에 맞춰 정렬되어야 합니다. 이는 실시간 확장 기능이 있는 모든 POSIX 호환 시스템(거의 모든 POSIX 호환 시스템)에서 실행될 수 있기 때문에 일반적으로 선호되는 이식 가능한 작업 방법입니다.
답변2
.Look O_DIRECT
을 사용하여 Java에서 Java를 찾고 있습니다 .open(2)
http://man7.org/linux/man-pages/man2/open.2.html