나는 다음과 같은 교환 전략을 전개하고 싶습니다:
- 기본적으로 메모리의 모든 페이지는 스왑 공간에도 있어야 합니다.
- 메모리의 페이지가 변경되면(즉, 더러워지면) 해당 페이지는 가능한 한 빨리 기록되어야 하지만 다른 프로세스보다 우선순위가 낮습니다.
- 구성 가능한 워터마크에 도달하면(페이지의 80%가 더티하다고 가정) 우선순위는 다른 프로세스와 동일합니다.
이 스왑 전략이 Linux 커널에서 실행 가능합니까? 그렇다면 이를 달성하기 위해 커널 설정을 어떻게 지정할 수 있습니까?
편집하다:
분명히 그 이유는 교체해야 하는 페이지 수를 줄이기 위한 것입니다. 더티 페이지만 디스크에 기록해야 하며 이는 시간이 지남에 따라 백그라운드에서 발생합니다. 따라서 페이지 손실이 발생하면(즉, 페이지가 메모리에 없음) 페이지를 메모리에서 디스크로 쓸 필요가 없고 디스크에서 메모리로만 쓸 필요가 있습니다. 따라서 스왑 인과 스왑 아웃이 동시에 디스크 액세스를 시도하므로 I/O 병목 현상이 발생할 가능성이 줄어듭니다.
답변1
/proc/sys/vm/swappiness
메모리에 남아 있는 데이터 세그먼트와 교체되는 데이터 세그먼트의 비율을 제어하기 위해 설정할 수 있는 값입니다 . 값이 0이면 무슨 수를 써서라도 완전히 교체하는 것을 방지합니다.
이 작업은 다음 방법 중 하나를 사용하여 수행할 수 있습니다.
echo 0 > /proc/sys/vm/swappiness
sysctl -w vm.swappiness=0
- 이 설정을 다음 위치에 저장하세요.
/etc/sysctl.conf
일반적으로 말해서 약간의 스왑을 사용하는 것은 나쁜 것이 아닙니다. 여유 메모리는 디스크에서 읽은 데이터를 캐시하는 데 사용될 수 있으며 시스템은 갑자기 많은 양의 메모리가 필요한 애플리케이션에 대해 미리 계획을 세울 수 있습니다.
그러나 너무 많은 프로그램을 교체하면 각 프로그램 전환 중에 디스크 관련 활동이 많아져 모든 작업이 실제로 느려질 수 있습니다. 어떤 것을 사용하려면 먼저 메모리에 다시 로드해야 합니다.
데이터가 도착하는 데 훨씬 더 오랜 시간이 걸리기 때문에 디스크 읽기는 메모리 액세스에 비해 매우 느립니다. 시스템은 다른 읽기/쓰기 요청 사이에 읽기를 예약해야 하며, 드라이브는 올바른 실린더를 찾기 시작하고 결국 천천히 데이터 전송을 시작합니다.
그러므로 나는 당신의 논리에 결함이 있다고 생각합니다. 일반적으로 갑작스러운 증가에 대비해 충분한 공간을 남겨두면서 프로그램을 메모리에서 계속 실행하기를 원합니다. 백업도 아니고 성능 향상도 아니기 때문에 "디스크에 쓰기"를 위해 스왑을 너무 자주 사용하지 마십시오.
오래된 컴퓨터에는 메모리가 적으므로 스와핑 문제가 발생할 수 있습니다. 동시에 많은 프로그램이 열려 있으면 시스템 속도가 느려지고 디스크가 스왑 파일을 읽고 쓰는 소리가 들립니다.
답변2
시스템이 교체된다고 해서 귀하에게 문제가 있다는 의미는 아닙니다. 일부 응용 프로그램은 시스템 성능에 영향을 주지 않고 스왑을 최대한 활용하도록 미세 조정되었습니다. 대부분의 관계형 데이터베이스 시스템은 다음과 같이 조정됩니다. IE: Oracle과 Cache, 아마도 가장 큰 두 가지 시스템일 것입니다.
최대 절전 모드를 사용하는 경우 스왑 공간을 사용하여 RAM을 저장합니다. 시스템이 재부팅되면 스왑 영역의 모든 항목이 RAM에 다시 추가됩니다. 이렇게 하면 대기 모드처럼 배터리를 소모하지 않고 시스템 전원을 끌 수 있으며 전원을 끄기 전에 중단한 위치로 계속 돌아갈 수 있습니다. 따라서 배터리가 더 오래 지속됩니다.
스와핑은 시스템 고성능을 유지하기 위해 더 많은 활성 RAM을 확보하므로 좋은 일이 될 수 있습니다. 활성 RAM이 가득 차고 스왑 영역이 가득 차서 여전히 더 많은 공간이 필요한 경우에만 문제가 발생합니다. 그때까지 교환은 당신을 돕기 위한 것이지 당신에게 해를 끼치는 것이 아닙니다.
답변3
vdboor의 답변에 추가하여 원하는 것을 달성하려면 swappiness
. 사용자는 /proc/sys/vm/*
파일이나 영구 설정을 통해 런타임에 이러한 항목에 액세스할 수 있습니다 /etc/sysctl.conf
(이를 sysctl
적용하려면 시작 시퀀스에 init 스크립트를 추가해야 할 수도 있음).
이러한 설정은 Linux 커널 설명서에 자세히 설명되어 있습니다. 아래에서 찾을 수 있습니다 <your_kernel_sources_path>/Documentation/sysctl/vm.txt
. 일부 온라인 설명서를 확인할 수도 있습니다.이와 같은.