Linux 캐시가 너무 큰 경우 QEMU가 메모리를 할당 할 수없는 이유는 무엇입니까?


9

내 컴퓨터 [Ubuntu 16.04 64 비트, 커널 4.4]를 잠시 동안 사용하면 QEMU에서 커널 캐시를 삭제해야합니다. 그렇지 않으면 RAM을 할당 할 수 없습니다.

왜 그런가요?

이것은 샘플 실행입니다.

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        5427        3690          56        5931        4803
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        1799        9446          56        3803        9414
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        1502       10819          56        2727       10784
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
# Now QEMU starts

4
스왑이 없기 때문입니다.
Michael Hampton

답변:


19

캐시 된 모든 데이터를 즉시 버릴 수있는 것은 아닙니다. 예를 들어 캐시 된 더티 페이지는 RAM에서 제거하기 전에 디스크에 다시 써야합니다. 스왑이 없으므로 쓰기가 완료 될 때까지 QEMU에 사용 가능한 공간이 충분하지 않습니다.

합리적인 양의 스왑을 추가해야합니다. 한 손을 등 뒤로 묶어 메모리 관리자가 좋은 일을한다고 기대할 수는 없습니다.


1
이론적 인 질문으로 (메모리 관리가 실제로 어떻게 작동하는지에 대해 더 배우고 싶기 때문에) 더티 페이지를 다시 쓰는 동안 관리자가 QEMU의 메모리 할당 시도를 지연 (차단) 할 수없는 이유는 무엇입니까?
nanofarad

2
@hexafraction 단지 추측 : 아마도 기술적으로 가능하지만 (심각한 복잡성을 추가 할 수는 있지만 확실하지는 않지만) 커널 개발자는 아마도 그 기능이 필요하지 않다고 주장 할 것입니다. 왜냐하면 해결해야 할 유일한 문제는 스왑이 없기 때문에 발생하기 때문입니다. 또한 스왑을 활성화하고 커널이 메모리 관리를 수행하도록 이미 코딩 된 방식으로 수행하도록하면 다른 문제가 발생합니다.
mtraceur

1
@hexafraction 커널은 알기 쉬운 일이 아닙니다. 일부 응용 프로그램의 경우에는 의미가 없으므로 일반적인 정책이 아닙니다. QEMU는 그렇게하지 않기로 결정했습니다.
David Schwartz

2
또는 몇 분 - - 당신을위한 @hexafraction 정말, 당신은 30 초를 기다려야 할 것이다 malloc()호출에 어쩌면 충분한 메모리를 찾을?
Michael Hampton

3
@hexafraction 이런 식으로 생각하십시오. 만약 malloc이 실패 할 경우 커널이 이론적으로 잠시 동안이 기능을 차단했다면 추가 API 없이는 현재 동작을 달성 할 수있는 방법이 없을 것입니다. 반면에, 현재 구현은 기다렸다가 재 시도하고자하는 소프트웨어가 만족할 때까지 느린 루프에서 malloc을 재 시도하도록합니다.
Vality
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.