Out of memory
Tôi viết bài này khi vừa hoàn thành 1 hệ thống ERP oracle cho khách hàng. Vấn đề cài đặt ERP oracle tôi sẽ không đề cập ở đây vì nó vừa khô khan khó nuốt, 1 phần vì tài liệu tham khảo về nó khá nhiều ở các site oracle training. Vấn đề tôi muốn nói ở đây là lỗi Out of memory (oom killer) khi cài đặt các ứng dụng trên hệ thống Linux 32bit hoặc x86_64bit
Nói chung khi bị lỗi Out of memory xảy ra thì các tiến trình sẽ bị tắt (kill) hoặc ngừng hoạt động. Nếu các ứng dụng đang chạy lường trước được sự quá tải của bộ nhớ thì thường sẽ có 2 lựa chọn khi điều này xảy ra. 1 là Retry 2 là Abort. Tất nhiên 2 điều này đều nhằm chờ đợi sự thay đổi thông số memory từ phía kernel. Bản thân người dùng linux thường bỏ quên việc tổng quan hệ thống như memory đang hết bao nhiêu, cpu ra sao, các disk hoạt động thế nào. Điều này là 1 thói quen không tốt bởi thực ra việc monitor các tiến trình (proccess) này là điều khá đơn giản thông qua
cat /proc/version
cat /proc/cpuinfo
cat /proc/meminfo
Trở lại với việc out of memory tôi gặp là khi đang setup Oracle EBS R12.1.1 trên nền linux64. Nếu ai đã từng đụng qua thử mấy món này sẽ biết các file cài đặt dung lượng tầm 50 – 60gb. Đặc biệt nó đòi hỏi khá nhiều physically memory & swap cache khi khởi chạy. Tuy nhiên lúc đầu tôi không quan tâm lắm đến việc requirement khi cài đặt nó, bởi tôi tự tin với cấu hình Server của mình có thể phà phà trên tầng cây số.
Trong nhiều trường hợp tôi để ý thấy với các hệ thống máy chủ có nhiều hơn 6gb ram, người sử dụng thường phó mặc tất cả việc quản lí chúng cho kernel của hệ thống thực hiện. Điều này không sai, tuy nhiên đôi khi với cấu hình kernel mặc định, bạn sẽ gặp phải 1 vài thông số như kernel.msgmax hoặc kernel.shmmax cản lọc việc tối đa hóa hiệu năng và tài nguyên của memory.
Để khắc phụ điều này cần chú ý kĩ những điều sau
Nhân(kernel) sử dụng bộ nhớ thấp nhất có thể để theo dõi và cấp phát tài nguyên (resource) cho 1 hệ thống. Thế nên một hệ thống 16gb ram sẽ phải sử dụng nhiều bộ nhớ cấp phát hơn là 1 hệ thống 2gb ram. Chính điều này gây áp lực cho bản thân kernel trong quá trình cấp phát, bởi mặc định Linux không giống Windows. Windows nếu bạn cài 32bit thì số lượng bộ nhớ tối đa nhận là 3,2gb thế nên bạn có gắn cao hơn thì cũng chưa chắc nhận được. Ở Linux 32bit hay 64bit đều có thể nhận số lượng memory mà bạn cấp cho chúng nhưng phải kèm theo 1 cấu hình chuẩn để giải tỏa & thỏa mãn số lượng này
Bạn có thể kiểm tra độ cao thấp của bộ nhớ thông qua.
# egrep 'High|Low' /proc/meminfo
HighTotal: 5111780 kB
HighFree: 1172 kB
LowTotal: 795688 kB
LowFree: 16788 kB
hoặc
# free -lm
total used free shared buffers cached
Mem: 5769 5751 17 0 8 5267
Low: 777 760 16 0 0 0
High: 4991 4990 1 0 0 0
-/+ buffers/cache: 475 5293
Swap: 4773 0 4773
Đối với hệ thống 32bit việc đồng bộ hóa kernel phân giải cho memory là điều không khó khăn, cộng thêm việc tắt chức năng out of memory có thể sẽ mang lại kết quả khả quan hơn cho bạn
Tôi thử nghiệm trên hệ thống linux của mình với version kernel là 2.6.x cách cấu hình lại như sau
# cat /proc/sys/vm/lower_zone_protection
# echo "250" > /proc/sys/vm/lower_zone_protection
# echo "vm.lower_zone_protection = 250" > /etc/sysctl.conf
Tắt oom killer bằng cách
# echo "0" > /proc/sys/vm/oom-kill (tắt)
# echo "1" > /proc/sys/vm/oom-kill (mở)
# echo “vm.oom-kill = 0″ > /etc/sysctl.conf
Sau mỗi tinh chỉnh nên reboot lại hệ thống và biên tập lại nhân thông qua sysctl -p
Đối với hệ thống đang gặp phải quá trình OOM như trên bạn có thể xác định nó chính xác bằng cách
tail /var/log/messages:
Out of Memory: Killed process [PID] [process name].
và tất nhiên sau khi đã tinh chỉnh
tail /var/log/messages:
"Would have oom-killed but /proc/sys/vm/oom-kill is disabled"




