Perjuangan untuk sumber daya, bagian 2: Kami bermain dengan pengaturan Cgroups

Kami mulai mempelajari Kelompok Kontrol ( Grup ) di Red Hat Enterprise Linux 7 - mekanisme level kernel yang memungkinkan Anda untuk mengontrol penggunaan sumber daya sistem, memeriksa secara singkat dasar-dasar teoretis dan sekarang beralih ke praktik mengelola sumber daya CPU, memori dan I / O.


Namun, sebelum mengubah apa pun, selalu berguna untuk mengetahui bagaimana semuanya diatur sekarang.

Ada dua alat yang dengannya Anda dapat melihat status cgroup aktif dalam sistem. Pertama, ini adalah systemd-cgls - perintah yang menampilkan daftar cgroup dan proses yang berjalan seperti pohon. Keluarannya terlihat seperti ini:


Di sini kita melihat cgroup tingkat atas: user.slice dan system.slice. Kami tidak memiliki mesin virtual, oleh karena itu, di bawah beban, grup tingkat atas ini menerima 50% dari sumber daya CPU (karena irisan mesin tidak aktif). Ada dua irisan anak di user.slice: user-1000.slice dan user-0.slice. Irisan pengguna diidentifikasi oleh User ID (UID), jadi mengidentifikasi pemilik bisa sulit, kecuali untuk proses yang berjalan. Dalam kasus kami, sesi ssh menunjukkan bahwa pengguna 1000 masing-masing adalah mrichter, dan pengguna 0 adalah root.

Perintah kedua yang akan kita gunakan adalah systemd-cgtop. Ini menunjukkan gambar penggunaan sumber daya secara real time (output dari systemd-cgl, omong-omong, juga diperbarui secara real time). Di layar, tampilannya seperti ini:


Ada satu masalah dengan systemd-cgtop - ini menunjukkan statistik hanya untuk layanan dan irisan yang memungkinkan akuntansi penggunaan sumber daya. Akuntansi diaktifkan dengan membuat file conf drop-in di subdirektori yang sesuai di / etc / systemd / system. Misalnya, drop-in pada tangkapan layar di bawah ini memungkinkan penggunaan CPU dan memori untuk layanan sshd. Untuk melakukannya sendiri, cukup buat drop-in yang sama di editor teks. Selain itu, akuntansi juga dapat diaktifkan dengan systemctl set-property sshd.service CPUAccounting = true command MemoryAccounting = true.


Setelah membuat drop-in, Anda harus memasukkan perintah daemon-reload systemctl, serta perintah systemctl restart <service_name> untuk layanan yang sesuai. Sebagai hasilnya, Anda akan melihat statistik tentang penggunaan sumber daya, tetapi ini akan membuat beban tambahan, karena sumber daya juga akan digunakan untuk akuntansi. Oleh karena itu, akuntansi harus dimasukkan dengan hati-hati dan hanya untuk layanan dan grup yang perlu dipantau dengan cara ini. Namun, sering kali alih-alih systemd-cgtop, Anda dapat melakukannya dengan perintah atas atau iotop.

Ganti bola-CPU untuk bersenang-senang dan bermanfaat


Sekarang mari kita lihat bagaimana perubahan bola prosesor (Berbagi CPU) mempengaruhi kinerja. Misalnya, kami akan memiliki dua pengguna yang tidak memiliki hak pribadi dan satu layanan sistem. Pengguna dengan login mrichter memiliki UID 1000, yang dapat diverifikasi menggunakan file / etc / passwd.


Ini penting karena irisan pengguna dinamai oleh UID dan bukan oleh nama akun.

Sekarang, mari kita pergi ke direktori drop-in dan melihat apakah sudah ada sesuatu untuk slice-nya.


Tidak, tidak ada apa-apa. Meskipun ada hal lain - lihatlah hal-hal yang terkait dengan foo.service:


Jika Anda terbiasa dengan file unit systemd, Anda akan melihat di sini file unit yang benar-benar biasa yang menjalankan perintah / usr / bin / sha1sum / dev / zero sebagai layanan (dengan kata lain, daemon). Bagi kami, yang penting foo akan mengambil secara harfiah semua sumber daya prosesor yang memungkinkan sistem untuk digunakannya. Selain itu, di sini kami memiliki pengaturan drop-in untuk layanan foo nilai bola CPU sama dengan 2048. Secara default, seperti yang Anda ingat, ini digunakan dengan nilai 1024, jadi di bawah beban foo akan menerima pembagian sumber daya CPU ganda dalam sistem. , irisan tingkat atas induknya (karena foo adalah layanan).

Sekarang jalankan foo melalui systemctl dan lihat apa yang diperlihatkan oleh perintah teratas:


Karena praktis tidak ada hal-hal lain yang bekerja dalam sistem, layanan foo (pid 2848) menghabiskan hampir semua waktu prosesor satu CPU.

Sekarang mari kita perkenalkan mrichter ke dalam persamaan pengguna. Pertama, kami memotong bola CPU hingga 256, kemudian dia masuk dan mulai foo.exe, dengan kata lain, program yang sama, tetapi sebagai proses pengguna.


Jadi mrichter meluncurkan foo. Dan inilah yang ditunjukkan perintah teratas:


Aneh, ya? Pengguna mrichter tampaknya mendapatkan sekitar 10 persen dari waktu prosesor, karena ia memiliki = 256 bola, dan foo.service memiliki sebanyak 2048, bukan?

Sekarang kami memperkenalkan dorf ke dalam persamaan. Ini adalah pengguna biasa dengan bola CPU standar sama dengan 1024. Ia juga akan menjalankan foo, dan sekali lagi kita akan melihat bagaimana distribusi waktu prosesor akan berubah.


dorf adalah pengguna old-school, dia baru memulai prosesnya, tanpa skrip pintar atau apa pun. Dan lagi kita melihat output dari atas:


Jadi ... mari kita lihat pohon cgroup dan coba cari tahu apa itu:


Jika Anda ingat, biasanya dalam suatu sistem ada tiga cgroup tingkat atas: Sistem, Pengguna dan Mesin. Karena tidak ada mesin virtual dalam contoh kami, hanya irisan Sistem dan Pengguna tetap. Masing-masing dari mereka memiliki CPU-ball 1024, dan karena itu memuatnya menerima setengah waktu prosesor. Karena foo.service tinggal di System, dan tidak ada kandidat lain untuk waktu CPU dalam slice ini, foo.service menerima 50% sumber daya CPU.

Lebih lanjut, pengguna dorf dan mrichter tinggal di irisan Pengguna. Bola pertama adalah 1024, yang kedua - 256. Oleh karena itu, dorf mendapat waktu prosesor empat kali lebih banyak daripada mrichter. Sekarang mari kita lihat apa yang ditampilkan: foo.service - 50%, dorf - 40%, mrichter - 10%.

Menerjemahkan ini ke dalam bahasa kasus penggunaan, kita dapat mengatakan bahwa dorf memiliki prioritas yang lebih tinggi. Oleh karena itu, cgroup dikonfigurasikan sehingga pengguna dapat memotong sumber daya untuk waktu yang mereka butuhkan. Memang, setelah semua, sementara mrichter berada di sistem sendirian, ia menerima 50% dari waktu prosesor, karena dalam irisan Pengguna tidak ada orang lain yang bersaing untuk sumber daya CPU.

Faktanya, bola-CPU adalah cara untuk memberikan waktu prosesor yang โ€œdijamin minimumโ€, bahkan untuk pengguna dan layanan dengan prioritas lebih rendah.

Selain itu, kami memiliki cara untuk menetapkan kuota keras untuk sumber daya CPU, batas tertentu dalam angka absolut. Kami akan melakukan ini untuk pengguna mrichter dan melihat bagaimana distribusi sumber daya berubah.



Sekarang mari kita bunuh tugas pengguna, dan inilah yang terjadi:


Untuk mrichter, batas CPU absolut adalah 5%, jadi foo.service mendapatkan sisa waktu prosesor.

Lanjutkan intimidasi dan hentikan layanan foo.:


Apa yang kita lihat di sini: mrichter memiliki 5% dari waktu prosesor, dan 95% sisanya dari sistem idle. Ejekan formal, ya.

Bahkan, pendekatan ini memungkinkan Anda untuk secara efektif menenangkan layanan atau aplikasi yang suka tiba-tiba mengayun dan menarik semua sumber daya prosesor untuk diri mereka sendiri sehingga merugikan proses lainnya.

Jadi, kami belajar bagaimana mengendalikan situasi saat ini dengan cgroup. Sekarang kita menggali sedikit lebih dalam dan melihat bagaimana cgroup diimplementasikan pada tingkat sistem file virtual.

Direktori root untuk semua cgroup yang berjalan terletak di / sys / fs / cgroup. Ketika sistem melakukan booting, sistem akan terisi saat layanan dan tugas lainnya dimulai. Saat memulai dan menghentikan layanan, subdirektori mereka muncul dan menghilang.

Pada tangkapan layar di bawah ini, kami pergi ke subdirektori untuk pengontrol CPU, yaitu di irisan Sistem. Seperti yang Anda lihat, subdirektori untuk foo belum ada di sini. Jalankan foo dan periksa beberapa hal, yaitu, PID-nya dan bola CPU saat ini:



Peringatan penting: di sini Anda dapat mengubah nilai dengan cepat. Ya, secara teori itu terlihat keren (dan dalam kenyataannya juga), tetapi bisa berubah menjadi kekacauan besar. Karena itu, sebelum mengubah apa pun, timbang dengan hati-hati segalanya dan jangan pernah bermain di server pertempuran. Tapi bagaimanapun, sistem file virtual adalah sesuatu untuk digali lebih dalam saat Anda mempelajari cara kerja cgroup.

Source: https://habr.com/ru/post/id424367/


All Articles