Kami terus belajar cgroup. Di Red Hat Enterprise Linux 7, mereka diaktifkan secara default, karena menggunakan systemd, dan dia, pada gilirannya, sudah memiliki cgroup bawaan. Dengan Red Hat, Red Hat Enterprise Linux 6 sedikit berbeda. Sebenarnya, pengendali cgroup awalnya ada di sana, tetapi versi ini dirilis, ingat pada Januari 2010, yaitu, beberapa abad yang lalu dalam hal tahun-tahun komputer.

Namun, cgroup di Red Hat Enterprise Linux 6 mampu melakukan banyak hal bahkan hingga hari ini, yang akan kami ilustrasikan hari ini.
Mari kita menganalisis kemampuan cgroup di Red Hat Enterprise Linux 6 menggunakan satu contoh murni hipotetis, berdasarkan sepenuhnya pada peristiwa nyata. Tapi sebagai permulaan, berdasarkan tradisi, penyimpangan kecil.
Tidak pernah ada banyak masalah dengan keamanan TI seperti sekarang. Tidak mengherankan, karena saat ini tidak hanya semua komputer dan telepon yang terhubung ke jaringan, tetapi juga lemari es, penyedot debu dan banyak hal lainnya - ruang lingkup ancaman jaringan sangat besar. Dan perang melawan ancaman ini, sebagai suatu peraturan, dimulai segera di semua lini. Instalasi cepat patch keamanan? Ya tentu saja! Memperkuat keamanan sistem - firewall, SELinux, otentikasi yang kompeten, apakah itu saja? Tentu saja! Pemindai antivirus di mesin Linux? Bagaimana mengatakannya ...
Pada mesin Linux, pemindai antivirus terkadang lebih berbahaya daripada baik. Namun, penjaga keamanan memiliki alasan sendiri, dan mereka sering meminta Anda untuk menjalankan pemindaian antivirus secara teratur, tanpa benar-benar memikirkan kesehatan mereka dari sudut pandang teknis. Dan ini adalah kenyataan yang harus diterima seseorang, dan dengan itu, cepat atau lambat, hampir semua spesialis IT menghadapi.
Poin kedua adalah bahwa Red Hat Enterprise Linux 7 tentu saja modis, canggih dan keren, tetapi banyak yang masih menggunakan Red Hat Enterprise Linux 6 dan tidak berpikir untuk menolaknya. Bahkan, itu sebabnya orang memilih Red Hat - Anda dapat duduk di versi yang sama selama bertahun-tahun dan masih memiliki semua tambalan, pembaruan, dan dukungan terbaru.
Mari kita kembali ke contoh kita ... Bayangkan ada seorang pria bernama Jerry. Jerry bekerja di kantor besar dan bertanggung jawab untuk server Red Hat Enterprise Linux 6. Dia benar-benar puas dengan cara kerjanya, dan dia tidak membutuhkan masalah dan bunts baru.
Tetapi kemudian orang-orang dari departemen keamanan memutuskan bahwa pada semua servernya Anda perlu meletakkan satu hal yang disebut ScanIT. Dan karena hal ini secara berkala akan memeriksa disk dan memori untuk virus dan malware lainnya, perlu akses root penuh.
Jerry menghela nafas, meletakkan gitarnya dan pergi untuk menempatkan ScanIT pada mesin uji. Cukup cepat ternyata ini:
- Saat melakukan pemindaian anti-virus, scanit (ini adalah skrip untuk memulai proses) memakan semua waktu prosesor yang dapat dijangkau. Dan ini sangat mempengaruhi kerja mesin uji - begitu Jerry bahkan tidak bisa mencapainya di ssh.
- Selain itu, proses scanit memakan memori dari waktu ke waktu seolah-olah menjadi dirinya sendiri. Akibatnya, OOM Killer bangun dan mulai membunuh proses apa pun selain scanit itu sendiri.
Secara umum, sesuatu harus dilakukan dengan ini.
Jerry mengambil gitar dan, bermain Grateful Dead, mulai berpikir. Cukup cepat, terlintas dalam benaknya bahwa kelompok-kelompok yang sama dari Red Hat Enterprise Linux 7 mungkin bisa membantu di sini, yang tentang seorang teman bernama Alex berdengung di telinganya. Jerry kembali meletakkan gitarnya dan mulai membaca
dok Alex
di Red Hat Enterprise Linux 6 . Ternyata hal pertama yang dia butuhkan adalah libcgroup.
Tidak ada libcgroup pada mesin uji, jadi Jerry mulai memasangnya:
Selain itu, Jerry menyertakan dua layanan yang diperlukan untuk pekerjaan kelompok tetap (persisten):
- cgconfig - menyediakan antarmuka yang lebih atau kurang sederhana untuk bekerja dengan pohon cgroup. Jerry tentu bisa memasang dan mengkonfigurasi cgroup secara manual, tetapi mengapa, jika Anda dapat menghemat waktu?
- cgred - hal ini adalah mesin aturan cgroup: ketika suatu proses dimulai, layanan ini menempatkannya dalam satu atau beberapa cgroup sesuai dengan aturan yang ditentukan.
Setelah menginstal dan mengkonfigurasi semua ini, Jerry akhirnya dapat melanjutkan langsung ke masalah itu sendiri. Setelah dengan cermat memikirkannya, ia membuat keputusan berikut:
- proses scanit dan anaknya harus mengkonsumsi tidak lebih dari 20% dari sumber daya CPU. Bahkan, bahkan kurang - tidak lebih dari 20% sumber daya dari satu inti prosesor, bahkan pada mesin multi-inti. Dalam cgroup, ini dilakukan dengan menggunakan kuota CPU.
- Sedangkan untuk memori, proses scanit dan anaknya harus mengkonsumsi tidak lebih dari 512 MB memori sistem. Jika mereka melewati garis ini, sistem harus membunuh mereka, dan bukan proses lainnya.
Tidak perlu memberitahuku apa yang harus dilakukan!
Jerry harus berurusan dengan dua set file konfigurasi:
- /etc/cgconfig.conf - Dibuat secara otomatis saat menginstal libcgroup.
- /etc/cgrules.conf - berisi sekumpulan aturan ruleset, yang menurutnya cgred mengurutkan proses yang dijalankan oleh grup cgroups.
Seperti inilah tampilan file cgconfig.conf default:
Jerry bisa saja membuat perubahan yang diperlukan secara langsung kepadanya, tetapi lebih baik menggunakan file conf drop-in untuk ini. Bagaimana cara kerjanya? Jika Anda meletakkan (eng. Drop-in - drop) di folder /etc/cgconfig.d file apa pun dengan ekstensi .conf, sistem akan memprosesnya dan membuat perubahan yang sesuai dengan konfigurasi. Ini nyaman karena Anda dapat membuat drop-in untuk berbagai tugas dan menambah atau menghapusnya dari konfigurasi menggunakan alat yang paling Anda sukai (katakanlah, Ansible, yah, ini masih blog Red Hat).
Jerry pertama kali membuat file drop-in untuk CPU:
Kami melihat apa yang kami miliki di sini dan bagaimana cara kerjanya.
Kata kunci grup hanya menetapkan nama cgroup baru, dalam kasus kami, scanit. Di dalam kurung kurawal, kami menentukan kontrol cgroup yang ingin kami gunakan. Di sini, cpu.cfs_ Period_us dan cpu.cfs_quota_us, mereka memungkinkan Anda untuk menetapkan batas yang sesuai di Penjadwal Sepenuhnya Adil, penjadwal kernel yang digunakan secara default di Red Hat Enterprise Linux 6. Mari kita lihat apa yang tertulis tentang mereka di dalam
Red Hat Enterprise Linux Resource Management Guide 6 :
Dengan kata lain, Jerry menulis ini di drop-innya: โUntuk setiap proses yang terkait dengan cgroup bernama scanit, satu detik sekali periksa jumlah sumber daya CPU yang dialokasikan untuk itu. Jika total waktu prosesor untuk semua proses dalam grup ini lebih dari 200.000 milidetik, maka sepenuhnya berhenti memberi waktu prosesor untuk proses ini. " Yaitu, untuk mengalokasikan ke semua proses dalam grup-grup scanit, serta proses anak mereka, secara total tidak lebih dari 20% dari waktu prosesor.
Setelah memulai ulang cgconfig, server akan memperbarui konfigurasi, dan jika Anda masuk ke sistem file, kita akan melihat bahwa scanit sekarang terletak di direktori pengontrol CPU:
Ini, tentu saja, bagus, tetapi kita masih perlu mendorong scanit sendiri ke cgroup ini. Crged sangat berguna di sini, secara default akan terlihat seperti ini:
Menggunakan file ini lebih atau kurang mudah. Namun, untuk ini kita harus langsung mengedit file cgrules.conf, karena mekanisme drop-in tidak didukung di sini. Kami menunjukkan pengguna atau grup yang memiliki proses, serta nama spesifik - jika Anda mau - proses, serta pengontrol khusus dan grup tujuan cgroup.
Dalam contoh kami, alih-alih pemindai anti-virus pemindai yang sebenarnya, kami menggunakan skrip yang juga disebut scanit, tetapi sebenarnya hanya meniru beban. Tanpa cgroup, semuanya akan terlihat seperti ini:
CPU terisi penuh, terutama oleh ruang pengguna dan sedikit sistem.
Jerry menggaruk jenggotnya. Itu mulai vi dan, menggunakan tepat satu jari telunjuk, membuat beberapa perubahan dan me-restart daemon cgred:
Kemudian secara manual meluncurkan scanit ...:
Dan - bersorak! Kemenangan
Seperti yang Anda lihat, proses meniru beban kami (proses scanit anak) sekarang mengkonsumsi total 20% sumber daya CPU, terutama di ruang pengguna dan sedikit di sistem. Jadi, antivirus sialan ini tidak akan lagi memuat mobil ke kegilaan penuh.
Ingat apa selanjutnya?
Bersukacita atas keberhasilan itu, Jerry hampir melupakan ingatannya. Tapi kemudian dia masih ingat dan mulai vi lagi untuk memperbaiki file konfigurasinya.
Sekarang dia menambahkan dua pengaturan berkenaan dengan memori di sana:
- Memory.limit_in_bytes - maks. Jumlah RAM yang dapat digunakan oleh semua proses dalam kelompok scanit. Dan tidak termasuk ruang swap. Jerry membatasi hingga 256 MB
- Memory.memsw.limit_in_bytes - maks. Volume RAM, ditambah ruang dalam file swap, yang dapat dialokasikan untuk semua proses dalam grup-grup scanit, secara total. Jika ambang ini terlampaui, proses akan dibunuh oleh pembunuh OOM. Jerry mengaturnya menjadi 512 MB.
Oh tidak! Apa yang salah
Jerry melihat ke atas dan melihat bahwa proses anak scanit masih berjalan. Karena cgroup ini sedang digunakan, Jerry tidak dapat memulai layanan. Oleh karena itu, ia membunuh proses anak secara manual dan memulai kembali layanan tersebut.
Sekarang edit kecil di cgred.conf:
Untuk memeriksanya, Jerry menjalankan beberapa tugas pemindaian sekaligus, sehingga pembunuh OOM akan bekerja dengan pasti.
Kemudian Jerry melihat log sistem dan mengangguk puas - scanit tidak bisa lagi meninggalkan memori dalam jumlah berapa pun tanpa impunitas.
Kami berharap serangkaian artikel cgroup kami membantu Anda memahami apa itu, bagaimana menggunakannya di Red Hat Enterprise Linux 7, cara membuatnya di Red Hat Enterprise Linux 6, dan bagaimana menggunakannya di lingkungan Anda.