

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menghindari kesalahan OOM
<a name="windows-oom"></a>

Windows tidak memiliki pembunuh proses kehabisan memori seperti Linux. Windows selalu memperlakukan semua alokasi memori mode pengguna sebagai virtual, dan file halaman wajib. Efek bersihnya adalah bahwa Windows tidak akan menjangkau kondisi memori dengan cara yang sama seperti Linux. Proses akan halaman ke disk alih-alih tunduk pada penghentian out of memory (OOM). Jika memori terlalu banyak disediakan dan semua memori fisik habis, maka paging dapat memperlambat kinerja.

## Sistem reservasi dan memori kubelet
<a name="_reserving_system_and_kubelet_memory"></a>

Berbeda dari Linux di mana `--kubelet-reserve` **menangkap** reservasi sumber daya untuk daemon sistem kubernetes seperti kubelet, runtime container, dll; dan `--system-reserve` **menangkap** reservasi sumber daya untuk daemon sistem OS seperti sshd, udev, dll. Pada **Windows** flag ini tidak **menangkap** dan **menetapkan** batas memori pada **kubelet** atau **proses** yang berjalan pada node.

Namun, Anda dapat menggabungkan flag ini **NodeAllocatable**untuk mengelola pengurangan Kapasitas pada node dengan **batas sumber daya memori** manifes Pod untuk mengontrol alokasi memori per pod. Dengan menggunakan strategi ini, Anda memiliki kontrol alokasi memori yang lebih baik serta mekanisme untuk meminimalkan out-of-memory (OOM) pada node Windows.

Pada node Windows, praktik terbaik adalah memesan setidaknya 2GB memori untuk OS dan proses. Gunakan `--kubelet-reserve` and/or `--system-reserve` untuk mengurangi NodeAllocatable.

Mengikuti dokumentasi [node Amazon EKS Self-managed Windows](https://docs.aws.amazon.com/eks/latest/userguide/launch-windows-workers.html), gunakan CloudFormation template untuk meluncurkan grup node Windows baru dengan penyesuaian ke konfigurasi kubelet. CloudFormation Memiliki elemen `BootstrapArguments` yang disebut yang sama dengan`KubeletExtraArgs`. Gunakan dengan tanda dan nilai berikut:

```
--kube-reserved memory=0.5Gi,ephemeral-storage=1Gi --system-reserved memory=1.5Gi,ephemeral-storage=1Gi --eviction-hard memory.available<200Mi,nodefs.available<10%"
```

Jika eksctl adalah alat deployment, periksa dokumentasi berikut untuk menyesuaikan konfigurasi kubelet https://eksctl.io/usage/customizing-the-kubelet/

## Persyaratan memori wadah Windows
<a name="_windows_container_memory_requirements"></a>

Sesuai [dokumentasi Microsoft](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/system-requirements), image dasar Windows Server untuk NANO membutuhkan setidaknya 30MB, sedangkan Server Core membutuhkan 45MB. Angka-angka ini bertambah saat Anda menambahkan komponen Windows seperti .NET Framework, Layanan Web sebagai IIS dan aplikasi.

Penting bagi Anda untuk mengetahui jumlah minimum memori yang diperlukan oleh image container Windows Anda, yaitu image dasar ditambah lapisan aplikasinya, dan mengaturnya sebagai container resources/requests dalam spesifikasi pod. Anda juga harus menetapkan batas untuk menghindari pod mengkonsumsi semua memori node yang tersedia jika terjadi masalah aplikasi.

Pada contoh di bawah ini, ketika penjadwal Kubernetes mencoba menempatkan sebuah pod pada sebuah node, permintaan pod digunakan untuk menentukan node mana yang memiliki sumber daya yang cukup untuk penjadwalan.

```
 spec:
  - name: iis
    image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
    resources:
      limits:
        cpu: 1
        memory: 800Mi
      requests:
        cpu: .1
        memory: 128Mi
```

## Kesimpulan
<a name="_conclusion"></a>

Menggunakan pendekatan ini meminimalkan risiko kelelahan memori tetapi tidak mencegahnya terjadi. Menggunakan Amazon CloudWatch Metrics, Anda dapat mengatur peringatan dan remediasi jika terjadi kelelahan memori.