kvm bị giết bởi oomkiller


7

phiên bản QEMU emulator version 1.1.2 (qemu-kvm-1.1.2+dfsg-6+deb7u3, Debian), Copyright (c) 2003-2008 Fabrice Bellard
kvm : phiên bản libvirtd: libvirtd (libvirt) 0.9.12.3
phiên bản debian:7.5

Tôi đang chạy nhiều máy ảo trên máy RAM 16 GB, tất cả chúng cùng sử dụng RAM ~ 9 GB.

Thỉnh thoảng, kẻ giết người linux xuất hiện và giết chết một quá trình. Tôi đoán nó chọn quá trình sử dụng hầu hết bộ nhớ - trong trường hợp này là máy ảo Windows 6GB:
[431215.778365] Out of memory: Kill process 25086 (kvm) score 192 or sacrifice child

IMHO máy không nên ở trong Tình huống OOM vì có ~ 6,6GB bộ nhớ đệm có sẵn. Bạn có thể thấy phân phối bộ nhớ và kết quả là oom kill tại đây:

phân phối bộ nhớ

Bây giờ tôi đã thiết lập các oom_adjpid của kvms -17, vì vậy kẻ giết người oom sẽ không giết quá trình này.

Nhưng tôi vẫn không hiểu tại sao kernel nghĩ rằng nó phải giết một tiến trình và sẽ không tiếp tục và giải phóng một số bộ nhớ đệm.

  • Bất cứ ai có thể giải thích tại sao điều này xảy ra?
  • Bạn có thể cho tôi biết làm thế nào tôi có thể ngăn chặn kẻ giết người oom giết chết các quá trình kvm của mình mà không biết đến PID không?

Nghe có vẻ như lỗi này đối với tôi: bugzilla.redhat.com/show_orms.cgi?id=903432
slm

Ngoài ra, hãy kiểm tra đầy đủ tmpfs, tùy thuộc vào cách bạn kiểm tra nó có thể được tính là bộ đệm / bộ đệm mặc dù không thể giải phóng được việc hoán đổi nó.
frostschutz

Câu trả lời:


2

Chỉ cần vô hiệu hóa OOM Killerquy trình cụ thể với:

for p in $(pidof kvm qemu-system32_x64); do
  echo -n '-17' > /proc/$p/oom_adj
done

hoặc theo hương vị oom_score adj.

Tuy nhiên:

Hết bộ nhớ: Giết quá trình 25086 (kvm) 192 điểm hoặc hy sinh con

Trong trường hợp của bạn là để thiết lập cũng 192.

Xem thêm Thuần hóa OOM Killer

Trong mọi trường hợp, bạn cũng nên kiểm tra nguyên nhân gây ra tràn bộ nhớ, vì OOM Killer sẽ giết các quá trình quan trọng khác.

Thông thường nó được quan sát một hiện tượng được gọi là overtuning. Trong trường hợp này overcommit_memorynhư được mô tả ở đây .

Hệ thống tập tin nguồn Proc :

oom_adj:

For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also
be used to tune the badness score.  Its acceptable values range from -16
(OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17
(OOM_DISABLE) to disable oom killing entirely for that task.  Its value is
scaled linearly with /proc/<pid>/oom_score_adj.

oom_score_adj:

The value of /proc/<pid>/oom_score_adj is added to the badness score before it
is used to determine which task to kill.  Acceptable values range from -1000
(OOM_SCORE_ADJ_MIN) to +1000 (OOM_SCORE_ADJ_MAX).  This allows userspace to
polarize the preference for oom killing either by always preferring a certain
task or completely disabling it.  The lowest possible value, -1000, is
equivalent to disabling oom killing entirely for that task since it will always
report a badness score of 0.

1
Đầu tiên: oom_adj không được dùng nữa, tệp mới là oom_score_adj. Ngoài ra, điều này không giải quyết được vấn đề là có bộ nhớ đệm sẵn có (cùng với 16 GB trao đổi) không bao giờ chạm tới.
Momo

cảm ơn, đã hoàn thành Bạn đã ghi được đến 192 khi nó được viết? Điều gì khiến OOM Killer giết nhiệm vụ?
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.