커널은 디스크 캐싱과 스와핑을 어떻게 결정합니까?

커널은 디스크 캐싱과 스와핑을 어떻게 결정합니까?

다른 질문에서 제기된 주제에 이어 저는믿다Linux 커널은 물리적 RAM을 확보하려고 시도할 때 디스크 캐시의 페이지를 삭제할지 아니면 다른 페이지를 스왑 영역으로 플러시할지 결정을 내립니다. 나는 이것에 대해 확신하지 못합니다. 아마도 메커니즘을 완전히 오해하고 있는 것 같습니다.

그럼에도 불구하고 다음 사이에는 시너지 효과가 있습니다.

  • 커널은 자체 내부 디스크 캐시를 유지합니다.
  • 프로그램 메모리 매핑 파일
  • "일반" 응용 프로그램 메모리는 스왑 파일에 배치됩니다.

세 가지 방법 모두 물리적 RAM을 확보하는 데 사용할 수 있으며 세 가지 모두 "더티" 페이지를 디스크에 쓰거나 단순히 이러한 페이지가 디스크에 깔끔하게 복사되었다는 사실을 알고 물리적 RAM 할당에서 삭제하는 방법에 의존합니다.


스왑 공간을 사용하면 개별 스왑 파티션과 파일에 우선순위를 부여하여 느린 장치보다 빠른 장치를 사용할 수 있습니다. 전환되지 않은 다른 장치에 대한 이러한 구성은 알지 못합니다.

내 질문은: 커널은 어떤 메모리를 해제할지 어떻게 결정합니까?

  • 순전히 지난 방문을 기반으로 합니까?
  • 커널은 위의 세 가지를 모두 동일하게 사용합니까?
    • 이들(및 개별 디스크) 사이에 우선순위가 있습니까?
    • 구성할 수 있나요?

이 질문은 다음과 유사한 경험에서 비롯되었습니다.이것하지만 나는 이 질문이 특정 문제를 해결하기보다는 근본적인 메커니즘에 초점을 맞추기를 원합니다.

답변1

메모리의 물리적 페이지를 해제하는 전체 작업의 이름은 다음과 같습니다.재활용, 여기에는 많은 작업이 포함됩니다. 교정은 주로 페이지 할당에 따라 이루어지며 긴급도는 다양합니다. 오프로드된 시스템에서는 페이지 할당이 쉽게 충족되고 회수가 트리거되지 않습니다. 적당히 로드된 시스템에서는 페이지 할당이 즉시 충족될 수 있지만 kswapd백그라운드 재생을 수행하기 위한 절전 모드 해제도 발생합니다. 페이지 할당이 즉시 충족될 수 없는 로드된 시스템에서는 교정이 동기적으로 수행됩니다.

재활용 가능 페이지는 다른 곳에서 찾을 수 있거나 사용할 수 있는 콘텐츠를 저장하는 페이지입니다. 여기에서 일반적인 균형 조정 작업이 시작됩니다. 즉, 콘텐츠가 파일에도 있는(또는 결국 파일이 되어야 하는) 메모리, v. 콘텐츠가 파일에 없는(그리고 교체해야 하는) 메모리입니다. 전자는 페이지 캐시에 저장되고 후자는 그렇지 않습니다. 이것이 바로 균형 조정 설명에서 일반적으로 페이지 캐싱과 스와핑에 대해 이야기하는 이유입니다.

하나를 다른 것보다 선호하는 결정은 커널의 한 위치에서 이루어집니다.get_scan_count, 설정에 의해 제어됨struct scan_control. 이 기능의 목적은 아래에 설명되어 있습니다.

익명 및 파일 LRU 목록을 얼마나 적극적으로 검사할지 결정합니다. 각 LRU 목록 세트의 상대 값은 제거하는 대신 활성 목록으로 다시 회전시키는 스캔된 페이지의 비율을 확인하여 결정됩니다.

놀랍게도 함수의 경우 get_...반환 값을 사용하지 않고 대신 포인터가 가리키는 배열을 unsigned long *nr익명 비활성 페이지(지원되지 않음, 최근 사용되지 않은 페이지), 익명 활성 페이지(지원되지 않음, 최근에 사용된 페이지), 파일 비활성 페이지(최근에 사용되지 않은 페이지 캐시의 페이지) 및 파일 활성 페이지(최근에 사용되지 않은 페이지 캐시의 페이지)입니다.

get_scan_count먼저 다음에서 적절한 "스왑" 값을 검색합니다.mem_cgroup_swappiness. 현재 메모리 cgroup이 활성화된 비루트 v1 cgroup인 경우 해당 스왑 설정이 사용됩니다./proc/sys/vm/swappiness. 두 설정 모두 공유같은 목적;그들은 커널에게 말한다

교체된 익명 페이지를 다시 가져오는 것과 파일 시스템 페이지를 다시 로드하는 데 드는 상대적 IO 비용

그러나 실제로 값을 사용하기 전에 get_scan_count적용해야 할 전반적인 전략을 결정하십시오.

  • 교류나 익명 페이지가 없는 경우되돌릴 수 없음현재 컨텍스트에서는 파일이 지원하는 페이지만 추적합니다.
  • 메모리 cgroup이 스왑을 완전히 비활성화하면 파일이 지원하는 페이지만 처리합니다.
  • swappiness가 비활성화되지 않고(0으로 설정) 시스템에 메모리가 부족한 경우 모든 페이지를 동일하게 처리합니다.
  • 시스템에 파일 페이지가 거의 없으면 익명 페이지만 처리됩니다.
  • 캐시된 비활성 페이지가 충분하면 파일에서 지원하는 페이지만 찾습니다.
  • 다른 모든 경우에는 해당 I/O 비용을 기반으로 각 LRU에 부여된 "가중치"를 조정합니다.

정책이 결정되면 제거 가능한 모든 LRU(비활성 익명, 활성 익명, 비활성 파일 지원, 활성 파일 지원 순서)를 반복하여 각 LRU를 스캔해야 하는 페이지 수를 결정합니다. v1 cgroup을 무시합니다.

  • 정책이 "모든 페이지를 동일하게 검색"하는 경우 모든 LRU의 모든 페이지를 검색할 수 있으며 최대 크기는 scan_control이동 priority인수에 의해 결정됩니다.
  • 정책이 "파일 지원 페이지만 추적" 또는 "익명 페이지만 추적"인 경우 해당 LRU의 모든 페이지는 후보 페이지이며(다시 이동 누르기 priority) 다른 LRU에는 페이지가 없습니다.
  • 그렇지 않으면 교환성을 기준으로 값을 조정합니다.

실제 페이지 스캔은 다음에 의해 수행됩니다.shrink_lruvec, 위에서 결정된 스캔 길이를 사용하고 반복합니다.축소목표에 도달할 때까지 LRU(다양한 방법으로 목표를 조정) 이 작업이 완료된 후 활성/비활성 LRU가 재조정됩니다.

질문으로 돌아가기:

  • 페이지 캐시와 메모리 매핑 파일은 동일하게 취급됩니다.
  • 페이지 재활용은 순전히 마지막 액세스만을 기반으로 하지 않습니다. (LRU 사용 방법이나 재조정 작동 방식을 설명하지 않았습니다. 읽어보시기 바랍니다.Mel Gorman의 해당 장Linux 가상 메모리 관리자 이해더 알아보기);
  • 커널은 이를 동일하게 사용하지 않으며 상황에 따라 우선순위가 다르며 구성될 수 있습니다.통과하다많은 제어( swappiness, cgroups, 낮은 워터마크 임계값...).

스왑 우선순위는 페이지가 스왑 아웃되기로 결정된 후 페이지가 이동되는 위치만 결정합니다. (그런데, swappiness위의 문서와 설명에서는 I/O 비용이 혼합된 ZRAM/디스크 스왑 설정을 잘 처리할 만큼 세부적이지 않다는 것을 분명히 해야 합니다...)

scan_control아직 설정 방법을 비롯해 설명할 것이 많지만 , 벌써 너무 길어진 것 같아요! 재활용 비용을 추적하려면 다음에서 추적할 수 있습니다.작업 지연 회계(당신은 또한 볼 수 있습니다struct taskstats).

관련 정보