커널은 페이지 캐시를 어떻게 사용합니까?

커널은 페이지 캐시를 어떻게 사용합니까?

이해할 수 없는 페이지 캐싱 문제가 있습니다.

내가 이해한 바에 따르면 페이지 캐시는 디스크 읽기 및 쓰기 모두에서 디스크 캐시 역할을 합니다. 하지만 커널이 10G 메모리 페이지 캐시를 200GB 디스크에 어떻게 매핑하는지 모르겠습니다.

읽을 때 커널은 디스크에서 주기적으로 읽는 데이터만 캐시할 수 있지만, 디스크에 쓸 때는 커널이 디스크에 쓰기 전에 데이터가 메모리 버퍼에 기록됩니다.

그러나 디스크에 기록된 데이터가 매우 큰 경우 어떻게 메모리에 충분한 버퍼링이 있을 수 있습니까?

답변1

일반적으로 다음은 sysctl이러한 작업을 제어하는 ​​커널/매개변수 목록입니다.

이에 대한 유용하고 유익한 리소스는 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_bytesdirty_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 기사 섹션메모리 관리 하위 시스템 조정위에서 이미 언급했습니다.

관련 정보