VM과 KVM을 사용하여 몇 가지 실험을 하고 있습니다. 나는 과잉 커밋과 스왑 공간의 사실을 깨닫려고 노력하고 있습니다. 먼저, 이번 실험을 위해 만든 시스템 설정과 연결 구성을 보여드리겠습니다.
내 호스트 컴퓨터 시스템에는 다음이 있습니다.
- 메모리(DRAM): 16GB
- 스왑 공간(스왑 파티션): 32GB
- SSD: 512GB
내 VM에는 다음이 있습니다.
- 메모리: 4GB
- 스왑 공간(스왑 파티션): 8GB
- 가상 디스크 용량: 20GB
cgroup 인터페이스로 VM의 메모리 리소스를 4GB에서 1GB로 제한하는 경우. 이러한 상황에서과도한 헌신발생합니다. 그런 다음이 문제를 해결하려고했습니다.왑 공간그리고 확인해보니vmstat그것이 효과가 있었는지 아닌지. 스왑 공간을 메모리로 사용하지 않는 것 같습니다.
오버커밋 상황에서 내 VM이 스왑 공간을 사용하지 않는 이유는 무엇입니까?
답변1
나는 당신이 놓친 부분이 "과도한 헌신"을 의미한다고 생각합니다.
오버커밋은 시스템이 보유하도록 제한한 리소스보다 실제로 더 많은 리소스를 확보하는 데 사용하는 트릭이 아닙니다. 더 많은 자원이 있는 것처럼 행동하는 기술입니다.
기본 개념은 대부분의 프로그램이 실제로 사용하는 것보다 더 많은 메모리를 할당한다는 것입니다. 예를 들어, 57바이트에 불과한 파일을 읽기 위해 32K RAM을 할당할 수 있습니다. 그들은 그것을 읽고 실제로 그것을 위해 한 페이지의 메모리를 사용합니다. 그러나 여전히 32K가 할당되었습니다. 이 예는 90년대의 것이며 오늘날에는 할당과 파일이 더 커지지만 요점은 추가 메모리가 여전히 수집되지 않는 약속이라는 것입니다.
내가 착각한 것이 아니라면, 이는 고의로 그렇게 하지 않는 일부 프로그램에서도 발생합니다. 왜냐하면 그들은 이를 수행하는 라이브러리를 로드하고 심지어 해당 라이브러리를 로드하는 것도 그렇게 하기 때문입니다. 링커는 라이브러리에 충분한 메모리를 할당하지만 루틴만 할당합니다. 실제로 호출된 항목은 실제로 로드됩니다. 아마도 공유 메모리가 될 것이므로 그 효과는 최소화되지만 여전히 존재합니다.
발생하는 과도한 헌신의 정도는 호출된 프로그램과 사용 방법에 따라 크게 달라집니다. 프로그램을 매우 철저하게 실행한다면 아마도 일부 라이브러리를 더 많이 사용할 것입니다. malloc 대신 calloc을 호출하는 프로그램은 할당된 공간의 모든 바이트에 calloc을 쓰기 때문에 과도하게 커밋하는 것으로 표시되지 않습니다. 따라서 해당 메모리의 실제 부분이 사용될 경우에도 OS가 요청된 커밋을 이행해야 합니다. 훨씬 적어질 것입니다. 일부 프로그램은 필요한 정확한 양의 메모리만 할당하는 데 훨씬 더 주의를 기울이는 반면, 다른 프로그램은 OS에 의존하여 데이터 구조 배열에서 실용적이도록 오버커밋을 지원합니다.
1GB 사용으로 제한한 서버의 응용 프로그램이 실제로 전체 GB 상당의 페이지에 액세스하려고 시도하는 경우 사용 가능하도록 구성한 8GB 스왑을 사용합니다. 그러나 과잉 커밋에는 이를 사용하지 않습니다. 실제로 보유하고 있는 VM의 9GB를 초과하여 할당할 때까지 기술적으로 초과 커밋을 사용하지 않습니다.
말하자면, 이것은 Linux이고, 과잉 커밋을 활성화하지 않고 Linux를 최대 메모리 할당으로 밀어넣으려고 했던 내 기억에 따르면 Linux는 약간 일찍 실패하는 경향이 있습니다. 소량의 파일 캐시와 같은 다양한 작업을 위한 일부 예비를 유지했습니다. . 그 경험은 10여년 전의 일이지만 특별히 바뀔 이유는 없습니다. 파일 I/O를 수행할 수 있는 메모리를 갖는 것이 중요합니다.