2016/01/02

MicroServer N54L に Intel SSD 750 を取り付けて Nested KVM が捗る

昨年末、HP ProLiant Microserver N54L に Intel SSD 750 を取り付けて、Debian GNU/Linux 8.2(jessie)で Nested KVM を設定したときのメモです。

はじめに

NAS のディスク交換で余った HDD で ZFS を試そうと、3年ほど前に購入した HP ProLiant MicroServer に Debian GNU/Linux をインストールしました。

FreeBSD をメインで使っていないので結局 ZFS についてはたいして知見を貯められていませんが、最近は docker も試すようになってきて少しディスクの空きが心許なくなってきました。ですが N54L のドライブベイに HDD 4つ、光学ドライブベイに SSD を 1つ搭載しているため SATA の空きも設置スペースも無く、ストレージを増設する場合には eSATA か内蔵 USB くらいしかありません。 OS を入れている SSD をより速いサイズの大きなものに換装しようかとも思いましたが、入れ替えの手間がかかるのでどうしたものかと考えていたところ、PCIe スロットに空きがあることに気づきました。

PCIe 接続の SSD(HHHLアダプタ付き)

そういえばコンシューマ向けにも手の届く価格で出始めたとどこかのニュースでみた記憶があったので、どのような製品があるか少し調べたところ、PCIe 接続ができて N54L のハーフハイト、ハーフレングス(HHHL)アダプタが付属しているものは Kingston と Intel の製品が見つかりました。

容量と価格だけを見れば Kingston ですが、#妥協の必要が全くないストレージ というのと、年末にすぐいじりたかったので Amazon プライムで 残1 を見かけた Intel を選びました。

N54L で NVMe

Amazon でポチった後、N54L は PCIe Gen2 だけど PCIe Gen3 が動くのか不安になりました。Wikipedia 等で互換性はあると把握していたのですが、実際に取り付けて普通に認識されてひと安心です。

NVMe インターフェースの製品は初めてなので見慣れないデバイス名に一瞬戸惑いましたが普通に parted で操作できます。
# lspci
...
01:00.0 Non-Volatile memory controller: Intel Corporation Device 0953 (rev 01) (prog-if 02 [NVM Express])
        Subsystem: Intel Corporation Device 370d
        Flags: bus master, fast devsel, latency 0, IRQ 18
        Memory at fdffc000 (64-bit, non-prefetchable) [size=16K]
        Expansion ROM at fdfe0000 [disabled] [size=64K]
        Capabilities: [40] Power Management version 3
        Capabilities: [50] MSI-X: Enable+ Count=32 Masked-
        Capabilities: [60] Express Endpoint, MSI 00
        Capabilities: [100] Advanced Error Reporting
        Capabilities: [150] Virtual Channel
        Capabilities: [180] Power Budgeting 
        Capabilities: [190] Alternative Routing-ID Interpretation (ARI)
        Capabilities: [270] Device Serial Number XX-XX-XX-XX-XX-XX-XX-XX
        Capabilities: [2a0] #19
        Kernel driver in use: nvme
...
# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0   1.8T  0 disk
sdb           8:16   0   1.8T  0 disk
sdc           8:32   0   1.8T  0 disk
sdd           8:48   0   1.8T  0 disk
sde           8:64   0 223.6G  0 disk
├─sde1        8:65   0 214.5G  0 part /
├─sde2        8:66   0     1K  0 part
└─sde5        8:69   0   9.1G  0 part [SWAP]
nvme0n1     259:0    0 372.6G  0 disk
└─nvme0n1p1 259:1    0 372.6G  0 part
ところで hwloc-ls なんてコマンドがあるのですね。 以下の図は hwloc-ls -p の出力ですがリンク幅が一目で分かりますね。右上の PCI 8086:0953(Intel SSD 750)が x4(2.0GB/s)でその下にあるリモートアクセスカードとネットワークは x1(0.25GB/s)。

気になる性能(750 vs 335)

現在使っている Intel SSD 335 との性能が気になるところですが、インターフェースが違いますしカタログスペックで IOPS が一桁違います。

比較にすらならないと思いましたがとりあえず fio しました。パラメータは yohei-a さんのページのをそのまま参考にしました(NVMe デバイスの場合、I/O scheduler は none 一択でした)。 750 のランダム書き込みは約 16万 IOPS。335 は実行に 2分かかっていましたが 8 秒で終わりました。とても速いです。PCIe Gen2 でこれですので Gen3 だとこの倍くらいは行くんでしょうか。
Intel SSD 335 (SSDSC2CT240A4K5)
# fio -rw=randwrite -bs=4k -size=100m -directory=/tmp -direct=1 -numjobs=50 -name=file1 -ioengine=libaio -group_reporting
file1: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=1
...
fio-2.1.11
Starting 50 processes
Jobs: 50 (f=50) ...
file1: (groupid=0, jobs=50): err= 0: pid=20132: Sat Dec 26 22:54:33 2015
  write: io=5000.0MB, bw=41128KB/s, iops=10281, runt=124490msec
    slat (usec): min=5, max=13649, avg=37.09, stdev=128.60
    clat (usec): min=0, max=694498, avg=4708.51, stdev=19062.03
     lat (usec): min=102, max=694520, avg=4746.34, stdev=19062.72
    clat percentiles (usec):
     |  1.00th=[  143],  5.00th=[  179], 10.00th=[  197], 20.00th=[  217],
     | 30.00th=[  231], 40.00th=[  270], 50.00th=[  274], 60.00th=[  278],
     | 70.00th=[  278], 80.00th=[  282], 90.00th=[  564], 95.00th=[27520],
     | 99.00th=[103936], 99.50th=[115200], 99.90th=[144384], 99.95th=[160768],
     | 99.99th=[220160]
    bw (KB  /s): min=   45, max= 7078, per=2.04%, avg=837.91, stdev=531.01
    lat (usec) : 2=0.01%, 4=0.01%, 10=0.01%, 20=0.01%, 50=0.05%
    lat (usec) : 100=0.03%, 250=33.63%, 500=55.92%, 750=1.21%, 1000=0.34%
    lat (msec) : 2=0.29%, 4=0.48%, 10=0.85%, 20=1.33%, 50=2.12%
    lat (msec) : 100=2.45%, 250=1.28%, 500=0.01%, 750=0.01%
  cpu          : usr=0.51%, sys=1.51%, ctx=1296551, majf=0, minf=460
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=1280000/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: io=5000.0MB, aggrb=41127KB/s, minb=41127KB/s, maxb=41127KB/s, mint=124490msec, maxt=124490msec

Disk stats (read/write):
  sde: ios=0/1279485, merge=0/122, ticks=0/6166560, in_queue=6199424, util=100.00%
fio -rw=randwrite -bs=4k -size=100m -directory=/tmp -direct=1 -numjobs=50     31.43s user 94.65s system 100% cpu 2:04.96 total
Intel SSD 750 (SSDPEDMW400G4R5)
# fio -rw=randwrite -bs=4k -size=100m -directory=/mnt/tmp -direct=1 -numjobs=50 -name=file1 -ioengine=libaio -group_reporting
file1: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=1
...
fio-2.1.11
Starting 50 processes
Jobs: 50 (f=50) ...
file1: (groupid=0, jobs=50): err= 0: pid=3370: Mon Dec 28 20:49:56 2015
  write: io=5000.0MB, bw=673241KB/s, iops=168310, runt=  7605msec
    slat (usec): min=3, max=8737, avg= 5.62, stdev=14.49
    clat (usec): min=0, max=58925, avg=284.56, stdev=285.21
     lat (usec): min=13, max=58929, avg=290.39, stdev=285.85
    clat percentiles (usec):
     |  1.00th=[   92],  5.00th=[  169], 10.00th=[  191], 20.00th=[  219],
     | 30.00th=[  243], 40.00th=[  262], 50.00th=[  278], 60.00th=[  290],
     | 70.00th=[  310], 80.00th=[  330], 90.00th=[  362], 95.00th=[  390],
     | 99.00th=[  506], 99.50th=[  700], 99.90th=[ 3312], 99.95th=[ 4448],
     | 99.99th=[ 8160]
    bw (KB  /s): min= 9008, max=15520, per=2.01%, avg=13498.84, stdev=757.49
    lat (usec) : 2=0.03%, 4=0.01%, 10=0.01%, 20=0.10%, 50=0.26%
    lat (usec) : 100=0.76%, 250=31.96%, 500=65.85%, 750=0.58%, 1000=0.17%
    lat (msec) : 2=0.15%, 4=0.04%, 10=0.08%, 20=0.01%, 50=0.01%
    lat (msec) : 100=0.01%
  cpu          : usr=1.49%, sys=2.42%, ctx=1281689, majf=0, minf=364
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued    : total=r=0/w=1280000/d=0, short=r=0/w=0/d=0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: io=5000.0MB, aggrb=673241KB/s, minb=673241KB/s, maxb=673241KB/s, mint=7605msec, maxt=7605msec

Disk stats (read/write):
  nvme0n1: ios=0/1279975, merge=0/0, ticks=0/29188, in_queue=29748, util=97.26%
fio -rw=randwrite -bs=4k -size=100m -directory=/mnt/tmp -direct=1 -numjobs=50  5.72s user 9.28s system 183% cpu 8.153 total

(参考)上記結果をつぶやいていた時の @rioriost さんによる妥協の必要が全くないストレージの fio 結果(Device Mapper を通してこの数値というのもスゴイ)

N54L で Nested KVM

N54L の CPU は型番の通り AMD Turion II NEO N54L なので仮想化は対応していますが、それほど豪勢なスペックではないので Nested KVM しようとは考えていませんでした。しかしストレージがとても速くなりましたので試してみました。

# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             AuthenticAMD
CPU family:            16
Model:                 6
Model name:            AMD Turion(tm) II Neo N54L Dual-Core Processor
Stepping:              3
CPU MHz:               1300.000
CPU max MHz:           2200.0000
CPU min MHz:           800.0000
BogoMIPS:              4392.66
Virtualization:        AMD-V
L1d cache:             64K
L1i cache:             64K
L2 cache:              1024K
NUMA node0 CPU(s):     0,1
# lsb_release -d
Description:    Debian GNU/Linux 8.2 (jessie)

# virsh version
Compiled against library: libvirt 1.2.9
Using library: libvirt 1.2.9
Using API: QEMU 1.2.9
Running hypervisor: QEMU 2.1.2
virt-manager で新規に仮想マシンを作成しただけでは Nested KVM は出来ませんでした(以下はドメイン定義 XML ファイルの一部)。
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>Opteron_G3</model>
  </cpu>
debian-guest# virt-host-validate
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking for device /dev/kvm                                         : FAIL (Check that the 'kvm-intel' or 'kvm-amd' modules are loaded & the BIOS has enabled virtualization)
  QEMU: Checking for device /dev/vhost-net                                   : PASS
  QEMU: Checking for device /dev/net/tun                                     : PASS
   LXC: Checking for Linux >= 2.6.26                                         : PASS
いくつか試したところ、CPU のモデルを Opteron_G3 から phenom に変更するだけで上手くいきました。 virt-manager で変更する場合は「Processor」で「構成」を開いてモデル変更。virsh edit するなら model 要素を書き換えるだけです。
  <cpu mode='custom' match='exact'>
    <model fallback='allow'>phenom</model>
  </cpu>

おわりに

新しい種類のハードウェアを入手したので久しぶりにいろいろとメモがてらまとめてみました。2012年末にコンパクトな検証機として購入した N54L ですが、Intel SSD 750 を追加したことでまだまだ活躍してくれそうです。

0 件のコメント:

コメントを投稿