Perjuangan untuk sumber daya, bagian 6: cpuset atau Berbagi tidak selalu benar

Saat berbicara tentang cgroup, pengguna Red Hat sering menanyakan pertanyaan yang sama: “Saya punya satu aplikasi yang sangat sensitif dalam hal keterlambatan. Apakah mungkin menggunakan cgroup untuk mengisolasi aplikasi ini dari yang lain dengan mengikatnya ke core prosesor tertentu? "



Tentu saja bisa. Kalau tidak, kami tidak akan memilih masalah ini sebagai topik artikel hari ini.

Di masa kecil, kita sering diberi tahu bahwa berbagi itu baik dan benar. Pada umumnya, apa adanya. Namun ada beberapa pengecualian.

Seperti yang kami tulis di posting pertama seri ini , secara default, Red Hat Enterprise Linux 7 berperilaku seperti nenek jenis bola. Dalam arti bahwa dia mencoba untuk mendistribusikan sumber daya sistem secara adil di antara semua yang bertanya. Namun, dalam kehidupan nyata, nenek punya hewan peliharaan yang mendapat lebih banyak. Diterjemahkan ke dalam sysadmin, ini berarti bahwa ada beberapa situasi ketika beberapa aplikasi atau layanan lebih penting daripada yang lain, sehingga mereka harus diberi semua perhatian yang mungkin sehingga mereka responsif mungkin.

Red Hat Enterprise Linux 7 melakukan ini dalam dua langkah:

  1. Kami mengisolasi bagian dari inti prosesor untuk mentransfernya ke penggunaan eksklusif aplikasi semacam itu.
  2. Kami membuat grup cgroup dan file unit yang mengikat aplikasi ini ke kernel yang terisolasi.

Sebuah penyimpangan kecil mengenai contoh-contoh dari posting ini


Hat Enterprise Linux 7.4 telah mengubah cara kerja irisan berumur pendek, seperti sesi pengguna. Akibatnya, mereka tidak dapat lagi mengubah pengaturan cgroup dengan cepat, membuat perubahan permanen pada konfigurasi, atau membuat file drop-in menggunakan perintah systemctl set-property. Ya, itu memalukan, tetapi komunitas pengembangan Linux telah memutuskan demikian. Berita baiknya adalah bahwa perubahan ini tidak memengaruhi layanan. Yaitu, jika aplikasi memulai dan berhenti melalui file unit (berfungsi sebagai daemon), maka semua contoh kami berfungsi. Selain itu, tetap memungkinkan untuk membuat cgroup Anda sendiri dengan menggunakan alat kuno seperti cgcreate dan cgset, dan kemudian menempatkan sesi dan proses pengguna dalam grup ini untuk menggunakan bola CPU dan kontrol lainnya. Dalam hidup, semuanya berubah, jadi kita hanya bisa beradaptasi dan menemukan teknik baru. Dan sekarang kita beralih ke topik hari ini.

Membangun separatisme dengan isolcpus


Salah satu komponen terpenting dalam kernel Linux adalah penjadwal proses. Jika sedikit lebih dalam, maka suatu proses adalah kode yang dapat dieksekusi yang merupakan bagian dari aplikasi atau layanan. Sebenarnya, proses tersebut terdiri dari serangkaian instruksi yang dilakukan komputer, melakukan pekerjaan ini atau itu, baik melihat segel atau sesuatu yang lebih serius.

Instruksi ini ditangani oleh prosesor pusat, alias CPU. Pada komputer modern, CPU biasanya terdiri dari beberapa prosesor yang disebut core.

Secara default, penjadwal menganggap setiap inti prosesor sebagai salah satu modul eksekutif tempat ia menetapkan proses baru saat muncul. Dalam hal ini, penjadwal mencoba untuk mendistribusikan proses yang muncul antara inti secara merata, dengan mempertimbangkan beban. Sayangnya, penjadwal tidak dapat diberitahu bahwa proses khusus ini pada akhirnya akan memunculkan seluruh kelompok proses, dan grup ini perlu dieksekusi terpisah dari proses lain, dalam arti bahwa mereka seharusnya tidak memiliki inti prosesor yang sama.

Oleh karena itu, kita perlu memberi tahu perencana sehingga dia tidak menyentuh bagian inti prosesor, yaitu, tidak memberi mereka proses apa pun yang mengenai. Dan kemudian kita sendiri (atau dengan bantuan beberapa proses lain) akan secara paksa memakai proses-proses yang kita anggap perlu diisolasi dari penjadwal kernel. Ini dapat dilakukan dengan menggunakan parameter isolcpus di baris boot kernel di file konfigurasi grub. Pada contoh di bawah ini, kami memiliki mesin dengan empat kernel di mana terdapat dua file grub: satu terletak di / etc / default dan disebut grub.noiso (ini adalah cadangan konfigurasi default), dan yang kedua terletak di sana dan hanya disebut grub sehingga mengambil grub2-mkconfig. File kedua ini telah diedit untuk mengisolasi kernel 1-3 dari penjadwal proses.


PERINGATAN: pada Red Hat Enterprise Linux 7, Anda tidak perlu memodifikasi file grub.conf secara manual di folder / boot. Sebagai gantinya, buat perubahan yang diperlukan untuk / etc / default / grub dan kemudian buat kembali file grub.conf menggunakan utilitas yang sesuai, misalnya, seperti ini:


Ketika menggunakan parameter isolcpus, perlu untuk mendaftarkan core prosesor yang dirilis dipisahkan dengan koma, penomoran dimulai dari 0. Setelah sistem reboot, penjadwal proses tidak akan menggunakan core ini untuk apa pun, kecuali untuk proses level sistem tertentu yang HARUS MENJADI pada setiap core. Untuk memeriksa apakah metode kami berhasil, kami akan memulai beberapa proses pemuatan dan kemudian kami akan melihat pemuatan setiap kernel dengan menggunakan perintah teratas.


Seperti yang Anda lihat, semua proses pemuatan berada pada CPU 0, bukannya didistribusikan secara merata di keempat inti. Jadi, kami mendaftarkan parameter boot dengan benar.

Bind proses ke kernel menggunakan cpuset


Sekarang kami beralih ke hal -hal yang sebaiknya tidak dilakukan jika Anda tidak mengerti mengapa Anda melakukan ini, dan mana yang lebih baik untuk digunakan dalam produksi hanya setelah pengujian menyeluruh .

Untuk apa peringatan ini? Untuk fakta yang akan kita lakukan, secara umum, hal-hal sederhana menggunakan libcgroup toolkit, yang ditulis di posting sebelumnya. Jika Anda ingat, ini hanya seperangkat perintah untuk membuat, memodifikasi, dan menghancurkan cgroup. Sebenarnya, mereka adalah bagian dari Red Hat Enterprise Linux 6, tetapi mereka juga dapat diinstal pada Red Hat Enterprise Linux 7, meskipun ada kemungkinan bahwa kemungkinan ini akan hilang di masa depan. Ingat secara singkat rekomendasi utama untuk menggunakan libcgroup:

  1. Gunakan systemd untuk mengontrol pengontrol cgroup yang berada di bawah kendali systemd itu sendiri (ini adalah CPU, memori, dan blok I / O).
  2. Gunakan alat libcgroup untuk mengelola semua pengontrol cgroup lainnya.
  3. Berhati-hatilah dengan konsekuensi tindakan Anda yang tidak direncanakan.

Semuanya sederhana dengan konsep cpuset - ini adalah daftar inti prosesor (penomoran, penarikan kembali, dimulai pada 0), yang menerima tugas yang akan dieksekusi HANYA pada inti ini. Ini adalah inti prosesor yang paling umum, mereka dapat dikendalikan oleh penjadwal proses (ini adalah bagaimana sistem dikonfigurasi secara default), atau, sebaliknya, mereka dapat diisolasi dari penjadwal (seperti yang kami lakukan pada contoh di atas).

Mari kita periksa filesystem direktori / sys / fs / cgroup pada sistem dari contoh kita. Seperti yang Anda lihat, direktori cpuset sudah ada, karena kontroler ini adalah bagian dari kernel (walaupun tidak di bawah kendali systemd). Namun, itu belum memiliki cgroup, jadi kami hanya melihat pengaturan default di direktori ini.


Periksa apakah libcgroup toolkit diinstal pada mesin kami:


Jika tidak diinstal, maka ini dapat dengan mudah diperbaiki dengan perintah yum install libcgroup, bahkan reboot tidak diperlukan.

Sekarang buat cpuset. Untuk melakukan ini, kita akan menggunakan perintah berikut untuk membuat cgroup baru untuk cpuset dan mendaftarkan propertinya:


Perintah Cgcreate membuat cgroup yang disebut testset dan menempatkannya di dalam pengontrol cpuset. Kemudian kami menetapkan inti ketiga dari VM kami untuk cpuset baru ini dan mengalokasikan zona NUMA ke sana. Bahkan jika sistem Anda tidak menggunakan NUMA (dan kami hanya tidak menggunakannya), Anda masih perlu mendaftarkan zona, jika tidak, Anda tidak dapat menetapkan tugas ke grup cgroup . Sekarang periksa apakah direktori testset telah dibuat pada sistem file dan lihat apa yang ada di dalamnya.


Seperti yang Anda lihat, perubahan kami sudah ada, tetapi sejauh ini belum ada proses yang dijalankan pada cpuset ini. Bagaimana cara menanam beberapa proses di sini?

Ada beberapa cara untuk melakukan ini:

  • Anda bisa mengarahkan PID dari proses yang ada ke file tugas. Ini bekerja, tetapi tidak terlalu cantik.
  • Anda dapat menggunakan cgexec dan menentukan grup saat proses dimulai. Ini berfungsi jika aplikasi tersebut bukan daemon; Selain itu, semua ini dapat ditulis dengan indah dalam skrip peluncuran aplikasi.
  • Untuk aplikasi yang berjalan sebagai daemon yang menjalankan systemd, Anda dapat membuat file layanan.

Mari kita lihat opsi cgexec.


Kami meluncurkan foo.exe, pada gilirannya, meluncurkan proses anak, yang hanya melakukan itu secara aktif memuat prosesor. Opsi --sticky pada perintah cgexec mengatakan bahwa "setiap proses anak harus tetap dalam kelompok yang sama dengan proses induk." Jadi ini merupakan opsi penting, dan harus diingat. Sekarang kita melihat bahwa dua proses berputar di cgroup kami, dan kami tahu PID mereka. Lihatlah di atas:


Seperti yang Anda lihat, CPU 3 sekarang dimuat ke bola mata, dan sisanya menjadi dingin.

Dan inilah tampilan file unit untuk menjalankan aplikasi yang sama dengan layanan systemd:


Ada tiga perintah ExecStartPre di file unit yang melakukan pengaturan yang sudah berhasil kami buat dengan tangan kami. Kemudian muncul perintah ExecStart, yang meluncurkan aplikasi. Dan ketika aplikasi berhenti, perintah ExecStopPost membersihkan setelahnya sendiri, menghapus cgroup.


Seperti yang Anda lihat, pada contoh terakhir, kami membuat grup baru bernama set1. Kami melakukan ini untuk menunjukkan bahwa Anda dapat memiliki beberapa cgroup aktif yang berbagi CPU yang sama. Kepada siapa itu mungkin tampak bermanfaat, tetapi sebaliknya membingungkan seseorang.

Nah, apakah itu berhasil? Sepertinya begitu!


Dan sekarang kami akan menyelesaikan pekerjaan layanan kami dan memverifikasi bahwa cgroup dihancurkan:


PERHATIAN: grup cgroup yang dibuat menggunakan cgcreate tidak disimpan setelah reboot. Oleh karena itu, pembuatan grup tersebut harus ditentukan dalam skrip startup dan file unit.

Jadi sekarang di gudang senjata Anda ada beberapa alat lagi untuk bekerja dengan cgroup. Kami harap mereka berguna!

Posting cgroup lain dari seri Resource Fight kami tersedia di:

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


All Articles