RHEL 6의 페이지 프레임 재활용 알고리즘의 내부 작동 방식을 이해하려고 합니다.
보다 구체적으로, 사용 가능한 메모리가 페이지_로우(또는 페이지_하이) 아래로 내려가지 않을 때 vmstat에서 si/so에 0이 아닌 값이 표시되는 이유와 다른 교체 징후가 표시되는지 알고 싶습니다.
vmstat에서:
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
13 4 2476036 1533508 486264 10396996 18 22 9674 2790 59364 114558 7 8 81 4 0
즉, 시스템에서 사용할 수 있는 메모리는 1,533,508KB입니다.
/proc/zoneinfo에서
Node 0, zone Normal
…
min 130364
low 162955
high 195546
0이 아닌 스왑 인 및 스왑 아웃 활동(si > 0, 따라서 > 0)이 표시되는 반면 사용 가능한 메모리(약 375,000 페이지에 해당)는 낮음 및 높음 메모리 임계값보다 훨씬 높다는 사실은 문서와 일치하는 것 같습니다. 문헌에 교류 활동이 어떻게 기술되어 있는지.
예를 들어 Mel Gorman의 "Linux 가상 메모리 이해"는 다음과 같습니다.
"과거에는 kswapd가 10초마다 깨어났지만 이제는 해당 영역의 사용 가능한 페이지 수가 page_low에 도달한 경우에만 물리적 페이지 할당자에 의해 깨어납니다."
그런 다음 책은 우리가 보고 있는 것에 대해 한 가지 가능한 설명을 제공합니다.
"극도의 메모리 부족 상황에서 프로세스는 Balance_classzone()을 호출하여 kswapd의 작업을 동기적으로 완료하고, 이는 차례로 try_to_free_pages_zone()을 호출합니다."
즉, 메모리 할당 요청이 실패하거나 속도가 느려지면 프로세스가 자체적으로 영역 밸런싱을 시작할 수 있습니다. 그러나 try_to_free_pages_zone이 다양한 캐시를 축소하는 데 중점을 두는 것처럼 보이기 때문에 이것이 스와핑을 설명할 수 있는지 여부는 불분명합니다.
또한, 교환 표시를 보면 상단에 kswapd가 자주 표시되는데, 이는 직접 재활용 이론과도 모순되는 것 같습니다.
여기서 뭔가 빠졌나요?
고쳐 쓰다특히 교체 중에 ExaWatcher ps 출력을 확인한 결과 kswapd0 프로세스가 이 시간 동안 "R" 상태에 있음을 알 수 있습니다. 즉, 직접 재활용하는 경우는 제외됩니다.
감사합니다, 니콜라
답변1
사용 가능한 메모리가 영역 워터마크보다 훨씬 높을 때 페이지가 주 메모리에서 스왑 아웃될 수 있는 상황을 하나 이상 발견할 수 있었습니다. 이 시나리오는 가상 머신 조각 모음을 위한 알고리즘 중 하나인 영역 압축과 관련이 있습니다.
이 프로세스의 기본 아이디어는 페이지를 이동하여 대규모 연속 가상 주소 블록을 만드는 것입니다. "이동"은 페이지를 물리적으로 이동하는 것이 아니라 페이지의 PTE를 업데이트하는 것을 의미합니다.
압축 알고리즘은 서로 가까운 영역의 반대쪽 끝에서 두 개의 스캐너를 실행합니다. 한 스캐너는 이동할 페이지를 검색하고, 다른 스캐너는 이동할 수 있는 무료 페이지를 검색하며 결국 중간 지점에서 만나야 합니다.
문제는 영역 압축 중에 이동할 수는 없지만 재활용할 수 있는 페이지가 발견될 수 있다는 것입니다. 이런 일이 발생하면 알고리즘은 교환을 통해 이를 재활용하려고 시도할 수 있습니다.
여기서 중요한 점은 영역 압축이 워터마크에 의해 실행되지 않는다는 것입니다. 대신, 이는 고차 할당이 실패할 때마다, 즉 메모리가 조각화되어 여전히 사용 가능한 메모리가 많은 경우에 발생합니다.
답변2
더 적절할 수 있는 다른 답변을 찾았습니다. 최신 버전의 Linux 커널에는 직접 및 주기적인 재활용 외에도 느린 경로 할당이 있는 것으로 나타났습니다. 즉, kswapd가 연속 메모리 블록 할당에 실패한 후 깨어납니다.
깨어나면 kswapd는 영역 워터마크를 확인합니다. 그러나 워터마크는 예전의 정적 지역 수준 숫자가 아닌 것으로 나타났습니다. 대신 할당 순서에 따라 다릅니다.
즉, kswapd는 지역의 재조정 여부를 결정할 때 이를 트리거한 실패한 할당 요청의 순서를 고려합니다. 따라서 메모리가 충분히 조각화되면 kswapd가 수행할 작업이 있습니다.
영역의 균형을 재조정할 때 kswapd는 파일 캐시를 축소하거나 사용자 프로세스에서 익명 페이지를 훔치는 것 중에서 선택합니다(스와핑이 완전히 비활성화되지 않은 경우). 따라서 남은 질문은 kswapd가 후자 옵션을 선택한 이유입니다. 제 생각에는 다시 조각화가 답인 것 같습니다. 회수 알고리즘에는 파일 캐시를 축소하여 얻은 페이지가 물리적으로 연속적이지 않을 수 있다는 것을 알 수 있는 방법이 있을 수 있다고 생각합니다.
보다 일반적으로 최신 버전의 커널에는 메모리 조각 모음이 추가되었을 뿐만 아니라 페이지 프레임 회수와 압축된 메모리 사이의 경계도 다소 모호해졌습니다.
불행히도 모든 클래식 Linux 커널 교과서는 2.6 또는 이전 커널 버전을 기반으로 작성되었으므로 매우 오해의 소지가 있습니다.