OS의 메모리 벌룬


13

일부 하이퍼 바이저는 벌룬 (ballooning)이라고하는 방법 (최소한 KVM이 호출하는 방식)을 사용하여 메모리 사용을 최적화합니다.이 방법은 VM간에 메모리를 중복 제거하고 쓰기시 복사시 공통 페이지를 읽기 전용으로 설정합니다.
이것은 포크 호출의 반대입니다.

프로세스를 위해 OS 수준에서 구현하는 것이 가능합니까 (동일한 사이트에서 여러 탭이있는 Chromium으로 탐색 할 때 주로 메모리 복제를 생각하고 있었음) 이미 구현 되었습니까?

답변:


14

실제로, 당신이 묘사 한 것은 풍선 도움말과 '같은 페이지 병합'을 혼란스럽게합니다. 구별을 분명히하기 위해이 두 가지를 자세히 설명하려고합니다.

메모리 벌룬

이는 게스트 가상 머신에 할당 된 일부 메모리 가 다른 게스트호스트 자체 (캐시 등)에서 계속 사용할 수 있도록하는 요령 입니다 . 다음과 같은 방식으로 수행됩니다.

게스트 커널에는 드라이버가 주입되어 게스트 메모리 사용을 모니터링하고 사용되지 않은 메모리 중 일부를 '훔쳐'(게스트 메모리 공간에 자체 할당하여이 게스트에서 해당 범위에 닿을 수있는 것은 없는지 확인)합니다.

그런 다음 호스트 커널에 알려줍니다. 실제로 메모리에서 이러한 메모리 페이지를 제거하고 게스트에서 사용하지 않을 것입니다 (게스트가 약간의 메모리 압력을 경험할 때까지 풍선이 수축하고 사용합니다) 다시이 범위).

궁극적으로 커널은 정확히 동일한 메모리를 다른 게스트에 할당 할 수 있으며 게스트가 많은 여유 메모리로 실행하는 경우 전체 메모리 사용량을 훨씬 효율적으로 만들 수 있습니다.

동일한 페이지 병합

이 기술은 동일한 이유로 메모리 페이지를 식별합니다. 어떤 이유로 인해 쓰기시 복사로 'quasi-read-only'로 표시되지 않은 것으로 표시됩니다.

이제 OS 수준에서는 이러한 종류의 트릭에 대한 요구가 제한적입니다. 간단히 말해, 대부분의 메모리 페이지가 동일한 경우 대부분 응용 프로그램 코드, 라이브러리 등이기 때문에 이미 읽기 전용입니다 (때로는 CoW가없는 경우도 있음). 이들은 기본적으로 메모리 맵을 통해 열리므로 커널은 유지할 수 있습니다. 코어에는 사본이 하나만 있습니다 (있는 경우에는 완전히 페이징 아웃하고 필요한 경우 기본 저장소에서 페이징 할 수 있음).

가상화 된 OS 수준에서 각 게스트 하위 시스템 내에서 동일한 원칙이 올바르게 적용됩니다. 그러나 호스트 커널은 두 게스트가 거의 동일한 코드를 실행하고 동일한 메모리를 공유하는지 여부를 모릅니다. 게스트는이를 조정하기 위해 통신하지 않습니다.

어떤은 종종 동일한 메모리 페이지에 대한 전체 시스템을 검색 할 수 있습니다 이유 - 대부분의 시간, 그들은 동일합니다 걸쳐 되지 각각 내에서, 게스트 OS의 - 게스트 커널은 그것의 범위 내에서 깔끔한 메모리를 유지 괜찮은 일을한다. 따라서 하나의 호스트 커널이 50 개 이상의 게스트를 처리하는 일반적인 VM 환경에서 메모리 절약 효과는 상당히 클 수 있습니다.

한 번에 둘 다

벌룬 및 Same-Page-Merging은 공존 할 수 있으므로 동일한 시스템에 대해 상당한 메모리 오버 커밋을 달성 할 수 있습니다.


귀하의 질문에 대답하기 위해-Same-Page-Merging은 때로는 OS 수준에서 활성화 될 수 있습니다. 해석되는 페이지 공유와 관련이 있으므로 동일한 백업 파일이 없어도 동일 할 수 있습니다.

Chromium 예제에서 프로세스 바이너리 자체는 이미 읽기 전용 시작 맵을 통해 중복 제거되어 있으며 동일한 메모리 공간을 공유합니다. 페이지 캐시 (탭의 내용)는 일반적으로 디스크 캐시가 관리되는 방식으로 인해 프로세스 (읽기 전용 복사 중 쓰기)간에 공유됩니다. VM의 다른 프로세스간에 동일한 온 디스크 파일을 가상으로 열 수 있습니다. 최적의 의미.

장점은 다른 Javascript 엔진의 공유 상태에서 가장 분명하지만, 동일한 메모리 레이아웃으로 할당되는지 확실하지 않으므로 전체 메모리 페이지가 동일해야합니다.

이것은 모바일 시스템에서 다릅니다. 예를 들어, Android는 KSM을 광범위하게 사용하여 서로 다른 애플리케이션간에 동일한 코드를 중복 제거합니다.

두 경우 모두 Linux (Kernel SamePage Merging)에서 직접 활성화 할 수 있습니다. 운전자는이 답변을 읽은 후 해석이 가능하고 자신의 목적에 적합한 지 여부를 스스로 결정할 수있는 다양한 통계를 내 보냅니다.

https://www.kernel.org/doc/Documentation/vm/ksm.txt


3
하이퍼 바이저 (및 수명)에 따라 동일한 페이지 병합을 '초월 메모리'라고도합니다.
Tim Post

감사합니다. KSM에서 애플리케이션이이를 인식하도록 요구하고 있으며 (빠른) 검색에서 Chromium은 현재이를 지원하지 않습니다. 바이너리가 중복 제거 된 것을 알고 있지만 대부분 JIT 출력과 RAM에 큰 부담을주는 원시 스크립트를 참조하고 있습니다.

Chromium의 원시 스크립트도 중복 제거됩니다. 다른 모든 웹 개체와 마찬가지로 디스크 캐시에 저장되며 디스크 캐시는 읽히지 않고 매핑됩니다.
qdot

원시 스크립트는 매핑되지만 jQuery 및 Angular.js와 같은 일반적인 스크립트도 캐시에 복제되며 다양한 사이트 서버에서 CDN과 스크립트 파일의 정확한 복제본이 많이 사용되므로 서로 일치하지 않습니다.

이것은 아마도 채팅으로 끝나야하지만 Linux KSM에서 귀하의 통계를보고 싶습니다.
qdot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.