이해할 수 없는 페이지 캐싱 문제가 있습니다.
내가 이해한 바에 따르면 페이지 캐시는 디스크 읽기 및 쓰기 모두에서 디스크 캐시 역할을 합니다. 하지만 커널이 10G 메모리 페이지 캐시를 200GB 디스크에 어떻게 매핑하는지 모르겠습니다.
읽을 때 커널은 디스크에서 주기적으로 읽는 데이터만 캐시할 수 있지만, 디스크에 쓸 때는 커널이 디스크에 쓰기 전에 데이터가 메모리 버퍼에 기록됩니다.
그러나 디스크에 기록된 데이터가 매우 큰 경우 어떻게 메모리에 충분한 버퍼링이 있을 수 있습니까?
답변1
일반적으로 다음은 sysctl
이러한 작업을 제어하는 커널/매개변수 목록입니다.
vm.dirty_background_bytes
vm.dirty_background_ratio
vm.dirty_bytes
vm.dirty_expire_centisecs
vm.dirty_ratio
vm.dirty_writeback_centisecs
이에 대한 유용하고 유익한 리소스는 SUSE의 기사에서 찾을 수 있습니다.메모리 관리 하위 시스템 조정. SUSE Linux Enterprise Server 15 SP3용이라고 나와 있지만 대부분의 Linux 배포판에도 해당됩니다(기본값은 다를 수 있음).
파일 데이터 캐시. 디스크나 네트워크에서 파일을 읽으면 해당 콘텐츠가 페이지 캐시에 저장됩니다. 페이지 캐시의 콘텐츠가 최신인 경우 디스크나 네트워크 액세스가 필요하지 않습니다. tmpfs 및 공유 메모리 세그먼트는 페이지 캐시에서 계산됩니다.
파일이 기록되면 새 데이터는 디스크나 네트워크에 다시 기록되기 전에 페이지 캐시에 저장됩니다(후기입 캐시가 됨). 페이지에 아직 다시 기록되지 않은 새 데이터가 있으면 "더티(dirty)"라고 합니다.더티로 분류되지 않은 페이지는 "클린" 페이지입니다. 메모리가 부족하면 클린 페이지 캐시 페이지를 해제하여 회수하세요. 더티 페이지를 회수하려면 먼저 먼저 지워야 합니다.
[...]
애플리케이션이 파일에 쓸 때 페이지 캐시가 더러워질 수 있고 버퍼 캐시도 더러워질 수 있습니다.. 더티 메모리의 양이 지정된 페이지 수(바이트
vm.dirty_background_bytes
)에 도달한 경우, 더티 메모리의 양이 총 메모리의 특정 비율에 도달한 경우(vm.dirty_background_ratio
), 페이지 수명이 지정된 시간을 초과한 경우( )vm.dirty_expire_centisecs
,커널은 페이지가 처음 더티된 파일부터 시작하여 페이지를 다시 쓰기 시작합니다.. 배경 바이트와 비율은 상호 배타적이며, 하나를 설정하면 다른 것보다 우선 적용됩니다. Flusher 스레드는 백그라운드에서 쓰기 저장을 수행하고 애플리케이션이 계속 실행될 수 있도록 합니다. I/O가 애플리케이션이 페이지 캐시를 더티화하는 속도를 따라잡을 수 없고 더티 데이터가 중요한 설정(vm.dirty_bytes
또는vm.dirty_ratio
)에 도달하면 더티 데이터가 이 임계값을 초과하지 않도록 애플리케이션이 조절되기 시작합니다.
기사Linux 커널 매개변수 소개이에 대한 좋은 설명이 있습니다.
이러한 매개변수는 주로 디스크에 대한 IO 쓰기 저장 전략을 구성하는 데 사용됩니다.
dirty_background_bytes
/dirty_bytes
및dirty_background_ratio
/는dirty_ratio
각각 "더티" 페이지로 채워질 수 있는 시스템 메모리의 양과 비율을 나타냅니다. 일반적으로 비율이 지정됩니다.dirty_background_ratio
: 시스템 메모리의 더티 페이지 비율을 나타냅니다(기본값은 10%). 이 비율에 도달하면 백그라운드 커널 새로 고침 프로세스가 디스크에 다시 쓰기를 시작합니다.dirty_ratio
: 모든 것이 디스크에 커밋되기 전에 더티 페이지로 채워질 수 있는 절대 최대 시스템 메모리 양을 나타냅니다. 시스템이 이 지점에 도달하면 더티 페이지가 디스크에 기록될 때까지 모든 새 I/O가 차단되어 I/O가 오랫동안 일시 중지됩니다. 시스템은 먼저vm.dirty_background_ratio
플러시 프로세스가 비동기적으로 다시 쓰기를 시작하고 애플리케이션이 계속 쓰기를 시작하는 조건에 도달합니다. 시스템이 지정된 값에 도달하면vm.dirty_ratio
운영 체제는 더티 페이지를 동기식으로 처리하여 애플리케이션을 차단합니다.vm.dirty_expire_centisecs
:더티 페이지를 쓰기 전에 캐시에 유지할 수 있는 기간을 지정합니다. 1/100초 단위로 표현됩니다. 이 간격보다 오랫동안 메모리에 더티된 데이터는 다음에 새로 고침 프로세스가 깨어날 때 기록됩니다.vm.dirty_writeback_centisecs
: 커널 새로 고침 프로세스가 깨어나는 빈도를 지정합니다. 1/100초 단위로 표현됩니다.
이에 대한 또 다른 좋은 설명은 다음에서 찾을 수 있습니다.매개변수 다시 쓰기SUSE 기사 섹션메모리 관리 하위 시스템 조정위에서 이미 언급했습니다.