CentOS 6.x 仮想サーバーのカスタム化

SoftLayer の CentOS 7.x と CentOS 6.x では、仮想サーバーの環境設定が異なっており、それに伴って、大幅にベンチマークの結果が変わってしまいます。 そこで、CentOS 6.x のカスタムOSを作成して CentOS 7.x の仮想サーバーに上書きインストールして、性能や関連作業について確認した結果の記録です。

# CentOS 6 の Unixbench の結果が悪い理由

SoftLayer の CentOS 6 を Unixbench で性能評価すると、以下の結果の様に、結果は思わしくありません。 

```lang:CentOS6
========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: centos6.takara.org: GNU/Linux
   OS: GNU/Linux -- 2.6.32-504.23.4.el6.x86_64 -- #1 SMP Tue Jun 9 20:57:37 UTC 2015
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz (4000.1 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   04:42:22 up 12 min,  1 user,  load average: 0.18, 0.30, 0.16; runlevel 3

------------------------------------------------------------------------
Benchmark Run: 月  8月 17 2015 04:42:22 - 05:10:14
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       23617050.2 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     2511.5 MWIPS (9.9 s, 7 samples)
Execl Throughput                               1335.5 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        251160.8 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           65406.4 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        876849.4 KBps  (30.0 s, 2 samples)
Pipe Throughput                              364987.0 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  64080.7 lps   (10.0 s, 7 samples)
Process Creation                               2630.6 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   2140.9 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    288.9 lpm   (60.1 s, 2 samples)
System Call Overhead                         312263.9 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   23617050.2   2023.7
Double-Precision Whetstone                       55.0       2511.5    456.6
Execl Throughput                                 43.0       1335.5    310.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     251160.8    634.2
File Copy 256 bufsize 500 maxblocks            1655.0      65406.4    395.2
File Copy 4096 bufsize 8000 maxblocks          5800.0     876849.4   1511.8
Pipe Throughput                               12440.0     364987.0    293.4
Pipe-based Context Switching                   4000.0      64080.7    160.2
Process Creation                                126.0       2630.6    208.8
Shell Scripts (1 concurrent)                     42.4       2140.9    504.9
Shell Scripts (8 concurrent)                      6.0        288.9    481.5
System Call Overhead                          15000.0     312263.9    208.2
                                                                   ========
System Benchmarks Index Score                                         440.9

```

一方、同じ SoftLayer の CentOS 7 では次の様に、３倍近く良好なベンチマーク値を得ました。


```lang:CentOS7
========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: centos7: GNU/Linux
   OS: GNU/Linux -- 3.10.0-229.7.2.el7.x86_64 -- #1 SMP Tue Jun 23 22:06:11 UTC 2015
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz (4000.1 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   05:03:12 up 29 min,  1 user,  load average: 0.73, 0.32, 0.15; runlevel 3

------------------------------------------------------------------------
Benchmark Run: 月  8月 17 2015 05:03:12 - 05:31:25
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       23544768.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     2951.5 MWIPS (9.9 s, 7 samples)
Execl Throughput                               3448.2 lps   (29.7 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        761139.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          201782.3 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2431711.3 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1313009.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 272928.1 lps   (10.0 s, 7 samples)
Process Creation                              11501.4 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   4536.8 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    625.0 lpm   (60.0 s, 2 samples)
System Call Overhead                        2005336.0 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   23544768.5   2017.5
Double-Precision Whetstone                       55.0       2951.5    536.6
Execl Throughput                                 43.0       3448.2    801.9
File Copy 1024 bufsize 2000 maxblocks          3960.0     761139.0   1922.1
File Copy 256 bufsize 500 maxblocks            1655.0     201782.3   1219.2
File Copy 4096 bufsize 8000 maxblocks          5800.0    2431711.3   4192.6
Pipe Throughput                               12440.0    1313009.1   1055.5
Pipe-based Context Switching                   4000.0     272928.1    682.3
Process Creation                                126.0      11501.4    912.8
Shell Scripts (1 concurrent)                     42.4       4536.8   1070.0
Shell Scripts (8 concurrent)                      6.0        625.0   1041.6
System Call Overhead                          15000.0    2005336.0   1336.9
                                                                   ========
System Benchmarks Index Score                                        1193.5
```

総合的な評価結果である System Benchmarks Index Score は、なんと、同じプロセッサなのに、3倍に近い性能差が生じています。 CentOS 6 では、440.9 に対して、CentOS 7 では、1193.5 となっています。 この違いは一体何処からくるのでしょうか？　OSのバージョンが上がれば、機能が増えて遅くなる事が一般的なのですが、反対になっています。

結論から先に言うならば、この性能差の原因は、仮想化環境の違いです。ソフトレイヤーのCentOS 6.x は、Para Virtualization (以下PV) であり、CentOS 7.x は、Hardware Assisted Virtualization (以下HVM)のためです。この違いはカーネルの起動時のメッセージで判別することができます。 

CentOS 6では、"Booting paravirtualized kernel on Xen" と表示されており、PV (準仮想化) である事がわかります。

```long:CentOS6
[root@centos6 UnixBench]# dmesg |grep Xen
 Xen: 0000000000000000 - 00000000000a0000 (usable)
 Xen: 00000000000a0000 - 0000000000100000 (reserved)
 Xen: 0000000000100000 - 0000000040000000 (usable)
Booting paravirtualized kernel on Xen
Xen version: 4.1.5 (preserve-AD)
Xen: using vcpu_info placement
Xen: using vcpuop timer interface
installing Xen timer for CPU 0
Initialising Xen virtual ethernet driver.
```
一方、CentOS 7 では、"Hypervisor detected: Xen HVM" が表示されており、HVM である事がわかります。

```lang:CentOS7
[root@centos7 UnixBench]# dmesg |grep Xen
[    0.000000] DMI: Xen HVM domU, BIOS 4.1.5 11/28/2013
[    0.000000] Hypervisor detected: Xen HVM
[    0.000000] Xen version 4.1.
[    0.000000] Xen Platform PCI: I/O protocol version 1
[    0.000000] Netfront and the Xen platform PCI driver have been compiled for this kernel: unplug emulated NICs.
[    0.000000] Blkfront and the Xen platform PCI driver have been compiled for this kernel: unplug emulated disks.
```

PVはハードウェアのサポートを必要とせず仮想化環境を実現できる点や、専用に手を加えたカーネルを利用する事で、ハードウェアのエミュレーションの範囲を少なくして、高速な仮想環境を実現できるものでした。しかし、現在では積極的にプロセッサの仮想化機能を利用した方が、性能の高い仮想化環境を得る事が出来ようになりました。 このため、Xen ハイパーバイザーを利用するクラウド環境では、PVからHVMへの移行が進んでいます。

# CentOS 6 を HVM 環境で動作させる方法

HVM環境で動作する仮想サーバーのカーネルは、物理サーバーや VMware,VirtualBox といった環境で動作するものと同じものです。 そして、CentOS6.x や Ubuntu 14.x は、Xenハイパーバイザーの環境に合わせて、Xen のデバイス・ドライバを選択してブートします。 このため HVM 環境に対してカスタムカーネルを導入する事も可能です。

SoftLayerは、仮想サーバーであってもコンソールにアクセスする手段が提供されています。そして、仮想サーバーをレスキュー・カーネルから起動して、起動しないカーネルを修復する手段が提供されています。 
これらの機能を上手に活用すれば、オンプレミスにある 仮想サーバーを SoftLayer上に引越す事ができます。 

SoftLayer の CentOS 7 は HVM環境で動作しているため、SoftLayer上で性能の悪かった CentOS 6 の代わりに、オンプレの CentOS 6 を CentOS 7 の動作環境に上書きすれば、HVMで動作する性能の高い CentOS 6 仮想サーバーを得ることができます。

この作業の概要は次の様になります。 
* オンプレミスの環境の CentOS 6 の OSディスクの raw イメージ・ファイルを作成する。
* SoftLayer 上で CentOS 7 の仮想サーバーを起動する。このサーバーは OS ディスク以外に raw イメージの一時置場としての第二ディスクを設定する。 
* オンプレミス環境から、CentOS 7 の第二ディスクへ raw イメージ・ファイルを転送する。
* CentOS 7 の仮想サーバーを レスキュー・カーネルで再起動して、コンソールからログインする。
* ddコマンドを利用して、第二ディスクの raw イメージで、第一ディスクを上書きする。
* 仮想マシンを再起動し、コンソールからログインして、ネットワーク設定、DNS設定を手作業でおこなう。

次に作業のポイントとなる部分について補足していきます。

## raw イメージ・ファイル作成
SoftLayerのLinuxサーバーのデフォルトのストレージ・サイズは、25GBであるため、raw イメージも 25GB 以下である必要があります。 ディスク・イメージの変換ツールは qemu-img が便利です。このツールは、raw, VHD, vmdk など主要な形式をサポートしています。 

## CentOS 7.x の仮想サーバーの起動
この仮想サーバーは、OSディスクを上書きして、別のOSのサーバーとして利用するためのものです。必要最小限の設定で起動します。

## raw イメージ・ファイルを転送
CentOS 7.x の仮想サーバーに対して、ファイル転送で raw イメージを転送します。 SoftLayerの標準提供のVPN環境で転送すると速度に制限があるので、インターネットからアップロードします。　第二ディスクは、mkfs.ext4 でファイル・システムを作成しておき、/mnt などにマウントしておきます。 そして、アップロード先をこの/mnt にしておきます。 

## レスキュー・カーネルで再起動、コンソールからログイン
レスキュー・カーネルで再起動するには、**Device Details** の **Actions** を展開して次の様に **Rescue** を選択します。 
![スクリーンショット 2015-08-17 19.30.34.png](https://qiita-image-store.s3.amazonaws.com/0/42829/5bf36442-2537-1fd8-6efb-9052b6dbf6b6.png)

次に仮想サーバーのコンソールにアクセスするには、同じ場所の **Actions** の **KVM Console** を選択します。この時、JREのセキュリティ制限で 例外設定をしなければ、Java アプレットのコンソールが起動しません。いくつかのIPアドレスを例外設定しなければ動作しないため、簡単な方法として、次の様にVNCクライアントを利用してアクセスする事ができます。

![スクリーンショット 2015-08-17 20.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/42829/0fb0b6d9-a8a7-8ef3-a4f8-efcb69900192.png)

## 第二ディスクの raw イメージで、第一ディスクを上書き
レスキュー・カーネルで起動された仮想マシンのrootファイル・システムは、主記憶上のファイル・ファイルシステムでにあるため、第二ディスクに転送した raw イメージで、OS起動ディスクを上書きする事ができます。 
レスキュー・カーネルにログインした後、次のコマンドで上書きします。

```
# mount -t ext4 /dev/xvdc /mnt
# dd if=/mnt/disk.img of=/dev/xvda bs=1M
```

## 仮想マシンを再起動、手作業でネットワーク設定

**Device Details** -> **Actions** -> **Reboot** を選択して再起動します。この時、**Hard Reboot** から **Soft Reboot** の選択ダイアログ表示されます。 ここでは、サーバー本体のリセットボタンに相当する **Hare Reboot** を選択します。 

クラウドの管理システムを利用せずに、OSディスクの内容を書き替えたので、すべて手動で設定しなければなりません。設定するべきネットワーク・インタフェースの情報は、**Device Details** 画面に表示されているので、この画面を見ながら、以下のファイルを設定します。

```
/etc/sysconfig/network-scripts/ifcfg-eth0  <-- プライベート側
/etc/sysconfig/network-scripts/ifcfg-eth1  <-- パブリック側
```

DNSサーバーの設定は、以下のファイルに直接設定します。

```
/etc/resolv.conf
```


# CentOS 6 HVM のUnixbench 結果

この様にして作成した CentOS 6 HVM のカスタム仮想サーバーが、どんな性能を発揮するのか、確認した結果が以下の画面コピーになります。 SoftLayer の CentOS 6 (PV環境)サーバー のスコアが 440.9 に対して、CentOS 7 (HVM環境)サーバーが 1193.5 でした。 これに対して、カスタム仮想サーバーは 1109.9 という値を得ることができました。 この性能向上の原因は、dmesg コマンドの応答結果から、HVM環境である事が判ります。 

```lamg:カスタム仮想サーバーCentOS6_on_HVM
========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: centos6.takara.org: GNU/Linux
   OS: GNU/Linux -- 2.6.32-573.3.1.el6.x86_64 -- #1 SMP Thu Aug 13 22:55:16 UTC 2015
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz (4000.1 bogomips)
          x86-64, MMX, Physical Address Ext, SYSCALL/SYSRET
   22:09:47 up 6 min,  2 users,  load average: 0.14, 0.06, 0.01; runlevel 3

------------------------------------------------------------------------
Benchmark Run: 月  8月 17 2015 22:09:47 - 22:37:37
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       23625141.4 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     2511.3 MWIPS (9.9 s, 7 samples)
Execl Throughput                               3247.3 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        697314.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          186679.2 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2219073.8 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1160776.9 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 252130.4 lps   (10.0 s, 7 samples)
Process Creation                              11937.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   4145.1 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    561.0 lpm   (60.1 s, 2 samples)
System Call Overhead                        1939694.0 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   23625141.4   2024.4
Double-Precision Whetstone                       55.0       2511.3    456.6
Execl Throughput                                 43.0       3247.3    755.2
File Copy 1024 bufsize 2000 maxblocks          3960.0     697314.6   1760.9
File Copy 256 bufsize 500 maxblocks            1655.0     186679.2   1128.0
File Copy 4096 bufsize 8000 maxblocks          5800.0    2219073.8   3826.0
Pipe Throughput                               12440.0    1160776.9    933.1
Pipe-based Context Switching                   4000.0     252130.4    630.3
Process Creation                                126.0      11937.0    947.4
Shell Scripts (1 concurrent)                     42.4       4145.1    977.6
Shell Scripts (8 concurrent)                      6.0        561.0    934.9
System Call Overhead                          15000.0    1939694.0   1293.1
                                                                   ========
System Benchmarks Index Score                                        1109.9

```
次はdmesgの応答です。 HVMであることがわかります。

```カスタム仮想サーバーCentOS6_on_HVMのdmesg
[root@centos6 ~]# dmesg |grep Xen
DMI: Xen HVM domU, BIOS 4.1.5 11/28/2013
ACPI: RSDP 00000000000ea020 00024 (v02    Xen)
ACPI: XSDT 00000000fc00ef80 00044 (v01    Xen      HVM 00000000 HVML 00000000)
ACPI: FACP 00000000fc00ed40 000F4 (v04    Xen      HVM 00000000 HVML 00000000)
ACPI: DSDT 00000000fc003040 0BC75 (v02    Xen      HVM 00000000 INTL 20090123)
ACPI: APIC 00000000fc00ee40 000D8 (v02    Xen      HVM 00000000 HVML 00000000)
ACPI: HPET 00000000fc00ef20 00038 (v01    Xen      HVM 00000000 HVML 00000000)
ACPI: WAET 00000000fc00ef58 00028 (v01    Xen      HVM 00000000 HVML 00000000)
Xen version 4.1.
Xen Platform PCI: I/O protocol version 1
Netfront and the Xen platform PCI driver have been compiled for this kernel: unplug emulated NICs.
Blkfront and the Xen platform PCI driver have been compiled for this kernel: unplug emulated disks.
```


# まとめ

オンプレミスの仮想環境で動作している CentOS 6.x を raw イメージで取り出し、HVMで動作する CentOS 7.x の仮想サーバーに上書きすることで、 性能の良い CentOS 6.x が作れることが確認できました。 

一方、SoftLayer には、CentOS 6.x Ubuntu 14.xに対して OSのインポート機能が提供されていますが、これらの機能を利用しすると、PV環境の仮想サーバーとして構成されます。 

この正規のインポート機能と、今回の上書手法を比較すると、前者では、クラウドの管理機能によってネットワークの設定やOSイメージのバックアップなどが自動化されるのに対して、上書きで作成した仮想サーバーでは、手作業で設定を実施しなければならないなりません。 そして、仮想環境に起因する問題に対応するためのカーネルの修正なども自前で実施する必要があります。

この様なメリットとデメリットを考慮しながら、選択を進めていく必要があります。

# その他
* 仮想サーバーの CentOS 6.7 (PV環境）を dd　で rawイメージにして、CentOS 7.x (HVM環境)に上書きしたが、OSの起動過程で、カーネル・パニックを起こして起動できなかった。
* CentOS 6.x (PV環境)仮想サーバーに、PVに対応しないカスタムOSイメージを上書きインストールした場合、Xenの仮想マシンの設定ファイルに、HVMとPVを切替える項目があるため、起動できないと予想される。  (未確認) 
* CentOS 6.x と CentOS 7.x では、ネットワーク関連のコマンドが大幅に変更となっており、互換性がない。このためクラウドの管理システムが CentOS 7.x として登録されたOSイメージに、CentOS 6.x を上書きすると、イメージ・テンプレートは取得できるが、それから仮想サーバーをデプロイする過程で止まってしまう。 起動過程状態で放置するとシスオペの介在によりネットワーク設定を進め起動が可能であるが保証がない。インポートではキャンセルされるため同様の扱いとなる可能性もある。
* Debian 8.x も HVMで動作しており、 一方 Ubuntu 14.x は、PVで動作している。 Ubuntu は Debian系であり、ネットワーク関連の設定ファイルは共通であることから、Ubuntu を Debian 8.x に上書きしてもクラウドの自動化が利用できないというデメリットが発生しない可能性がある。
* CentOS 7.x の正規のインポート機能が、リリースされている (2015-8-15現在) この機能を利用すればHVM環境が利用できると思われる。（未確認)