Bagaimana cara menggunakan oom_score_adj?

24

Pada 11.04, /proc/[pid]berisi oom_score_adj, tetapi man procmenggambarkan yang lama oom_adj. Saya tidak berhasil menelusuri Google untuk informasi tentang cara menggunakan ini.

Yang saya perlu mengatur adalah bahwa proses yang dimulai dengan 'pbs' atau 'gridengine' terbunuh sebelum hal lain terbunuh. Bagaimana saya bisa melakukan itu?

bmargulies
sumber
Untuk membuat perubahan ini secara permanen untuk layanan yang dikelola oleh Upstart: Bagaimana cara mengatur penyesuaian pembunuh OOM untuk daemon secara permanen? .
gertvdijk
Itu sudah jawabannya. Itu tautan ke sana. :)
gertvdijk
Tetapi tidak di situs ini :-)
bmargulies

Jawaban:

13

Berdasarkan T&J saya sendiri di Unix & Linux pada pertanyaan serupa.

Seperti yang ditunjukkan Stuart dengan sangat baik dalam jawabannya , nilai yang valid adalah bilangan bulat dalam kisaran -1000 hingga 1000 oom_score_adj. Semakin rendah nilainya, semakin rendah kesempatan untuk dibunuh.

Sangat tidak nyaman harus mengubah nilai ini berulang kali setelah Anda me-restart aplikasi. Informasi hilang begitu saja setelah proses berakhir. Pemula (daemon init di Ubuntu), memiliki opsi yang bagus untuk mengonfigurasi daemon untuk memastikannya diset kapan pun dimulai (kembali):

oom score

[...] snip [...]

Contoh:

# this application is a "resource hog"
oom score 1000

expect daemon
respawn
exec /usr/bin/leaky-app

Jadi, pada dasarnya, Anda dapat mengedit /etc/init/myservice.conffile konfigurasi untuk layanan yang ingin Anda ubah, untuk menyertakan baris oom score -1000. Saya berasumsi bahwa layanan 'pbs' atau 'gridengine' yang Anda bicarakan dalam pertanyaan Anda berkemampuan Pemula, jika tidak, Anda akan memerlukan cara lain untuk mengubahnya secara permanen.

gertvdijk
sumber
7

Jika Anda dapat memodifikasi skrip start yang menghasilkan proses yang ingin Anda prioritaskan untuk oom-killer, tambahkan berikut ini ke skrip start:

echo 1000 > /proc/self/oom_score_adj

Nilai ini diwarisi untuk proses anak.

pengguna1338062
sumber
6

Jika Anda menetapkan nilai tinggi (ish) untuk oom_adj atau oom_score_adj maka mereka akan dibunuh terlebih dahulu. misalnya

echo 15 > /proc/[pid]/oom_adj

oom_adj berubah dari -16 menjadi 15 dan seperti yang disebutkan di atas oom_score_adj menerima -1000 hingga 1000

Stuart
sumber
Anda harus menjadi root untuk melakukan ini. sudo sh -c "echo -1000 > /proc/[PID]/oom_score_adj"
Adil
2
Sebenarnya, Anda dapat meningkatkan skor untuk proses Anda tanpa root ("ya, ini bisa terbunuh)". Penurunan (di bawah 0) membutuhkan root.
Piskvor
5

Melihat ke dalam kode selalu merupakan ide yang bagus. Biasanya saya menggunakan fungsi pencarian kernel.org, tetapi saat ini sedang down. Github melakukan pekerjaan dengan baik juga. Aku menemukan ini:

Sebagai gantinya, merdu baru, / proc / pid / oom_score_adj, ditambahkan yang berkisar dari -1000 hingga +1000. Ini dapat digunakan untuk mempolarisasi heuristik sehingga tugas-tugas tertentu tidak pernah dianggap untuk membunuh sementara yang lain selalu dianggap. Nilai ditambahkan langsung ke skor badness () sehingga nilai -500, misalnya, berarti mendiskon 50% dari konsumsi memorinya dibandingkan dengan tugas-tugas lain baik pada sistem, terikat pada mempolicy, di cpuset, atau berbagi pengontrol memori yang sama.

Dari https://github.com/mirrors/linux-2.6/commit/a63d83f427fbce97a6cea0db2e64b0eb8435cd10#include/linux/oom.h

Falstaff
sumber
Terima kasih untuk penunjuknya, tapi saya berharap seseorang akan melewatinya dan menembakkan resep untuk seluruh masalah, yang tampaknya mengatur nilai ini ditetapkan untuk daemon exec pbs sebelum mencabuti pekerjaan apa pun.
bmargulies
1

Kami punya choom sekarang.

tl; dr: choom --adjust -100 myprogram.

Halaman manual memiliki informasi lebih lanjut.

Frederick Nord
sumber