Linux 커널은 I/O 작업 속도를 높이기 위해 페이지 캐싱을 구현합니다.
연구 및 테스트를 위해 페이지 캐싱을 끄거나 켤 수 있으면 도움이 될 것입니다.
Linux 페이지 캐시를 비활성화하는 방법은 무엇입니까?
업데이트 1:페이지 캐싱을 전역적으로 끌 수 없는 경우 Linux 파일 시스템을 연속 쓰기 모드로 마운트할 수 있습니다. 내가 올바르게 이해했다면 EXT2, EXT4 및 XFS의 마운트 옵션은 dax
write-through 모드를 구현합니다. 페이지 캐싱을 방지하기 위한 유효한 옵션입니까(적어도 파일 시스템의 경우)?
https://www.kernel.org/doc/Documentation/filesystems/dax.txt
업데이트 2:분명히 DAX는 다소 죽었고 페이지 캐싱을 적절하게 끌 수 없습니다(전역적으로, 전혀 끄지 않고 개별 애플리케이션에 대해 제한된 방식으로만). 하지만 실제로 Linux 파일 시스템(예: mount 매개변수를 통해)을 연속 쓰기 모드로 설정할 수 있는 방법이 없을까요?
업데이트 3:이 도구는 dd
Linux 커널 페이지 캐시를 쉽게 우회할 수 있는 응용 프로그램의 한 예입니다 oflag=direct
.
https://man7.org/linux/man-pages/man1/dd.1.html
업데이트 4:분명히 FUSE(사용자 공간의 파일 시스템) 모듈을 사용하는 파일 시스템은 페이지 캐시에 대한 읽기 및 쓰기가 완전히 우회되는 직접 IO 모드에서 사용할 수 있습니다.
https://www.kernel.org/doc/Documentation/filesystems/fuse-io.txt
업데이트 5:마운트 옵션을 -o sync
사용하면 일부 파일 시스템(ext2, ext3, FAT, VFAT, UFS)에 대해 연속 쓰기 모드 및 페이지 캐싱 우회가 가능합니다.
답변1
일시적으로 페이지 캐싱을 비활성화하는 것도 불가능합니다.
그러나 특정 애플리케이션은 실제로 다음과 같은 방법으로 캐시를 우회하기 위해 최선을 다할 수 있습니다.열려 있는_ing 파일에는 O_DIRECT 플래그가 설정되어 있습니다.
O_DIRECT (since Linux 2.4.10) Try to minimize cache effects of the I/O to and from this file… File I/O is done directly to/from user-space buffers. The O_DIRECT flag on its own makes an effort to transfer data synchronously, but does not give the guarantees of the O_SYNC flag that data and necessary metadata are transferred. To guarantee synchronous I/O, O_SYNC must be used in addition to O_DIRECT.
이는 on이 해당 수정된 소스 코드를 재구성할 수 있어야 함을 의미하지만,캐시 없음, 이는 열기 및 닫기 시스템 호출을 가로채고 수정되지 않은 바이너리를 실행하는 데 사용할 수 있습니다.
물론 프로세스 속도를 늦추는 몇 가지 제한 사항이 있으며... 테스트한 적이 없습니다.
하나의 코스는 영원할 수 있다캐시 비우기다음 명령을 사용하십시오.
# echo 1 > /proc/sys/vm/drop_caches
답변2
HDD나 SSD와 같은 블록 장치에서 페이지 캐싱을 우회하려고 시도해서는 안 된다고 생각합니다. 이는 이러한 디스크의 세분성이 다음과 같기 때문입니다.막힌(512B, 4KB 또는 기타) 그러나 r/w 시스템 호출이 켜져 있습니다.바이트.
불일치는 커널이 디스크에 쓸 데이터를 다른 구성 블록의 데이터와 결합하여 한 번에 디스크에 써야 함을 의미합니다(블록 전체의 쓰기를 무시하는 경우에도 마찬가지임). 읽기의 경우 커널은 원하는 데이터가 포함된 전체 블록을 읽은 다음 필요한 부분을 제공합니다.
이러한 불일치를 이해하면 페이지 캐싱이 단순한 속도 향상 트릭 그 이상임을 알 수 있습니다. 대조적으로, 페이지 캐시는 디스크 I/O 스택에 매우 중요합니다. 보다 정확하게는 불일치가 페이지 캐시와 버퍼 헤더에 의해 처리되는데 이는 좀 더 복잡합니다.
어쨌든, 페이지 캐싱을 우회하려면 다음과 같은 몇 가지 팁을 따르세요.
독일 DAX 지수: 작업을 하고 계시다면바이트 주소 지정장비(예: PMEM 등)를 사용하는 경우 DAX가 최선의 선택입니다. 장치 자체는 바이트 단위로 액세스할 수 있으므로 커널은 위에서 설명한 불일치에 대해 걱정할 필요가 없습니다. DAX 모드에서 파일 시스템은 단순히 페이지 캐시를 우회하고 장치에서 직접 읽기/쓰기를 수행합니다. DAX를 참고하세요할 수 없다블록 장치에서 사용해보세요! 당신은 참조 할 수 있습니다파일에 직접 액세스자세한 내용은.
O_DIRECT: 페이지 캐싱을 우회하기 위해 O_DIRECT 플래그로 파일을 열 수도 있습니다. 이는 사용자 공간에 자체 고성능 캐시가 있는 애플리케이션을 위해 설계되었습니다. 그러나 내가 아는 한 실행만 가능합니다.조정그것에 대해 작업하십시오. 또한 이는 반환될 때 데이터가 이미 디스크에 있는지 확인하지 않습니다. 다른 캐싱 메커니즘이 구현되지 않으면 성능이 훨씬 저하될 수 있습니다. 매뉴얼 페이지를 참조하세요오픈(2), 또는 이 토론Direct IO의 의미를 명확히 합니다., 아니면 한번 시도해 보세요. 또한 @MC68020에서 관련 부품을 나열했습니다.
또한 페이지 캐싱의 영향을 받지 않고 파일 시스템 성능을 평가하려는 경우 다음을 시도해 볼 수 있습니다.
동기화: 이것은쓰다. 파일을 열다O_SYNC, 각 쓰기는 데이터가 디스크에 있을 때만 반환됩니다.오픈(2)O_SYNC에서의 쓰기 성능은 페이지 캐시가 "비활성화"된 경우와 비슷합니다(비록 페이지 캐시에 데이터를 복사하는 것과 같은 추가 오버헤드가 있지만 주요 비용은 디스크 I/O입니다).
캐시 삭제: 이것은읽다. @ MC68020이 말했듯이 특정 작업을 수행하기 전에 시스템 캐시를 삭제할 수 있습니다. 이는 빈 페이지 캐시를 제공하므로 무언가를 읽을 때 파일 시스템이 디스크에서 해당 항목을 가져옵니다. 명령은 다음과 같습니다.
echo 1 > /proc/sys/vm/drop_caches
또는sysctl -w vm.drop_caches=1
. 여기서 확인해보세요/proc/sys/가상 머신, "drop_cache"를 검색하세요. 단점은 한 위치에서의 읽기가 처음으로만 디스크로 이동한다는 것입니다. 다음번에는 페이지 캐시에 있을 것입니다.
이것이 도움이 되기를 바랍니다 :)