Linux에서는 (어떻게) 메모리를 "핫 언플러그"할 수 있나요?

Linux에서는 (어떻게) 메모리를 "핫 언플러그"할 수 있나요?

이것이 내가 시도한 것입니다:

sudo zsh -c 'echo offline >/sys/devices/system/memory/memory109/state'`

다음과 같은 오류가 발생했습니다.

zsh:echo:1: write error: device or resource busy

오프라인으로 전환하려는 메모리 모듈이 비어 있는지 먼저 확인해야 합니까?

그렇다면 어떻게 그렇게 할 수 있습니까?


배경:

저는 VMWare에 의해 게스트로 가상화된 Ubuntu 기반 배포판을 실행하고 있습니다.

게스트 시스템의 메모리 사용량을 줄여 게스트를 다시 시작하지 않고도 호스트에서 더 많은 메모리를 사용할 수 있기를 바랍니다.

그 중 하나라도 중요할 수 있는 경우.


2016-09-29 편집:

이론적으로는 가능해야 한다는 @Gilles의 의견과 링크에 힘입어 memory109움직일 수 없는 페이지가 일부 포함되어 있을 수도 있다는 생각을 갖게 되었습니다. 그래서 다른 모듈(?)에도 시도해 보기로 했습니다.

처음에는 다른 몇 가지를 직접 시도해 보았습니다. 그러나 그것들은 성공하지 못했기 때문에 나는 그것들을 모두 시도해 볼 것이라고 생각했습니다.

for i in /sys/devices/system/memory/memory*/state;
  do echo -n "Trying "$i" \t";
  sudo zsh -c "echo offline > $i";
done

주의: 위의 스크립트는 컴퓨터에서 성공할 수 있으므로 주의하세요. 컴퓨터에서 성공할 수 있으므로 메모리 전체가 오프라인 상태가 되어 시스템이 중단되거나 중단될 수 있습니다.

이것이 내가 가장 얻은 것입니다:

...
Trying /sys/devices/system/memory/memory44/state        zsh:echo:1: write error: device or resource busy
Trying /sys/devices/system/memory/memory45/state        zsh:echo:1: write error: device or resource busy
Trying /sys/devices/system/memory/memory46/state        zsh:echo:1: write error: device or resource busy
...

단 두 가지 예외를 제외하고:

Trying /sys/devices/system/memory/memory0/state         zsh:echo:1: write error: invalid argument
...
Trying /sys/devices/system/memory/memory86/state        zsh:echo:1: write error: invalid argument
...

이것이 작동하지 않는 이유에 대한 아이디어가 있습니까?

답변1

대부분의 경우 메모리 블록에는 이동할 수 없는 페이지가 포함되어 있으므로 오프라인일 수 없습니다. "이동식" sysfs 속성을 확인하세요.

일반적인 x86-64 시스템(가상화 또는 베어 메탈)을 실행하는 경우 모든 커널 할당이 이동할 수 없기 때문에 제거 가능한 블록이 없을 가능성이 높습니다. 커널을 RAM의 일부로 제한하려면 "kernelcore=" 매개변수를 전달하세요. 그 후에 일부 제거 가능한 메모리 블록이 표시되어야 하며 'online' 속성에 '0'을 쓰거나 'state' 속성에 'offline'을 써서 오프라인으로 설정할 수 있습니다.

답변2

커널에서는 불가능하다고 생각합니다기본특징. 커널은 핫플러그만 지원하고 언플러그를 지원합니다. 이를 수행하는 이상한 방법이 있을 수 있지만 기술적으로는 좋지 않은 것 같습니다. 적어도 이것에는 문제가 거의 없습니다.

관련 정보