Linux는 FS 캐시를 삭제하지 않습니다. 대신 메모리 교환이 시작됩니다.

Linux는 FS 캐시를 삭제하지 않습니다. 대신 메모리 교환이 시작됩니다.

저는 Linux 메모리 캐시의 이러한 동작 때문에 매우 혼란스러워졌습니다.

             total       used       free     shared    buffers     cached
Mem:         15953      14188       1765         64         37      11504
-/+ buffers/cache:       2645      13308
Swap:         2047       1332        715

캐시되지 않은 메모리가 캐시보다 우선해야 하지 않나요? 즉, 캐시를 삭제하는 대신 머신이 디스크로 교체되는 이유는 무엇입니까?

이 동작을 변경할 수 있나요? 그렇다면 어떻게?

답변1

Linux 스왑 알고리즘은 "최근 사용된 페이지"라는 개념을 사용합니다. 가상 메모리의 각 페이지에는 연관된 수명이 있습니다. 페이지를 자주 방문한다면 페이지의 나이는 꽤 젊어야 하고, 페이지를 방문하지 않으면 페이지는 나이가 들게 됩니다. 페이지가 오래될수록 교체될 가능성이 높아집니다.

따라서 커널이 콘텐츠를 교체한다면 이는 해당 페이지가 (다른 페이지에 비해) 오래되었기 때문입니다. 모든 페이지에 물리적 메모리가 충분하면 기간에 관계없이 아무것도 교체되지 않습니다.

커널은 메모리, 스왑과 같은 리소스를 가장 효율적인 방식으로 처리하도록 구성됩니다.

나는 당신이 이 행동을 바꿔야 한다고 생각하지 않습니다. 그러나 원하는 경우 시스템 교환성을 변경할 수 있습니다. swappiness 설정을 0으로 설정하면 꼭 필요한 경우(메모리 부족)가 아니면 디스크 사용을 피할 수 있습니다.

~에서커널 문서가치에 관하여 swappiness:

이 컨트롤은 커널이 메모리 페이지를 얼마나 적극적으로 교환하는지 정의합니다. 값이 높을수록 공격성이 증가하고, 값이 낮을수록 교환량이 감소합니다. 값이 0이면 사용 가능한 페이지 및 파일 지원 페이지 수가 해당 영역의 최고 수위 표시보다 작아질 때까지 스왑을 시작하지 않도록 커널에 지시합니다.

Linux 커널 소스 코드의 파일vmscan.c교환가치를 처리합니다. 재미있는 부분은 다음과 같습니다.

2018         /*
2019          * With swappiness at 100, anonymous and file have the same priority.
2020          * This scanning priority is essentially the inverse of IO cost.
2021          */
2022         anon_prio = swappiness;
2023         file_prio = 200 - anon_prio;
  • 익명 페이지파일이나 장치를 지원하지 않는 메모리 맵입니다. 이는 프로그램이 스택 및 힙 등에서 사용하기 위해 운영 체제에서 메모리를 할당하는 방법입니다.
  • 파일 페이지기존 파일의 내용을 미러링합니다.

위의 소스 코드 조각에서 볼 수 있듯이 스왑 파일 페이지는 스왑 익명 페이지보다 우선순위가 더 높습니다(기본값은 60). 그러나 100으로 설정하면 두 값 모두 동일한 우선순위를 갖습니다. 0으로 설정하면 우선순위 차이가 최대한 커집니다.

다음과 같이 교환성을 설정할 수 있습니다.

echo n >/proc/sys/vm/swappiness

... n0-100 사이의 값은 어디에 있습니까?

관련 정보