UPDATE: Perhatikan bahwa jawaban di bawah ini berlaku untuk RHEL 6. Dalam RHEL 7, sebagian besar cgroup dikelola oleh systemd, dan libcgroup sudah ditinggalkan.
Sejak memposting pertanyaan ini, saya telah mempelajari seluruh panduan yang saya tautkan di atas, serta sebagian besar dokumentasi cgroups.txt dan cpusets.txt . Saya sekarang tahu lebih banyak daripada yang saya harapkan untuk belajar tentang cgroup, jadi saya akan menjawab pertanyaan saya sendiri di sini.
Ada beberapa pendekatan yang bisa Anda ambil. Kontak perusahaan kami di Red Hat (Arsitek Teknis) merekomendasikan agar tidak ada pembatasan menyeluruh dari semua proses yang lebih disukai daripada pendekatan yang lebih bersifat deklaratif — hanya membatasi proses yang secara spesifik kami inginkan dibatasi. Alasan untuk ini, menurut pernyataannya pada subjek, adalah bahwa mungkin untuk panggilan sistem untuk bergantung pada kode ruang pengguna (seperti proses LVM) yang jika dibatasi dapat memperlambat sistem ke bawah — kebalikan dari efek yang dimaksudkan. Jadi saya akhirnya membatasi beberapa proses khusus yang disebut dan meninggalkan yang lain sendirian.
Selain itu, saya ingin menyebutkan beberapa data dasar cgroup yang saya lewatkan ketika saya memposting pertanyaan saya.
Cgroup tidak tergantung pada libcgroup
pemasangan. Namun, itu adalah seperangkat alat untuk secara otomatis menangani konfigurasi cgroup dan tugas proses untuk cgroup dan bisa sangat membantu.
Saya menemukan bahwa alat libcgroup juga dapat menyesatkan, karena paket libcgroup dibangun di atas nya sendiri set abstraksi dan asumsi tentang penggunaan cgroups, yang sedikit berbeda dari pelaksanaan level kernel sebenarnya cgroups. (Saya bisa memberi contoh tetapi butuh kerja; komentar jika Anda tertarik.)
Oleh karena itu, sebelum menggunakan alat libcgroup (seperti /etc/cgconfig.conf
, /etc/cgrules.conf
, cgexec
, cgcreate
, cgclassify
, dll) saya sangat merekomendasikan mendapatkan sangat akrab dengan /cgroup
filesystem virtual itu sendiri, dan secara manual menciptakan cgroups, hirarki cgroup (termasuk hirarki dengan beberapa subsistem terpasang, yang libcgroup diam-diam dan abstrak leakily pergi), menugaskan kembali proses untuk cgroup yang berbeda dengan menjalankan echo $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasks
, dan tugas-tugas lain yang tampaknya ajaib yang libcgroup
melakukan di bawah tenda.
Konsep dasar lain saya yang hilang adalah bahwa jika /cgroup
filesystem virtual terpasang pada sistem Anda sama sekali (atau lebih tepatnya, jika salah satu subsistem cgroup alias "controller" yang dipasang sama sekali), maka setiap proses pada seluruh sistem Anda adalah di sebuah cgroup. Tidak ada yang namanya "beberapa proses dalam cgroup dan beberapa tidak".
Ada apa yang disebut root cgroup untuk hierarki yang diberikan, yang memiliki semua sumber daya sistem untuk subsistem yang dilampirkan. Misalnya hierarki cgroup yang memiliki subsistem cpuset dan blkio terpasang, akan memiliki cgroup root yang akan memiliki semua cpus pada sistem dan semua blkio pada sistem, dan dapat berbagi beberapa sumber daya dengan cgroup anak . Anda tidak dapat membatasi cgroup root karena ia memiliki semua sumber daya sistem Anda, jadi membatasi itu bahkan tidak masuk akal.
Beberapa data sederhana lain yang saya lewatkan tentang libcgroup:
Jika Anda menggunakan /etc/cgconfig.conf
, Anda harus memastikan bahwa chkconfig --list cgconfig
acara yang cgconfig
diatur untuk dijalankan saat boot sistem.
Jika Anda berubah /etc/cgconfig.conf
, Anda harus menjalankan service cgconfig restart
untuk memuat perubahan. (Dan masalah dengan menghentikan layanan atau menjalankan cgclear
sangat umum ketika bermain-main pengujian. Untuk debugging saya sarankan, misalnya lsof /cgroup/cpuset
, jika cpuset
adalah nama hierarki cgroup yang Anda gunakan.)
Jika Anda ingin menggunakan /etc/cgrules.conf
, Anda perlu memastikan "daemon mesin cgroup rules" ( cgrulesengd
) berjalan: service cgred start
dan chkconfig cgred on
. (Dan Anda harus mengetahui kondisi ras yang mungkin tetapi tidak mungkin mengenai layanan ini, seperti yang dijelaskan dalam Panduan Manajemen Sumber Daya Red Hat di bagian 2.8.1 di bagian bawah halaman.)
Jika Anda ingin bermain-main secara manual dan mengatur cgroup Anda menggunakan sistem file virtual (yang saya sarankan untuk penggunaan pertama), Anda dapat melakukannya dan kemudian membuat cgconfig.conf
file untuk mencerminkan pengaturan Anda dengan menggunakan cgsnapshot
berbagai opsi.
Dan akhirnya, informasi penting yang saya lewatkan ketika saya menulis yang berikut ini:
Namun, peringatan tentang ini tampaknya ... bahwa anak-anak dari myprocessname akan dipindahkan ke cpu group hanya cpu0on.
Saya benar, tetapi ada opsi yang tidak saya sadari.
cgexec
adalah perintah untuk memulai proses / menjalankan perintah dan menugaskannya ke cgroup.
cgclassify
adalah perintah untuk menetapkan proses yang sudah berjalan ke cgroup.
Kedua hal ini juga akan mencegah cgred
( cgrulesengd
) mengalihkan proses yang ditentukan ke cgroup yang berbeda berdasarkan /etc/cgrules.conf
.
Keduanya cgexec
dan cgclassify
mendukung --sticky
bendera, yang juga mencegah cgred
penugasan kembali proses anak berdasarkan /etc/cgrules.conf
.
Jadi, jawaban atas pertanyaan ketika saya menulisnya (meskipun bukan pengaturan yang akhirnya saya terapkan, karena saran dari Arsitek Teknis Red Hat kami yang disebutkan di atas) adalah:
Buat cpu0only
dan anycpu
cgroup seperti yang dijelaskan dalam pertanyaan saya. (Pastikan cgconfig
diatur untuk dijalankan saat boot.)
Buat * cpuset cpu0only
aturan seperti yang dijelaskan dalam pertanyaan saya. (Dan pastikan cgred
diatur untuk dijalankan saat boot.)
Mulai setiap proses saya ingin tidak dibatasi dengan: cgexec -g cpuset:anycpu --sticky myprocessname
.
Proses-proses itu akan tidak dibatasi, dan semua proses anak-anak mereka juga tidak akan dibatasi. Segala sesuatu yang lain pada sistem akan dibatasi untuk CPU 0 (setelah Anda reboot, karena cgred
cgrules tidak berlaku untuk proses yang sudah berjalan kecuali mereka mengubah EUID mereka). Ini tidak sepenuhnya disarankan, tapi itulah yang awalnya saya minta dan bisa dilakukan dengan cgroup.