Bagaimana membatasi penggunaan sumber daya untuk menghemat CPU + RAM untuk proses tertentu?

25

Saya memiliki server dev yang sshdterkadang berhenti bekerja karena mesin kehabisan RAM. Ya kami kehabisan memori dan peningkatan bukanlah pilihan yang layak saat ini. Apa yang ingin saya lakukan adalah memberi tahu mesin: "Lakukan apa yang Anda inginkan, tetapi tinggalkan 20MB dan beberapa CPU untuk sshd!".

Bagaimana itu bisa dilakukan?

phhehehe
sumber
Sshd seharusnya tidak meledak seperti itu, itu biasanya daemon yang berperilaku sangat baik. Pastikan itu diperbarui ke yang terbaru / terhebat. Apa yang kamu lakukan dengannya? Apakah Anda mengirim data besar melalui itu?
Marcin
2
@ Marscin Saya tidak berpikir saya melakukan sesuatu yang besar, mengedit teks. Bahkan jika sshdberperilaku baik, saya pikir itu akan macet jika tidak ada cukup CPU / RAM untuk digunakan, bukan?
phunehehe
Ketika linux kehabisan memori, ia mulai mematikan proses untuk mengambil kembali memori. Anda mungkin melihat OOM beraksi (kehabisan memori pembunuh). Saya tidak tahu mengapa itu memutuskan untuk membunuh sshd Anda secara konsisten. Pernahkah Anda melihat sshd benar-benar bocor (tumbuh dalam ukuran) mengerikan, sebelum meledak, atau apakah itu berfungsi dengan baik pada satu saat dan mati pada saat berikutnya?
Marcin
@Marcin kemungkinan adalah jika dia OOM sistem macet begitu banyak dia sshd tidak bisa menanggapi, itu bukan masalah sshd tetapi masalah dengan bebannya. Sayangnya saya tidak tahu jawabannya.
xenoterracide
@ phunehehe apakah Anda yakin bahwa masalahnya ada memori untuk ssh dan bukan beban Anda melalui atap? apakah sshd memberikan kesalahan? apa beban di kotak? dan apa yang menyebabkan sistem kehabisan memori.
xenoterracide

Jawaban:

9

Anda mungkin dapat mencapai sesuatu seperti itu dengan menggunakan cgroup dengan pengontrol sumber daya Memori .

Saya kira Anda akan menempatkan semua tugas yang memakan sumber daya Anda dalam jumlah terbatas (CPU & RAM) cgroup, dan biarkan sshd"di luar" sehingga tidak dibatasi.

(Menambahkan lebih banyak swap, bahkan dalam bentuk file swap, mungkin merupakan opsi yang baik.)

Tikar
sumber
Saya masih ragu, itu tidak terlihat mudah (dimanjakan oleh Ubuntu).
phunehehe
oh tentu tidak mudah :-) Menambahkan swap jauh lebih mudah.
Mat
@ phunehehe selamat datang untuk menjadi Sys Admin, itu tidak mudah. Tetapi sekarang Anda harus belajar cara melakukan hal yang tidak mudah.
xenoterracide
6

Oh tapi cgroup itu mudah :) Instal paket libcgroup. Buat /etc/cgconfig.conf:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

Mulai cgconfigproses yang akan membuat hierarki, kelompok, dan menetapkan batas. Jika itu berhasil, Anda memiliki dua cgroup, yang keduanya memiliki 50% dari CPU yang ditetapkan dan 1G memori yang tersedia (tidak tahu berapa jumlah aktual Anda dari memori yang tersedia; anggap itu 2G dalam contoh ini). Sekarang Anda hanya perlu memindahkan semua tugas (yaitu semua proses yang berjalan pada sistem) dari grup root ke nosshd cgroup:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

Maka Anda hanya perlu mendapatkan PID dari sshdproses dan memindahkannya info file tugas sshd:

cgroup]# echo $PID >> sshd/tasks

Ta-da, kamu sudah selesai. Anda sekarang dapat yakin bahwa sshd akan selalu memiliki 50% dari CPU dan 1G memori.

mart1n
sumber
1

Gunakan reniceuntuk mendapatkan prioritas yang lebih tinggi untuk sshd, atau memeriksa akuntansi. (acct) -> dengan ini Anda dapat mengatur sumber daya untuk pengguna, jadi jalankan sshd dengan s

MSpike
sumber
Saya akan menambahkan ioniceitu juga, dan mungkin mulai sshd dengan senang tidak mengganti lagi nanti.
xenoterracide
1

Solusi yang lebih umum untuk masalah penggunaan sumber daya aplikasi adalah dengan menjalankan aplikasi Anda dalam wadah menggunakan Docker . Anda kemudian dapat menjalankan wadah dengan CPU dan batas penggunaan memori mirip dengan cgroup.

docker run -c=10 -m=1g my-container
Sean Fujiwara
sumber