1. Giới thiệu về OOM Killer
OOM Killer hoặc Out Of Memory Killer là một quá trình mà kernel linux sử dụng khi hệ thống đang trong tình trạng RAM bị quá tải. Như chúng ta đã biết, hệ thống là tập hợp gồm rất nhiều các process (tiến trình) chạy trên đó. Mỗi process đều sử dụng tài nguyên như RAM, CPU, Disk của hệ thống. Tuy nhiên tài nguyên của mỗi hệ thống đều có những giới hạn nhất định, và khi tài nguyên như RAM bị sử dụng tới mức báp động đỏ thì hệ thống phải có những động tác để ngăn chặn việc này.
VD: Quy định của luật giao thông là mỗi xe máy chỉ được phép chở 2. Tiến trình nào kẹp 3, kẹp 4 sẽ lập tức có cách anh CSGT OOM tiến hành tuýt còi, bắt process đó tạm dừng và đưa lên đồn.
2. Các process nào sẽ được chọn để bị kill
OOM Killer hoạt động bằng cách xem xét tất cả các quy trình đang chạy và gán cho chúng điểm số xấu. Quá trình có số điểm cao nhất là quá trình bị giết. OOM Killer chỉ định điểm xấu dựa trên một số tiêu chí. Nguyên tắc như sau:
- Quá trình và tất cả các tiến trình con của nó đang sử dụng rất nhiều RAM
- Số lượng process tối thiểu bị kill (lý tưởng là một) để giải phóng đủ RAM để giải quyết tình huống
- Root, kernel và các process hệ thống quan trọng được cho điểm thấp hơn nhiều
Các tiến trình nào luôn bị giết?
Các tiêu chí được liệt kê ở trên có nghĩa là khi chọn một tiến trình để tiêu diệt OOM Killer sẽ chọn một quy trình sử dụng nhiều RAM và có nhiều tiến trình con và không phải là các tiến trình hệ thống. Một ứng dụng như apache, mysql, ftp server hoặc mail server sẽ tạo ra một ứng cử viên tốt.
Đối với các máy chủ chạy KVM, các tiến trình ưu tiên bị kill đó sẽ là các tiến trình chạy máy ảo. Và ở phần tiếp theo, mình sẽ dựng tình huống OOM Killer sẽ tuýt còi các process chạy máy ảo trên KVM.
3. Làm thế nào để biết có tiến trình bị OOM Killer xử lý?
Bất cứ khi nào OOM Killer được gọi để xử lý 1 tiến trình, nó sẽ ghi thông tin vào nhật ký hệ thống bao gồm tiến trình nào bị giết và tại sao. Chúng ta kiểm tra như sau :
dmesg | egrep -i "killed process"
dmesg
kernel kernel: Out of Memory: Kills process 30199 (mysql)