Linux가 자동으로 디스크 캐시 및 스왑을 정리하지 않는 이유는 무엇입니까?

Linux가 자동으로 디스크 캐시 및 스왑을 정리하지 않는 이유는 무엇입니까?

예를 들어, 몇 GB의 파일을 아카이브할 때(tar 사용) Linux는 많은 디스크 캐시(및 일부 스왑)를 사용하지만 작업이 완료된 후에는 정리하지 않습니다. 결과적으로 사용 가능한 메모리가 없기 때문에 Linux는 메모리에서 무언가를 교체하려고 시도하며 이로 인해 CPU에 추가 로드가 발생합니다.

물론, 를 실행하여 캐시를 지울 수는 있지만 echo 1 > /proc/sys/vm/drop_caches그렇게 해야 한다는 것이 어리석은 일이 아닌가요?

더 나쁜 것은 스왑의 경우 사용하지 않는 스왑을 정리하는 명령이 없기 때문에 완전히 비활성화/활성화해야 하는데 이는 전혀 안전한 일이 아니라고 생각합니다.

고쳐 쓰다:

몇 가지 테스트를 수행한 결과 몇 가지 사실을 발견했습니다.

  1. archive 명령 중에 스왑 아웃된 메모리 페이지는 아카이브 파일과 아무 관련이 없으며 스왑 가능성에 따라 사용 가능한 메모리가 줄어들어 발생하는 일반적인 스왑 프로세스인 것처럼 보입니다(디스크 캐시가 모두 먹어치우기 때문입니다).

  2. 실행하는 것은 실제로 안전합니다 swapoff -a. 즉, 스왑된 페이지가 메모리로 다시 이동된다는 의미입니다.

-m현재 솔루션은 cgroup을 통해 아카이브 명령 메모리 사용량을 제한하는 것입니다( 플래그가 있는 docker 컨테이너를 실행합니다 ). docker를 사용하지 않으면 다른 프로젝트가 있습니다https://github.com/Feh/nocache이것이 도움이 될 수 있습니다.

남은 질문은Linux는 언제 디스크 캐시를 지웁니까? 일어날까요?그렇지 않은 경우 echo 1 > /proc/sys/vm/drop_caches디스크 캐시()를 수동으로 지우는 것이 좋은 습관입니까?

답변1

Nitpicky: 교체에 소요되는 CPU 시간은 일반적으로 중요하지 않습니다. 교환 중에 시스템이 느리게 반응하는 경우 일반적인 문제는 다음과 같습니다.디스크시간.

(1) 더 나쁜 점은 스왑의 경우 사용하지 않는 스왑을 정리하는 명령이 없다는 것입니다.

스왑된 메모리를 트리거하고 다시 읽을 때까지 기다리려면 스왑을 비활성화했다가 활성화하는 것이 효과적이고 안전한 기술입니다. 나는 "사용하지 않은 스왑을 정리하는 것"이 ​​올바른 설명이 아니라고 말하고 싶습니다. 이는 여러분이 하고자 하는 일이 아닙니다.

스왑 사용량이 예상보다 높게 나타날 수 있지만 이것이 사용되지 않는다는 의미는 아닙니다. 메모리 페이지는 RAM과 스왑 모두에 저장될 수 있습니다. 여기에는 그럴만한 이유가 있습니다.

스왑 페이지를 다시 읽어오면 특별히 삭제되지 않고 계속 추적됩니다. 이는 페이지를 다시 교체해야 하고 교체가 작성된 이후 페이지가 변경되지 않은 경우 페이지를 다시 쓸 필요가 없음을 의미합니다.

linux-tutorial.info에서도 이에 대해 설명합니다:메모리 관리 - 스왑 캐시

메모리의 페이지가 변경되거나 해제되면 스왑 공간의 페이지 복사본이 자동으로 해제됩니다.

시스템에 상대적으로 제한된 스왑 공간과 많은 RAM이 있는 경우 어느 시점에서 스왑 공간에서 페이지를 제거해야 할 수도 있습니다. 이는 자동으로 발생합니다. (커널 코드:linux-5.0/mm/swap.c:800)

(2) 남은 질문은 Linux가 디스크 캐시를 언제 지울 것인지, 그리고 지울 것인지 여부입니다. 그렇지 않은 경우 디스크 캐시를 수동으로 정리하는 것이 좋은 방법입니까(echo 1 > /proc/sys/vm/drop_caches)?

Linux는 요청 시 디스크 캐시를 정리합니다. 메모리가 필요할 때 비활성 디스크 캐시 페이지가 제거됩니다.

값을 변경하면 /proc/sys/vm/swappiness비활성 파일 캐시 회수와 비활성 "익명"(스왑 지원) 프로그램 메모리 회수 간의 편향을 변경할 수 있습니다. 기본값은 이미 스와핑 쪽으로 편향되어 있습니다. 원한다면 swappiness시스템에서 이 값을 더 낮추어 볼 수 있습니다. 이것이 무엇을 하는지 더 생각하고 싶다면 swappiness다음 예를 참조하세요.위로:파일이 캐시되기 전에 tmpfs가 스왑되도록 만들거나 강제 실행

Linux는 요청 시 디스크 캐시를 삭제하므로 일반적으로 사용을 권장하지 않습니다 drop_caches. 주로 테스트 목적으로 사용됩니다. ~에 따르면공식 문서:

이 파일은 다양한 커널 캐시(inode, 디렉토리 항목, 페이지 캐시 등)의 증가를 제어하는 ​​수단이 아닙니다. 이러한 객체는 시스템의 다른 곳에서 메모리가 필요할 때 커널에 의해 자동으로 회수됩니다.

이 파일을 사용하면 성능 문제가 발생할 수 있습니다. 캐시된 개체를 삭제하기 때문에 삭제된 개체를 다시 생성하는 데 많은 I/O 및 CPU가 필요할 수 있으며, 특히 사용량이 많은 경우에는 더욱 그렇습니다. 따라서 테스트 또는 디버깅 환경 외부에서 사용하는 것은 권장되지 않습니다.

답변2

이는 예상된 동작입니다. 다음을 사용하여 스왑 사용량을 조정할 수 있습니다.가상 머신 전환 가능성sysctl을 찾아서 필요에 맞게 조정하세요.

관련 정보