

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 避免 OOM 錯誤
<a name="windows-oom"></a>

Windows 沒有與 Linux out-of-memory程序刪除程式。Windows 一律會將所有使用者模式記憶體配置視為虛擬，且 pagefile 是強制性的。淨效果是 Windows 不會像 Linux 那樣脫離記憶體條件。程序將分頁到磁碟，而不是因記憶體不足 (OOM) 而終止。如果記憶體過度佈建且所有實體記憶體耗盡，分頁可能會降低效能。

## 保留系統和 kubelet 記憶體
<a name="_reserving_system_and_kubelet_memory"></a>

與 Linux 不同，Linux 會`--kubelet-reserve`**擷取** kubelet、容器執行時間等 kubernetes 系統常駐程式的資源保留，以及`--system-reserve`**擷取** sshd、udev 等作業系統常駐程式的資源保留。在 **Windows** 上，這些旗標不會**擷取**和**設定**在節點****上執行的 **kubelet** 或程序的記憶體限制。

不過，您可以結合這些旗標來管理 **NodeAllocatable**，以使用 Pod 資訊清單**記憶體資源限制**來減少節點上的容量，以控制每個 Pod 的記憶體配置。使用此策略，您可以更好地控制記憶體配置，以及將 Windows 節點上的out-of-memory(OOM) 降至最低的機制。

在 Windows 節點上，最佳實務是為作業系統和程序保留至少 2GB 的記憶體。使用 `--kubelet-reserve`和/或 `--system-reserve` 減少 NodeAllocatable。

遵循 [Amazon EKS 自我管理 Windows 節點](https://docs.aws.amazon.com/eks/latest/userguide/launch-windows-workers.html)文件，使用 CloudFormation 範本啟動具有 kubelet 組態自訂功能的新 Windows 節點群組。CloudFormation 有一個名為 的元素`BootstrapArguments`，與 相同`KubeletExtraArgs`。搭配下列旗標和值使用：

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

如果 eksctl 是部署工具，請檢查下列文件以自訂 kubelet 組態 https：//https://eksctl.io/usage/customizing-the-kubelet/

## Windows 容器記憶體需求
<a name="_windows_container_memory_requirements"></a>

根據 [Microsoft 文件](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/system-requirements)，NANO 的 Windows Server 基礎映像至少需要 30MB，而 Server Core 則需要 45MB。這些數字會隨著您新增 Windows 元件而增加，例如 .NET Framework、Web Services as IIS 和應用程式。

您必須了解 Windows 容器映像所需的最低記憶體量，即基礎映像及其應用程式層，並將其設定為 Pod 規格中的容器資源/請求。您也應該設定限制，以避免 Pod 在應用程式發生問題時消耗所有可用的節點記憶體。

在下面的範例中，當 Kubernetes 排程器嘗試將 Pod 放置在節點上時，會使用 Pod 的請求來判斷哪個節點有足夠的資源可供排程。

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

## 結論
<a name="_conclusion"></a>

使用此方法可將記憶體耗盡的風險降至最低，但無法防止發生這種情況。使用 Amazon CloudWatch 指標，您可以在記憶體耗盡時設定提醒和修復。