本日も乙

ただの自己満足な備忘録。

Windows EC2インスタンスをXenベースからKVMベース(M5/C5)へ変更した & メモリリーク問題への対処

昨年にKVMベースの新しいインスタンスタイプが発表されたことは記憶に新しいと思います。

www.publickey1.jp

2018年9月現在、C5及びM5インスタンスが東京リージョンに来ており、従来のC4, M5インスタンスと比較してコストパフォーマンスに優れているため、使わない手はありません。
しかし、ハイパーバイザがXenからKVMに変わっているため、変更する場合には一手間加える必要があります。本記事はWindows ServerにおいてKVMベースのEC2インスタンスへの変更方法及び変更後に発生した問題(メモリリーク)への対処方法について紹介します。

変更可能なWindows Server

  • 2012 R2, 2016 R2は対応している
  • 2008 R2は最近のAMI(2017.12)でないと変更できない(起動しても接続できない)。sysprepすれば有効化できるらしい

ENA 拡張ネットワーキングの有効化

以下の手順で、Elastic Network Adapter (ENA) を有効にする必要があります。

  1. 管理者(Administrator) でWindows Serverにログオン
  2. ここ から最新のENAネットワークドライバをダウンロードし、ZIP解凍
  3. PowerShellスクリプト(install.ps1) を実行し、ドライバをインストール
  4. マネジメントコンソール等からWindows Serverを停止
  5. 以下のコマンドで有効化
$ aws ec2 modify-instance-attribute --instance-id i-xxxxxx --ena-support

6 有効になっているかを確認

$ aws ec2 describe-instances --instance-ids i-xxxxx --query "Reservations[].Instances[].EnaSupport"

# 有効になっている場合
[
    true
]

# 有効になっていない場合
[]

7 Windows Serverを起動

ENAネットワークドライバのインストール(手順1〜3)について、以下のPowerShellでも実行可能です。

Initialize-AWSDefaults -Region ap-northeast-1
import-module "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1"

# Refer to http://qiita.com/kmr_hryk/items/5dfe87c0035887cbd8e4
function psunzip {
   $Expcom = New-Object -ComObject Shell.Application
   $zipFile = $Expcom.NameSpace($args[0])
   $tgtDir = $Expcom.NameSpace($args[1])
   $zipFile.Items() | ForEach-Object {
      $tgtDir.CopyHere($_.path)
   }
}

$driver_download_url = "https://s3.amazonaws.com/ec2-windows-drivers-downloads/ENA/Latest/AwsEnaNetworkDriver.zip"
$download_dir = "TempEnaNetworkDriver"
$driver_file = "AwsEnaNetworkDriver"

New-Item "C:\$download_dir" -Type Directory

Invoke-WebRequest $driver_download_url -OutFile "C:\${download_dir}\${driver_file}.zip"

$chk = Get-Command | Select-Object Name | Select-String 'Expand-Archive'
if ([String]::IsNullOrEmpty($chk) -eq $False) {
  Expand-Archive -Path "C:\${download_dir}\${driver_file}.zip" -DestinationPath "C:\${download_dir}\${driver_file}"
}
else {
  psunzip "C:\${download_dir}\${driver_file}.zip" "C:\${download_dir}"
}

cd "C:\${download_dir}\${driver_file}"

Set-ExecutionPolicy Unrestricted -Force
powershell ".\install.ps1"

メモリリーク問題

変更した後メモリが増え続ける問題が発生しました。
下図は m4.large から m5.large に変更した Windows Server 2012 R2 のメモリ使用量を表したものであり、変更後に明らかに使用量が増加していることがわかります。

kvm-based-ec2-instance1

タスクマネージャを見ると、XenSource Windows guest agentがメモリを食っていることがわかりました。

kvm-based-ec2-instance2

原因

Paravirtual (PV)ドライバのバージョンが古いことが原因でした。
AWSサポートに問い合わせた結果、PVドライバが 7.x には不具合があるとのことです。PVドライバを8.xにアップデートすることで対処できます。

kvm-based-ec2-instance3

PVドライバのアップデート

ここから最新のPVドライバをダウンロードし解凍します。AWSPVDriverSetup.msi を実行することで最新のPVドライバがインストールされます。インストール後は自動的に再起動されるので予めバッチ停止やELBから切り離しておきましょう。

再起動後はレジストラからPVドライバのバージョンが確認できます。8.2以上になっていれば完了です。

kvm-based-ec2-instance4

参考