Amazon Linux AMI 2016.09 の起動が速くなったらしいので調べてみた

Posted on

先月、Amazon Linux の最新版 Amazon Linux AMI 2016.09 がリリースされました。

Linux カーネルや各種パッケージの更新が主な内容ですが、リリースノートをよく読むと 2016.03 と比べて起動時間が 20% も速くなったと書いています。

We've made a variety of changes for this release to improve the boot performance of the Amazon Linux AMI. There is about a 20% improvement in launch time on average from 2016.03.0 to this release, 2016.09.0. We aim to continue to provide a performant instance boot experience with future Amazon Linux AMI releases.

他のディストリビューションに比べてもともとモダンな構成なのに、どうやって 20% も高速化したのか気になります。あわよくば、その高速化の仕組みを自分たちの環境にも取り入れたいと思い、2016.03 と 2016.09 の違いを調査してみました。

カーネル、init を比較

起動にもっとも影響するカーネルと init を比較します。

$ cat /etc/system-release
Amazon Linux AMI release 2016.03

$ uname -r
4.4.11-23.53.amzn1.x86_64

$ rpm -q upstart
upstart-0.6.5-13.3.13.amzn1.x86_64
$ cat /etc/system-release
Amazon Linux AMI release 2016.09

$ uname -r
4.4.19-29.55.amzn1.x86_64

$ rpm -q upstart
upstart-0.6.5-13.3.13.amzn1.x86_64

カーネルはどちらも 4.4 系でマイナーバージョンが違うだけです。 4.4 系は LTS 版なので大きな変更はないはずです。

systemd は採用されておらず、引き続き init (Upstart) が使われています。

起動時のサービス、cloud-init を比較

続いて起動時に立ち上がるサービスと cloud-init を比較します。

chkconfig --list を 2 つのサーバで実行して、その結果を diff しました。

$ diff 201603_chkconfig.log 201609_chkconfig.log
24c24
< ntpdate        0:off  1:off   2:on    3:on    4:on    5:on    6:off
---
> ntpdate        0:off  1:off   2:off   3:off   4:off   5:off   6:off

起動時に立ち上がるサービスはほぼ同じ、2016.09 は ntpdate が自動起動しないようになっていました。

Amazon Linux で起動時間に大きく影響しそうな cloud-init とそれを実行する Python も比較します(上が 2016.03、下が 2016.09)。

$ rpm -q cloud-init
cloud-init-0.7.6-2.11.amzn1.noarch

$ python --version
Python 2.7.10
$ rpm -q cloud-init
cloud-init-0.7.6-2.12.amzn1.noarch

$ python --version
Python 2.7.12

マイナーバージョンが違うだけですね。

念のため、cfg ファイルの MD5 チェックサムを取ってみましたが、一致するので違いはありません。

$ openssl dgst -md5 /etc/cloud/cloud.cfg
MD5(/etc/cloud/cloud.cfg)= 901fd08517bdcf64fe0c872d46c76a11

$ openssl dgst -md5 /etc/cloud/cloud.cfg.d/*.cfg
MD5(/etc/cloud/cloud.cfg.d/00_defaults.cfg)= 3f8d2b547c5916331da99e70a8bf4b9d
MD5(/etc/cloud/cloud.cfg.d/05_logging.cfg)= 7c3583d112814882400bbfd817cf4864
MD5(/etc/cloud/cloud.cfg.d/10_aws_yumvars.cfg)= e03445bcc098dddfe8bc56c49f3d2af1

カーネルモジュール、GRUB を比較する

ここまでで明確な違いが見られないので、違う観点でも調査してみました。

起動時に読み込まれるカーネルモジュールに変更があるか確認します。

$ openssl dgst -md5 /etc/modprobe.d/*.conf
MD5(/etc/modprobe.d/blacklist.conf)= 72fe3209d54dff708499c68f8adf3031
MD5(/etc/modprobe.d/ixgbevf.conf)= 3ac0e356477894e5c4f3fa907c4f651d

/etc/modprobe.d 以下の conf ファイルを MD5 チェックサムで比較しましたが一致します。

次に /boot/grub/grub.conf の設定を比較します(上が 2016.03、下が 2016.09)。

title Amazon Linux 2016.03 (4.4.11-23.53.amzn1.x86_64)
root (hd0,0)
kernel /boot/vmlinuz-4.4.11-23.53.amzn1.x86_64 root=LABEL=/ console=tty1 console=ttyS0
initrd /boot/initramfs-4.4.11-23.53.amzn1.x86_64.img
title Amazon Linux 2016.09 (4.4.19-29.55.amzn1.x86_64)
root (hd0,0)
kernel /boot/vmlinuz-4.4.19-29.55.amzn1.x86_64 root=LABEL=/ console=tty1 console=ttyS0 selinux=0
initrd /boot/initramfs-4.4.19-29.55.amzn1.x86_64.img

2016.09 は起動パラメータに selinux=0 が追加されています。 Amazon Linux は元から SELinux が無効になっていますが、ブートローダの時点で無効化されたようです。ただ、このオプションがそこまで高速化に寄与しているとは思えません。

上記以外にも思い当たる設定を調べたり、dmesg ログを比較してブートシーケンスに違いがあるか確認したのですが、これだと言える違いが見つかりません。

ENA ドライバの更新

行き詰ったので改めてリリースノートを読むと、カーネルとともに ENA ドライバがアップデートされたと書いています。

This release of the Amazon Linux AMI includes kernel 4.4.19, including a newly updated ENA driver 1.0.2.

EC2 インスタンス向けの次世代ネットワークインターフェイス、Elastic Network Adapter (ENA) を導入」から引用します。

ENA は、EC2 インスタンスで高スループット、高いパケット毎秒 (PPS)、安定した低レイテンシーを実現できるよう最適化されたカスタムネットワークインターフェイスです。

実際に確認してみると、確かにアップデートされています(上が 2016.03、下が 2016.09)。

$ modinfo ena
filename:       /lib/modules/4.4.11-23.53.amzn1.x86_64/kernel/drivers/amazon/net/ena/ena.ko
version:        0.6.6
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
(snip)
$ modinfo ena
filename:       /lib/modules/4.4.19-29.55.amzn1.x86_64/kernel/drivers/amazon/net/ena/ena.ko
version:        1.0.2
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
(snip)

EC2 にアタッチする EBS はネットワーク経由のストレージなので、ネットワークインターフェイスの性能が改善されて、結果的にディスク I/O が改善したというのは考えられそうです。

ENA については深く調べたわけではないので間違っているかもしれません。 ENA については別の機会に詳しく調べてみます。

まとめ

はっきりとした要因はつかめませんでしたが、調査したおかげで新たな知見を得られました。疑問に思ったことは手を動かして調査してみることが大事ですね。