Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Membatasi penggunaan sumber daya proses di AL2 023 menggunakan systemd
Di Amazon Linux 2023 (AL2023), kami merekomendasikan penggunaan systemd untuk mengontrol sumber daya apa yang dapat digunakan oleh proses, atau kelompok proses. Menggunakan systemd adalah pengganti yang kuat dan mudah digunakan untuk memanipulasi cgroups secara manual, atau menggunakan utilitas seperticpulimit, yang sebelumnya hanya tersedia untuk Amazon Linux di EPEL repositori pihak ketiga.
Untuk informasi lengkap, lihat systemd dokumentasi upstream untuk systemd.resource-controlsystemd.resource-control pada contoh AL2 023.
Contoh di bawah ini akan menggunakan stress test stress-ng CPU (dari stress-ng paket) untuk mensimulasikan aplikasi CPU yang berat, dan memcached untuk mensimulasikan aplikasi memori yang berat.
Contoh di bawah ini mencakup menempatkan batas CPU pada perintah satu kali dan batas memori pada layanan. Sebagian besar kendala sumber daya yang systemd ditawarkan dapat digunakan di tempat mana pun yang systemd akan menjalankan proses, dan beberapa dapat digunakan pada saat yang bersamaan. Contoh di bawah ini terbatas pada satu kendala untuk tujuan ilusi.
Kontrol sumber daya dengan systemd-run untuk menjalankan perintah satu kali
Meskipun umumnya dikaitkan dengan layanan sistem, juga systemd dapat digunakan oleh pengguna non-root untuk menjalankan layanan, menjadwalkan timer, atau menjalankan proses satu kali. Dalam contoh berikut, kita akan menggunakan stress-ng sebagai contoh aplikasi kita. Pada contoh pertama, kita akan menjalankannya menggunakan systemd-run di akun ec2-user default, dan pada contoh kedua kita akan membatasi penggunaan CPU-nya.
contoh Gunakan systemd-run pada baris perintah untuk menjalankan proses, tidak membatasi penggunaan sumber daya
-
Pastikan
stress-ngpaket diinstal, karena kita akan menggunakannya untuk contoh kita.[ec2-user ~]$sudo dnf install -ystress-ng -
Gunakan
systemd-rununtuk menjalankan test stress CPU 10 detik tanpa membatasi berapa banyak CPU yang dapat digunakan.[ec2-user ~]$systemd-run --user --tty --wait --property=CPUAccounting=1stress-ng --cpu 1 --timeout 10Running as unit: run-u6.service Press ^] three times within 1s to disconnect TTY. stress-ng: info: [339368] setting to a 10 second run per stressor stress-ng: info: [339368] dispatching hogs: 1 cpu stress-ng: info: [339368] successful run completed in 10.00s Finished with result: success Main processes terminated with: code=exited/status=0 Service runtime: 10.068s CPU time consumed: 9.060s--userOpsi memberitahusystemd-rununtuk menjalankan perintah sebagai pengguna yang kita login sebagai,--ttyopsi berarti a TTY terpasang,--waitberarti menunggu sampai layanan selesai, dan--property=CPUAccounting=1opsi menginstruksikansystemd-rununtuk mencatat berapa banyak waktu CPU yang digunakan menjalankan proses. Opsi baris--propertyperintah dapat digunakan untuk meneruskansystemd-runpengaturan yang dapat dikonfigurasi dalam filesystemd.unitkonfigurasi.
Ketika diinstruksikan untuk menempatkan beban pada CPU, stress-ng program akan menggunakan semua waktu CPU yang tersedia untuk melakukan pengujian selama Anda memintanya untuk dijalankan. Untuk aplikasi dunia nyata, mungkin diinginkan untuk membatasi total run-time suatu proses. Dalam contoh di bawah ini, kami akan meminta stress-ng untuk menjalankan untuk waktu yang lebih lama daripada batasan durasi maksimum yang kami tempatkan di atasnya. systemd-run
contoh Gunakan systemd-run pada baris perintah untuk menjalankan proses, membatasi penggunaan CPU hingga 1 detik
-
Pastikan
stress-ngdiinstal untuk menjalankan contoh ini. -
LimitCPUProperti setara denganulimit -tyang akan membatasi jumlah waktu maksimum pada CPU proses ini akan diizinkan untuk digunakan. Dalam hal ini, karena kami meminta stress run 10 detik, dan kami membatasi penggunaan CPU hingga 1 detik, perintah akan menerimaSIGXCPUsinyal dan gagal.[ec2-user ~]$systemd-run --user --tty --wait --property=CPUAccounting=1 --property=LimitCPU=1stress-ng --cpu 1 --timeout 10Running as unit: run-u12.service Press ^] three times within 1s to disconnect TTY. stress-ng: info: [340349] setting to a 10 second run per stressor stress-ng: info: [340349] dispatching hogs: 1 cpu stress-ng: fail: [340349] cpu instance 0 corrupted bogo-ops counter, 1370 vs 0 stress-ng: fail: [340349] cpu instance 0 hash error in bogo-ops counter and run flag, 3250129726 vs 0 stress-ng: fail: [340349] metrics-check: stressor metrics corrupted, data is compromised stress-ng: info: [340349] unsuccessful run completed in 1.14s Finished with result: exit-code Main processes terminated with: code=exited/status=2 Service runtime: 1.201s CPU time consumed: 1.008s
Lebih umum, Anda mungkin ingin membatasi persentase waktu CPU yang dapat dikonsumsi oleh proses tertentu. Pada contoh di bawah ini, kami akan membatasi persentase waktu CPU yang dapat dikonsumsi olehstress-ng. Untuk layanan dunia nyata, mungkin diinginkan untuk membatasi persentase maksimum waktu CPU yang dapat dikonsumsi oleh proses latar belakang untuk membiarkan sumber daya gratis untuk proses yang melayani permintaan pengguna.
contoh Gunakan systemd-run untuk membatasi proses hingga 10% dari waktu CPU pada satu CPU
-
Pastikan
stress-ngdiinstal untuk menjalankan contoh ini. -
Kita akan menggunakan
CPUQuotaproperti untuk memberitahusystemd-rununtuk membatasi penggunaan CPU untuk perintah yang akan kita jalankan. Kami tidak membatasi jumlah waktu proses dapat berjalan, berapa banyak CPU yang dapat digunakan.[ec2-user ~]$systemd-run --user --tty --wait --property=CPUAccounting=1 --property=CPUQuota=10%stress-ng --cpu 1 --timeout 10Running as unit: run-u13.service Press ^] three times within 1s to disconnect TTY. stress-ng: info: [340664] setting to a 10 second run per stressor stress-ng: info: [340664] dispatching hogs: 1 cpu stress-ng: info: [340664] successful run completed in 10.08s Finished with result: success Main processes terminated with: code=exited/status=0 Service runtime: 10.140s CPU time consumed: 1.014sPerhatikan bagaimana CPU akuntansi memberi tahu kita bahwa sementara layanan berjalan selama 10 detik, itu hanya menghabiskan 1 detik waktu CPU yang sebenarnya.
Ada banyak cara untuk mengkonfigurasi systemd untuk membatasi penggunaan sumber daya untuk CPU, memori, jaringan, dan IO. Lihat systemd dokumentasi upstream untuk systemd.resource-controlsystemd.resource-control pada contoh AL2 023 untuk dokumentasi komprehensif.
Di belakang layar, systemd menggunakan fitur kernel Linux seperti cgroups untuk menerapkan batas-batas ini sambil menghindari kebutuhan bagi Anda untuk mengkonfigurasinya dengan tangan. Dokumentasi Kernel Linux untuk cgroup-v2cgroups pekerjaan.
Kontrol sumber daya dalam suatu systemd layanan
Ada beberapa parameter yang dapat ditambahkan ke [Service] bagian systemd layanan untuk mengontrol penggunaan sumber daya sistem. Ini termasuk batas keras dan lunak. Untuk perilaku yang tepat dari setiap opsi, lihat systemd dokumentasi upstream untuk systemd.resource-controlsystemd.resource-control pada contoh AL2 023.
Batas yang umum digunakan adalah MemoryHigh untuk menentukan batas pelambatan pada penggunaan memori, MemoryMax untuk menetapkan batas atas keras (yang, setelah tercapai, Pembunuh OOM dipanggil), dan CPUQuota (seperti yang diilustrasikan di bagian sebelumnya). Dimungkinkan juga untuk mengonfigurasi bobot dan prioritas daripada angka tetap.
contoh Menggunakan systemd untuk mengatur batas penggunaan memori pada layanan
Dalam contoh ini kita akan menetapkan batas penggunaan memori keras untukmemcached, cache nilai kunci sederhana, dan menunjukkan bagaimana Pembunuh OOM dipanggil untuk layanan itu daripada seluruh sistem.
-
Pertama, kita perlu menginstal paket yang diperlukan untuk contoh ini.
[ec2-user ~]$sudo dnf install -ymemcached libmemcached-awesome-tools -
Aktifkan
memcached.servicedan kemudian mulai layanan sehinggamemcachedberjalan.[ec2-user ~]$sudo systemctl enablememcached.serviceCreated symlink /etc/systemd/system/multi-user.target.wants/memcached.service → /usr/lib/systemd/system/memcached.service.[ec2-user ~]$sudo systemctl startmemcached.service -
Periksa apakah
memcached.servicesedang berjalan.[ec2-user ~]$sudo systemctl statusmemcached.service● memcached.service - memcached daemon Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; preset: disabled) Active: active (running) since Fri 2025-01-31 22:36:42 UTC; 1s ago Main PID: 356294 (memcached) Tasks: 10 (limit: 18907) Memory: 1.8M CPU: 20ms CGroup: /system.slice/memcached.service └─356294 /usr/bin/memcached -p 11211 -u memcached -m 64 -c 1024 -l 127.0.0.1,::1 Jan 31 22:35:36 ip-1-2-3-4.us-west-2.compute.internal systemd[1]: Started memcached.service - memcached daemon. -
Sekarang
memcachedyang diinstal dan berjalan, kita dapat mengamati bahwa itu berfungsi dengan memasukkan beberapa data acak ke dalam cacheDalam
/etc/sysconfig/memcachedCACHESIZEvariabel diatur ke 64 secara default, yang berarti 64 megabyte. Dengan memasukkan lebih banyak data ke dalam cache daripada ukuran cache maksimum, kita dapat melihat bahwa kita mengisi cache dan beberapa item diusir menggunakanmemcached-tool, dan bahwa menggunakan sekitar 64MB memori.memcached.service[ec2-user ~]$for i in $(seq 1 150); do dd if=/dev/random of=$i bs=512k count=1; memcp -s localhost $i; done[ec2-user ~]$memcached-tool localhost display# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM 2 120B 0s 1 0 no 0 0 0 39 512.0K 4s 63 126 yes 24 2 0[ec2-user ~]$sudo systemctl statusmemcached.service● memcached.service - memcached daemon Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; preset: disabled) Active: active (running) since Fri 2025-01-31 22:36:42 UTC; 7min ago Main PID: 356294 (memcached) Tasks: 10 (limit: 18907) Memory: 66.7M CPU: 203ms CGroup: /system.slice/memcached.service └─356294 /usr/bin/memcached -p 11211 -u memcached -m 64 -c 1024 -l 127.0.0.1,::1 Jan 31 22:36:42 ip-1-2-3-4.us-west-2.compute.internal systemd[1]: Started memcached.service - memcached daemon. -
Gunakan
MemoryMaxproperti untuk menetapkan batas keras untuk dimemcached.servicemana, jika terkena, Pembunuh OOM akan dipanggil. Opsi tambahan dapat diatur untuk layanan dengan menambahkannya ke file override. Ini dapat dilakukan baik dengan mengedit/etc/systemd/system/memcached.service.d/override.conffile secara langsung, atau secara interaktif menggunakaneditperintah.systemctl[ec2-user ~]$sudo systemctl editmemcached.serviceTambahkan di bawah ini ke override untuk menetapkan batas keras 32MB memori untuk layanan.
[Service] MemoryMax=32M -
Katakan
systemduntuk memuat ulang konfigurasinya[ec2-user ~]$sudo systemctl daemon-reload -
Perhatikan bahwa
memcached.servicesekarang berjalan dengan batas memori 32MB.[ec2-user ~]$sudo systemctl statusmemcached.service● memcached.service - memcached daemon Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; preset: disabled) Drop-In: /etc/systemd/system/memcached.service.d └─override.conf Active: active (running) since Fri 2025-01-31 23:09:13 UTC; 49s ago Main PID: 358423 (memcached) Tasks: 10 (limit: 18907) Memory: 1.8M (max: 32.0M available: 30.1M) CPU: 25ms CGroup: /system.slice/memcached.service └─358423 /usr/bin/memcached -p 11211 -u memcached -m 64 -c 1024 -l 127.0.0.1,::1 Jan 31 23:09:13 ip-1-2-3-4.us-west-2.compute.internal systemd[1]: Started memcached.service - memcached daemon. -
Layanan akan berfungsi normal saat menggunakan memori kurang dari 32MB, yang dapat kita periksa dengan memuat kurang dari 32MB data acak ke dalam cache, dan kemudian memeriksa status layanan.
[ec2-user ~]$for i in $(seq 1 30); do dd if=/dev/random of=$i bs=512k count=1; memcp -s localhost $i; done[ec2-user ~]$sudo systemctl statusmemcached.service● memcached.service - memcached daemon Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; preset: disabled) Drop-In: /etc/systemd/system/memcached.service.d └─override.conf Active: active (running) since Fri 2025-01-31 23:14:48 UTC; 3s ago Main PID: 359492 (memcached) Tasks: 10 (limit: 18907) Memory: 18.2M (max: 32.0M available: 13.7M) CPU: 42ms CGroup: /system.slice/memcached.service └─359492 /usr/bin/memcached -p 11211 -u memcached -m 64 -c 1024 -l 127.0.0.1,::1 Jan 31 23:14:48 ip-1-2-3-4.us-west-2.compute.internal systemd[1]: Started memcached.service - memcached daemon. -
Kita sekarang dapat
memcachedmenggunakan lebih dari 32MB memori dengan mencoba menggunakan 64MB cache penuh yang konfigurasimemcacheddefaultnya.[ec2-user ~]$for i in $(seq 1 150); do dd if=/dev/random of=$i bs=512k count=1; memcp -s localhost $i; doneAnda akan mengamati bahwa pada titik tertentu selama perintah di atas ada kesalahan koneksi ke
memcachedserver. Ini karena Pembunuh OOM telah mematikan proses karena pembatasan yang kami tempatkan di atasnya. Sisa sistem akan berfungsi seperti biasa, dan tidak ada proses lain yang akan dipertimbangkan oleh Pembunuh OOM, karena hanyamemcached.serviceyang telah kami batasi.[ec2-user ~]$sudo systemctl statusmemcached.service● memcached.service - memcached daemon Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; preset: disabled) Drop-In: /etc/systemd/system/memcached.service.d └─override.conf Active: failed (Result: oom-kill) since Fri 2025-01-31 23:20:28 UTC; 2s ago Duration: 2.901s Process: 360130 ExecStart=/usr/bin/memcached -p ${PORT} -u ${USER} -m ${CACHESIZE} -c ${MAXCONN} $OPTIONS (code=killed, signal=KILL) Main PID: 360130 (code=killed, signal=KILL) CPU: 94ms Jan 31 23:20:25 ip-1-2-3-4.us-west-2.compute.internal systemd[1]: Started memcached.service - memcached daemon. Jan 31 23:20:28 ip-1-2-3-4.us-west-2.compute.internal systemd[1]: memcached.service: A process of this unit has been killed by the OOM killer. Jan 31 23:20:28 ip-1-2-3-4.us-west-2.compute.internal systemd[1]: memcached.service: Main process exited, code=killed, status=9/KILL Jan 31 23:20:28 ip-1-2-3-4.us-west-2.compute.internal systemd[1]: memcached.service: Failed with result 'oom-kill'.