

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
<a name="resource-limiting-systemd"></a>

 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 seperti[`cpulimit`](epel.md#cpulimit), yang sebelumnya hanya tersedia untuk Amazon Linux di [EPEL](epel.md) repositori pihak ketiga. 

 Untuk informasi lengkap, lihat `systemd` dokumentasi upstream untuk [systemd.resource-control](https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html), atau man halaman untuk `systemd.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
<a name="resource-limiting-systemd-interactive"></a>

 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. 

**Example Gunakan `systemd-run` pada baris perintah untuk menjalankan proses, tidak membatasi penggunaan sumber daya**  

1.  Pastikan `stress-ng` paket diinstal, karena kita akan menggunakannya untuk contoh kita. 

   ```
   [ec2-user ~]$ sudo dnf install -y {{stress-ng}}
   ```

1.  Gunakan `systemd-run` untuk menjalankan test stress CPU 10 detik tanpa membatasi berapa banyak CPU yang dapat digunakan. 

   ```
   [ec2-user ~]$ systemd-run --user --tty --wait --property=CPUAccounting=1 {{stress-ng --cpu 1 --timeout 10}}
   Running 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
   ```

    `--user`Opsi memberitahu `systemd-run` untuk menjalankan perintah sebagai pengguna yang kita login sebagai, `--tty` opsi berarti a TTY terpasang, `--wait` berarti menunggu sampai layanan selesai, dan `--property=CPUAccounting=1` opsi menginstruksikan `systemd-run` untuk mencatat berapa banyak waktu CPU yang digunakan menjalankan proses. Opsi baris `--property` perintah dapat digunakan untuk meneruskan `systemd-run` pengaturan yang dapat dikonfigurasi dalam file `systemd.unit` konfigurasi. 

 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` 

**Example Gunakan `systemd-run` pada baris perintah untuk menjalankan proses, membatasi penggunaan CPU hingga 1 detik**  

1. Pastikan `stress-ng` diinstal untuk menjalankan contoh ini.

1.  `LimitCPU`Properti setara dengan `ulimit -t` yang 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 menerima `SIGXCPU` sinyal dan gagal. 

   ```
   [ec2-user ~]$ systemd-run --user --tty --wait --property=CPUAccounting=1 --property=LimitCPU=1 {{stress-ng --cpu 1 --timeout 10}}
   Running 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 oleh`stress-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. 

**Example Gunakan `systemd-run` untuk membatasi proses hingga 10% dari waktu CPU pada satu CPU**  

1. Pastikan `stress-ng` diinstal untuk menjalankan contoh ini.

1.  Kita akan menggunakan `CPUQuota` properti untuk memberitahu `systemd-run` untuk 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 10}}
   Running 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.014s
   ```

    Perhatikan 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-control](https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html), atau man halaman untuk `systemd.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-v2`](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html) berisi rincian ekstensif tentang `cgroups` pekerjaan. 

## Kontrol sumber daya dalam suatu `systemd` layanan
<a name="resource-limiting-systemd-service"></a>

 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-control](https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html), atau man halaman untuk `systemd.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. 

**Example Menggunakan `systemd` untuk mengatur batas penggunaan memori pada layanan**  
 Dalam contoh ini kita akan menetapkan batas penggunaan memori keras untuk`memcached`, cache nilai kunci sederhana, dan menunjukkan bagaimana Pembunuh OOM dipanggil untuk layanan itu daripada seluruh sistem.   

1.  Pertama, kita perlu menginstal paket yang diperlukan untuk contoh ini. 

   ```
   [ec2-user ~]$ sudo dnf install -y {{memcached libmemcached-awesome-tools}}
   ```

1.  Aktifkan `memcached.service` dan kemudian mulai layanan sehingga `memcached` berjalan. 

   ```
   [ec2-user ~]$ sudo systemctl enable {{memcached.service}}
   Created symlink /etc/systemd/system/multi-user.target.wants/memcached.service → /usr/lib/systemd/system/memcached.service.
   [ec2-user ~]$ sudo systemctl start {{memcached.service}}
   ```

1.  Periksa apakah `memcached.service` sedang berjalan. 

   ```
   [ec2-user ~]$ sudo systemctl status {{memcached.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.
   ```

1.  Sekarang `memcached` yang diinstal dan berjalan, kita dapat mengamati bahwa itu berfungsi dengan memasukkan beberapa data acak ke dalam cache 

    Dalam `/etc/sysconfig/memcached` `CACHESIZE` variabel 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 menggunakan`memcached-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 status {{memcached.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.
   ```

1.  Gunakan `MemoryMax` properti untuk menetapkan batas keras untuk di `memcached.service` mana, 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.conf` file secara langsung, atau secara interaktif menggunakan `edit` perintah. `systemctl` 

   ```
   [ec2-user ~]$ sudo systemctl edit {{memcached.service}}
   ```

   Tambahkan di bawah ini ke override untuk menetapkan batas keras 32MB memori untuk layanan.

   ```
   [Service]
   MemoryMax=32M
   ```

1. Katakan `systemd` untuk memuat ulang konfigurasinya

   ```
   [ec2-user ~]$ sudo systemctl daemon-reload
   ```

1. Perhatikan bahwa `memcached.service` sekarang berjalan dengan batas memori 32MB.

   ```
   [ec2-user ~]$ sudo systemctl status {{memcached.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.
   ```

1.  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 status {{memcached.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.
   ```

1.  Kita sekarang dapat `memcached` menggunakan lebih dari 32MB memori dengan mencoba menggunakan 64MB cache penuh yang konfigurasi `memcached` defaultnya. 

   ```
   [ec2-user ~]$ for i in $(seq 1 150); do dd if=/dev/random of=$i bs=512k count=1; memcp -s localhost $i; done
   ```

    Anda akan mengamati bahwa pada titik tertentu selama perintah di atas ada kesalahan koneksi ke `memcached` server. 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 hanya `memcached.service` yang telah kami batasi. 

   ```
   [ec2-user ~]$ sudo systemctl status {{memcached.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'.
   ```