GNU/Linux >> Belajar Linux >  >> Linux

Mengelola cgroup dengan cara yang sulit secara manual

Pada bagian pertama, saya membahas fungsi dan penggunaan cgroup untuk administrasi sistem dan penyetelan kinerja. Di bagian kedua, saya mencatat kompleksitas nilai cgroups dan CPUShares. Di bagian ketiga ini, saya fokus pada tugas administratif manual untuk cgroups.

Jangan lupa untuk membaca di bagian empat tentang cara kerja cgroup dengan systemd.

Melakukan cgroup dengan cara yang sulit

Mari kita lihat bagaimana membuat cgroup tanpa alat apapun di sekitarnya. Pada intinya, cgroups hanyalah sebuah struktur direktori dengan cgroups dipasang ke mereka. Mereka dapat ditemukan di mana saja di sistem file, tetapi Anda akan menemukan cgroup yang dibuat sistem di /sys/fs/cgroup secara default. Jadi bagaimana Anda membuat cgroup? Mulailah dengan membuat direktori tingkat atas berikut:

# mkdir -p /my_cgroups

Setelah ini dibuat, putuskan pengontrol mana yang ingin Anda gunakan. Ingat bahwa struktur untuk cgroups versi 1 terlihat seperti ini:

/my_cgroups
├── <controller type>
│   ├── <group 1>
│   ├── <group 2>
│   ├── <group 3>

[ Pembaca juga menyukai:Pengantar crun, runtime container footprint yang cepat dan memori rendah ]

Semua grup yang ingin Anda buat disarangkan secara terpisah di bawah setiap jenis pengontrol. Oleh karena itu, grup1 di bawah pengontrol memory sepenuhnya independen dari grup1 di blkio . Dengan mengingat hal itu, mari kita buat contoh CPUShares dasar.

Untuk mempermudah, saya akan membuat beban pada sistem dengan menjalankan:

# cat /dev/urandom

Ini menempatkan beberapa beban buatan pada sistem untuk memudahkan pengukuran. Ini bukan contoh beban dunia nyata, tetapi menyoroti poin utama dari CPUShares. Saya juga telah menyiapkan mesin virtual yang menjalankan CentOS 8 dengan satu vCPU untuk membuat matematika menjadi sangat sederhana. Dengan mengingat hal itu, langkah pertama adalah membuat beberapa direktori untuk pengontrol cgroup kita:

# mkdir -p /my_cgroups/{memory,cpusets,cpu}

Selanjutnya, mount cgroups ke dalam folder berikut:

# mount -t cgroup -o memory none /my_cgroups/memory
# mount -t cgroup -o cpu,cpuacct none /my_cgroups/cpu
# mount -t cgroup -o cpuset none /my_cgroups/cpusets

Untuk membuat cgroup Anda sendiri, cukup buat direktori baru di bawah pengontrol yang ingin Anda gunakan. Dalam hal ini, saya berurusan dengan file cpu.shares , yang ditemukan di cpu direktori. Jadi mari kita buat beberapa cgroup di bawah cpu pengontrol:

# mkdir -p /my_cgroups/cpu/{user1,user2,user3}

Perhatikan bahwa direktori secara otomatis diisi oleh pengontrol:

# ls -l /my_cgroup/cpu/user1/
-rw-r--r--. 1 root root 0 Sep  5 10:26 cgroup.clone_children
-rw-r--r--. 1 root root 0 Sep  5 10:26 cgroup.procs
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.stat
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_all
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu_sys
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu_user
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_sys
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_user
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Sep  5 10:20 cpu.shares
-r--r--r--. 1 root root 0 Sep  5 10:26 cpu.stat
-rw-r--r--. 1 root root 0 Sep  5 10:26 notify_on_release
-rw-r--r--. 1 root root 0 Sep  5 10:23 tasks

Sekarang saya telah menyiapkan beberapa cgroup, saatnya untuk menghasilkan beberapa beban. Untuk ini, saya cukup membuka tiga sesi SSH dan menjalankan perintah berikut di latar depan:

# cat /dev/urandom

Anda dapat melihat hasilnya di top :

CATATAN PENTING :Ingat bahwa CPUShares didasarkan pada cgroup tingkat atas, yang secara default tidak dibatasi. Ini berarti bahwa jika proses yang lebih tinggi di pohon meminta CPUShares, sistem akan memberikan prioritas proses tersebut. Ini bisa membingungkan orang. Sangat penting untuk memiliki representasi visual dari tata letak cgroup pada sistem untuk menghindari kebingungan.

Pada tangkapan layar di atas, Anda dapat melihat bahwa semua cat proses menerima jumlah waktu CPU yang kurang lebih sama. Ini karena, secara default, cgroups diberi nilai 1024 di cpu.shares . Bagian ini dibatasi oleh hubungan orang tua dengan cgroup lain, seperti yang telah dibahas sebelumnya. Dalam contoh kami, saya belum menyesuaikan bobot salah satu orang tua. Oleh karena itu, jika semua cgroup induk menuntut sumber daya secara bersamaan, bobot default 1024 CPUShares berlaku.

Kembali ke contoh kita, saya telah membuat cgroup dengan beberapa nilai default. Artinya setiap grup memiliki bobot default 1024. Untuk mengubahnya, cukup ubah nilainya di cpu.shares berkas:

# echo 2048 > user1/cpu.shares
# echo 768 > user2/cpu.shares
# echo 512 > user3/cpu.shares

Bagus sekali, sekarang saya memiliki perhitungan pembobotan yang lebih rumit, tetapi saya belum benar-benar menambahkan proses apa pun ke cgroup. Oleh karena itu, cgroup tidak aktif. Untuk menambahkan proses ke cgroup, cukup tambahkan PID yang diinginkan ke tasks berkas:

# echo 2023 > user1/tasks

Berikut adalah hasil penambahan proses ke dalam cgroup seperti terlihat pada top :

Seperti yang Anda lihat pada tangkapan layar di atas, proses di cgroup baru menerima kira-kira setengah dari waktu CPU. Ini karena persamaan dari sebelumnya:

Mari kita lanjutkan dan tambahkan dua proses lainnya ke dalam cgroup masing-masing dan amati hasilnya:

# echo 2024 > user2/tasks
# echo 2025 > user3/tasks

Sekarang kita melihat bahwa pembobotan telah diterapkan, dengan cgroup user1 menghabiskan sekitar 61% dari waktu CPU:

Waktu yang tersisa dibagi antara pengguna2 dan pengguna3 .

Tentu saja ada beberapa masalah dengan penyiapan pengujian kami.

  1. Ini semua dibuat dengan tangan. Apa yang terjadi jika proses yang Anda masukkan ke dalam cgroup mengubah PID-nya?
  2. Berkas dan folder khusus yang dibuat tidak akan bertahan dari boot ulang.
  3. Ini banyak pekerjaan manual. Dimana perkakasnya?

Jangan takut, teman-teman, systemd telah Anda lindungi.

[ Kursus online gratis:Tinjauan teknis Red Hat Enterprise Linux. ] 

Selesai

Sekarang kita lebih memahami administrasi manual cgroup, kita dapat lebih menghargai nilai cgroup dan systemd bekerja sama. Saya memeriksa gagasan itu di bagian empat seri ini. Kebetulan, bagian keempat adalah kesimpulannya.


Linux
  1. Bagaimana Menjalankan Perintah Sebagai Administrator Sistem (root)?

  2. Apakah Perintah Invers dari Cut Ada?

  3. Memahami Script rc di Linux

  1. Apa tujuan dari grup "roda" di Linux?

  2. Apa kata sandi root default untuk MySQL 5.7

  3. Bagaimana kernel me-mount partisi root?

  1. Mengelola sumber daya dengan cgroups di systemd

  2. Nonaktifkan masuk dengan akun root

  3. mengompresi cadangan dd dengan cepat