Tại sao QEMU không thể phân bổ bộ nhớ nếu bộ nhớ Linux quá lớn?


9

Nếu tôi sử dụng máy của mình [Ubuntu 16.04 64 bit, kernel 4.4] trong một thời gian, QEMU cần loại bỏ bộ đệm kernel, nếu không, nó sẽ không quản lý để phân bổ RAM.

Tại sao nó xảy ra?

Đây là một mẫu chạy:

~$ 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
Bởi vì bạn không có bất kỳ trao đổi.
Michael Hampton

Câu trả lời:


19

Không phải tất cả dữ liệu được lưu trữ có thể được loại bỏ ngay lập tức. Ví dụ, các trang bẩn được lưu trong bộ nhớ cache phải được ghi lại vào đĩa trước khi có thể xóa chúng khỏi RAM. Bạn không có trao đổi, vì vậy cho đến khi những bài viết đó hoàn thành, đơn giản là không đủ chỗ trống cho QEMU.

Bạn thực sự nên thêm một lượng trao đổi hợp lý. Bạn không thể mong đợi người quản lý bộ nhớ sẽ làm tốt công việc với một tay bị trói sau lưng.


1
Là một câu hỏi lý thuyết (vì tôi muốn tìm hiểu thêm về cách quản lý bộ nhớ thực sự hoạt động) tại sao người quản lý không thể trì hoãn (chặn) các nỗ lực cấp phát bộ nhớ của QEMU trong khi các trang bẩn đang được viết lại?
nanofarad

2
@hexafraction Chỉ là một phỏng đoán: có thể về mặt kỹ thuật có thể (nhưng có thể thêm độ phức tạp đáng kể, không chắc chắn), nhưng các nhà phát triển hạt nhân có thể lập luận rằng không cần tính năng đó, vì vấn đề duy nhất mà nó giải quyết là do không có trao đổi, cũng gây ra các vấn đề khác, tất cả đều được khắc phục nếu bạn chỉ bật hoán đổi và để hạt nhân quản lý bộ nhớ theo cách mà nó đã được mã hóa để làm tốt.
mtraceur

1
@hexafraction Nhân không biết đó là điều hợp lý để làm. Đối với một số ứng dụng, điều đó không có ý nghĩa, vì vậy đó không phải là chính sách chung. QEMU đã chọn không làm điều đó.
David Schwartz

2
@hexafraction Thực sự, bạn có muốn đợi 30 giây - hoặc vài phút - để malloc()cuộc gọi của bạn có thể tìm đủ bộ nhớ?
Michael Hampton

3
@hexafraction Hãy nghĩ về nó theo cách này. Nếu về mặt lý thuyết, hạt nhân có tính năng này để chặn một thời gian nếu malloc có thể thất bại, thì sẽ không có cách nào để đạt được hành vi hiện tại mà không có API bổ sung. Mặt khác, việc triển khai hiện tại cho phép phần mềm muốn chờ và thử lại một lúc để thử lại malloc trong một vòng lặp chậm cho đến khi nó được thỏa mãn.
Vality
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.