Perjuangan untuk sumber daya, bagian 3: ada sedikit memori

Kami terus mempelajari Control Groups (Cgroups) di Red Hat Enterprise Linux 7. Mari selesaikan ingatannya. Anda ingat bahwa ada dua penyesuaian alokasi waktu prosesor: CPUShares untuk mengatur pembagian relatif dan CPUQuota untuk membatasi pengguna, layanan atau mesin virtual (VM) dalam nilai absolut (persen) dari waktu prosesor. Selain itu, kedua penyesuaian ini dapat digunakan secara bersamaan. Misalnya, jika pengguna memiliki kuota CPU 50%, maka bola CPU-nya juga akan diperhitungkan sampai ia benar-benar memilih kuota pada 50% waktu prosesor.



Sedangkan untuk RAM, systemd hanya menawarkan satu cara untuk menyesuaikan, yaitu ...

Jumlah memori yang dapat dialokasikan untuk pengguna atau layanan. Misalkan kita ingin membatasi mrichter pengguna hingga 200 MB RAM. Jika Anda ingat, UID-nya adalah 1000, jadi kami memasukkan perintah berikut:

  systemctl set-property user-1000.slice MemoryLimit = 200M

Sekarang mrichter ingin memeriksa batas-batasnya dan meluncurkan stres utilitas pengujian stres, yang mulai mengkonsumsi memori secara intensif. Dan stres sangat cepat menghasilkan kesalahan:


Menurut log sistem, stres hanya terganggu oleh Pembunuh OOM (Kehabisan Memori).


Di sini penting untuk memperhatikan hal ini: secara default, batas RAM hanya berlaku untuk memori penduduk. Artinya, jika proses dapat pergi ke file swap ("swap"), maka ia akan melewati batas yang ditetapkan. Dalam contoh kami, stres terhenti karena melebihi batas pada memori penduduk.

Dan jika kita tidak ingin program bergabung menjadi swap?

Ini, secara umum, mudah dilarang. Ya, atau relatif mudah ... Secara umum, Anda harus naik ke suatu tempat.

Ada pengaturan cgroup yang tidak dapat dicapai baik melalui perintah systemctl atau melalui file unit. Namun, pengaturan ini dapat diubah dengan cepat melalui file di folder / sys / fs / cgroup /. Inilah yang, misalnya, bentuk crich pengguna mrichter terlihat dalam memori:


File yang bertanggung jawab untuk berapa banyak memori yang bisa masuk ke swap cukup jelas disebut memory.swappiness. Mari kita lihat apa yang ada di dalamnya:


Jika Anda bermain dengan pengaturan kernel dan subsistem swap, maka Anda akan segera melihat nilai standar standar untuk parameter swappiness di sini. Jika Anda mengubahnya ke nol, maka pengontrol RAM untuk pengguna mrichter biasanya melarangnya menggunakan swap.


Ngomong-ngomong, di sini Anda dapat melihat statistik memori untuk pengguna mrichter:


Nilai parameter hierarchical_memory_limit adalah MemoryLimit yang sama yang kita tentukan dengan perintah systemctl. Parameter hierarchical_memsw_limit mewakili batas total (memori penduduk dan memori dalam file file). Kami mencegah pengguna mrichter menggunakan file halaman, jadi nilai parameter ini sangat aneh.

Sekarang tentang masalah pendekatan yang baru saja dijelaskan:

  • Anda hanya dapat membuat perubahan pada file-file ini ketika pengguna miffter login ke sistem. Sampai dia masuk, grupnya akan tidak aktif.
  • Pengaturan ini tidak disimpan setelah reboot. Selain itu, mereka akan hilang jika mrichter bergerak.

Skrip pam_exec akan membantu mengatasi masalah ini (lihat access.redhat.com/solutions/46199 untuk detailnya ).

Ini adalah skrip yang akan kita buat di folder / usr / local / bin:


Dan kemudian tambahkan panggilannya ke baris terakhir dari /etc/pam.d/sshd. Akibatnya, skrip ini akan dijalankan setiap kali pengguna masuk melalui ssh. Itu sebabnya kami memverifikasi dalam skrip bahwa ini adalah mrichter pengguna, sebelum mengubah pengaturan.


Jadi, kami memotong mrichter pengguna dari file halaman.


Tentu saja, Anda dapat melangkah lebih jauh dan mengubah file konfigurasi cgroup aktif dengan cepat, tetapi untuk saat ini kami akan menunda bisnis yang berisiko ini. Namun, metode umum untuk mengubah pengaturan pengguna adalah sesuatu yang Anda tangkap.

Dan dengan layanan masih lebih mudah. Dalam file unit layanan, Anda dapat menggunakan arahan ExecStartPost = untuk menjalankan skrip yang mengubah pengaturan. Misalnya, berikut ini cara mengubah file unit layanan foo untuk mematikan swapping:


Jalankan foo - dan tanpa swap:


Nah, untuk hari ini, mungkin, perdukunan ini cukup bagi kita.

Tetapi sebelum kita selesai, mari kita membahas dokumentasi cgroup, di mana Anda dapat menemukan informasi tentang semua pengaturan regulator tersembunyi ini. Anda dapat menginstal paket kernel-doc di komputer Anda, seperti yang saya lakukan dengan mengunduhnya dari repositori rhel-7-server-rpms.


Setelah instalasi, buka folder / usr / share / docs yang sesuai dengan kernel Anda dan pergi ke folder cgroups, yang berisi informasi terbaru tentang semua regulator.


Lain kali kita akan berbicara tentang I / O. Ngomong-ngomong, kita hampir mengetahui bagaimana cgroup menyebabkan munculnya kontainer (pada kenyataannya, cgroup adalah komponen kunci dari kontainer di Red Hat Enterprise Linux dan Red Hat OpenShift Container Platform).

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


All Articles