Bagaimana mengatasi masalah memori ini dengan anggun?

10

Saya memiliki laptop Linux standar (pengujian Debian), dengan partisi swap.

Saya melakukan banyak percobaan dengannya. Beberapa dari mereka benar-benar kehabisan memori dan cara Linux berperilaku secara default adalah masalah bagi saya ... Mari kita berikan contoh bodoh:

  1. Duduk di depan laptop
  2. Buka terminal
  3. Ketikkan python, lalua = [0]*100000000

Sekarang kemungkinan besar bahwa Anda tidak akan memiliki cukup RAM untuk menangani daftar besar itu. Linux akan mengisi RAM, kemudian swap dan, beberapa menit kemudian, pembunuh OOM akan dipicu dan membunuh (hampir) layanan acak dan mudah-mudahan, jika Anda menekan Ctrl + C pada waktu yang tepat python,, dan jika terminal masih fokus, komputer akan menjadi responsif lagi.

Saya ingin menerapkan beberapa batasan memori untuk menghindari pertukaran yang tidak diinginkan dan menolak proses yang tepat untuk mengalokasikan lebih banyak memori daripada yang saya miliki (dalam RAM). Jika permintaan memori di bawah batas tertentu atau diminta oleh root, maka matikan saja proses yang paling membutuhkan memori dari semua pengguna kecuali root.

ulimit -Sv [mem] Saya mendengar di belakang!

Ho Ho! "Gunakan cgroupsvia cgexec!" seseorang berkata di baris pertama!

Ya, Anda benar: ini memang solusi yang sangat bagus. Tapi:

  • Mereka tidak menerapkan sistem secara luas
  • Batas ditetapkan per proses
  • Batasannya statis, mengabaikan jumlah nyata RAM gratis (AFAIK)
  • Di sana - sini , mereka mengatakan ini bukan solusi yang baik untuk menegakkan batasan keras.

Yang saya suka adalah bahwa kernel mengatakan: "Anda milik pengguna foo (bukan root), Anda menggunakan banyak memori dan kami akan kehabisan memori. Maaf Bung ... mati sekarang!"

Atau: "Apa yang kamu lakukan Anda perlu x MB dan hanya ada y MB tersedia Ya, SWAP kosong, tapi Anda tidak berniat untuk menggunakan SWAP untuk melakukan pekerjaan kotor Anda, apakah Anda Tidak, saya.? bilang tidak! Tidak ada memori untukmu! Jika kamu bersikeras, kamu akan mati! "

Komunitas
sumber
2
Sudah ada algoritma yang dijelaskan dalam artikel ini yang membantu pembunuh OOM untuk memilih proses yang benar. Mengubah /proc/sys/vm/overcommit_memorymempengaruhi perilaku kernel pada memori rendah.
jofel
1
Ya, tetapi overcommit_memoryfile khusus menggunakan RAM + SWAP sebagai memori yang dapat digunakan. Saya masih akan bertukar :)
1
Anda juga perlu menjelaskan bagaimana ini bukan duplikat dari ini: unix.stackexchange.com/questions/34334/... yang bertentangan dengan Anda cgroup WRT dan pengguna individu. PS. Jika Anda tidak ingin bertukar, nonaktifkan swap .
goldilocks
1
Saya ingin bertukar! Saya ingin hibernasi, saya ingin byte yang tidak digunakan disimpan! Tapi saya tidak ingin byte yang digunakan disimpan di sana. Tentang tautan, ulimitsadalah ide buruk seperti yang ditunjukkan hampir di mana-mana karena ini adalah batasan per proses ... Saya tahu Anda tahu :) Tentang cgroups, ini jelas lebih baik tetapi tidak memiliki sesuatu yang lebih umum: Saya berbicara tentang laptop saya tetapi saya juga memiliki server "kalkulasi" yang kami bagi tiga. Jika saya memberlakukan batas per pengguna seperti itu, saya akan dibatasi oleh skenario terburuk, bukan?
1
cgroups berlaku untuk proses apa pun yang Anda putuskan semua proses pengguna ke dalam kelompok yang terpisah dan harus melakukan apa yang Anda inginkan.
peterph

Jawaban:

4

Seseorang menyarankan Anda mendengarkan cgroups. Nah, cobalah mencari arah itu karena dapat memberi Anda:

  • diterapkan pada sekelompok tugas yang Anda pilih (dengan demikian tidak lebar sistem tetapi tidak per proses)
  • batas ditetapkan untuk grup
  • batasnya statis
  • mereka dapat menerapkan batas keras pada memori dan / atau memori + swap

Sesuatu seperti itu dapat membawa Anda lebih dekat ke tujuan Anda :

group limited {
  memory {
    memory.limit_in_bytes = 50M;
    memory.memsw.limit_in_bytes = 50M;
  }
}

Ini memberitahukan bahwa tugas-tugas di bawah cgroup ini hanya dapat digunakan pada maksimum 50M memori dan 50M memori + swap, jadi ketika memori penuh, itu tidak akan bertukar, tetapi jika memori tidak penuh dan beberapa data dapat dipetakan dalam swap, ini bisa diizinkan.

Berikut adalah kutipan dari dokumentasi memori cgroup :

Dengan menggunakan batas memo, Anda dapat menghindari sistem OOM yang dapat disebabkan oleh kekurangan swap.

Huygens
sumber
Masih tidak persis apa yang kuharapkan. Tetapi perbedaan antara apa yang saya harapkan dan kenyataan seringkali cukup besar :) Dalam hal ini, saya ingin memastikan bahwa saya tidak melewatkan sesuatu seperti overcommit_memoryvariabel kernel. Terima kasih semua.
0

Saya sering mengalami masalah yang sama. Alur kerja umum saya melibatkan perhitungan berat di MATLAB. Kadang-kadang saya secara tidak sengaja akan mencoba mengalokasikan variabel baru yang melebihi jumlah memori yang tersedia. Sistem hang, dan saya biasanya harus me-reboot mesin untuk kembali bekerja. : P

Dalam kasus saya, dan kedengarannya seperti milik Anda juga, saya tidak begitu peduli dengan membatasi jumlah memori yang digunakan MATLAB ke jumlah statis - Saya tertarik untuk tidak memiliki mesin beku, dan saya bersedia mengorbankan proses MATLAB saya untuk menjaga respon sistem.

Terinspirasi oleh tanggapan terhadap posting ini , saya menulis skrip berikut (saya menyebutnya watch_memory.sh):

#!/bin/bash

MONITOR=$(free | grep 'buffers/cache:')
MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')

MEM_PERC=$(( 100*MEM_USED / (MEM_FREE+MEM_USED) ))

while :; do
    if [ "$MEM_PERC" -gt "95" ]
    then
        kill $1
        echo "$1 killed for using too much memory."
        exit
    fi
    sleep 1

    MONITOR=$(free | grep 'buffers/cache:')
    MEM_USED=$(echo $MONITOR | awk '{ print $3 }')
    MEM_FREE=$(echo $MONITOR | awk '{ print $4 }')
    MEM_PERC=$(( 100*MEM_USED / (MEM_FREE+MEM_USED) ))
done

Script ini memeriksa setiap detik untuk jumlah persentase memori bebas. Ketika sistem habis, pid "kambing hitam" Anda (diteruskan sebagai argumen ke skrip) terbunuh.

Tanpa menyesuaikan prioritas (kebaikan) naskah, butuh sekitar 10-20 detik bagi kambing hitam untuk terbunuh, tetapi tetap berhasil. Menjalankan skrip dengan prioritas negatif menghasilkan pembunuhan instan setelah pelanggaran (11916 dalam contoh ini adalah pid yang ingin saya bunuh jika saya kehabisan memori):

sudo nice -n -5 bash watch_memory.sh 11916
Gordon Bean
sumber