ディスクI/Oの特性を理解し、最適化へ
クラウドを加速させるSSD技術(後編)

松本直人
仮想化インフラストラクチャ・オペレーターズグループ チェア
さくらインターネット研究所 上級研究員
2012/3/5

サーバ仮想化が普及するにつれて管理者の頭を悩ませているのが、ストレージへのアクセス集中、負荷集中です。高速にデータ処理を行えるSSDを適材適所で活用すれば、この課題に対処できます。(編集部)

 ディスクI/O性能の特性を理解する

 しばしば、「SSDはHDDに比べて高速だ」といわれますが、前編でもお話したとおり、常にそうとは限りません。特にディスク性能で違いが見られるのは「ディスクへの書き込み性能」といわれます。後編ではこれを題材として見ていきましょう。

 最も簡単にディスクへの書き込み性能を測定できる対象として、「シーケンシャルWRITE」、つまり連続的にデータ書き込みを行う処理があります。ddなど、ごく一般的にOSに付属するツールでも計測できますし、fioを用いて緻密に計測することも可能です。こちらは評価する方の趣向によって選択するのをお勧めします。

 今回は、4種類の異なるSSDとHDDで「シーケンシャルWRITE」性能を計測してみました。結果を見て驚く方もいるかと思いますが、評価を行ったところ、中にはSSDよりもHDDの性能が上回るという結果も得られました(図1)。

図1 シーケンシャルWRITE性能の計測結果(クリックすると拡大します)

 ここが、「SSDだからといって、すべてが高速ではない」ということの真髄でもあります。昨今のストレージ業界ではSSDやHDDの区別なく、ディスクアクセスの高速化を常に行っており、技術も日進月歩といっても過言ではありません。ですから、一概に「SSDはHDDよりも高速だ」とはいえないのです。

 次に、「ストレージならでは」の特性について見ていきましょう。OSは、DRAMを有効活用して、ディスクへの書き込みや読み込み処理をキャッシュする仕組みを搭載しています。これにより見かけ上の性能を向上させ、ユーザーの利便性を向上させているのです。データの処理によっては、このバッファリングやキャッシング処理を経由しない操作も可能です。

 ここで理解しておくべきことは「バッファリングやキャッシングを経由しないアクセスは、著しいディスク性能劣化を引き起こす場合がある」という点です(図2。なお、非常に高速に、粒度の小さいデータにアクセスするという要件以外では、通常こういったディスク特性を最適化して使うことはありません)。

図2 OSのバッファリングやキャッシングを利用しない場合、著しく性能が劣化する場合がある(クリックすると拡大します)

 しかしながら、OS側のDRAMを経由しないディスク処理時間の計測は、そのSSD単体の性能限界を図るという意味では極めて重要になりますので、fioや負荷試験ツールの設定方法などは理解しておくとよいでしょう。

・fioコマンド・マニュアル

direct=bool    If true, use non-buffered I/O (usually O_DIRECT).  Default: false.

 また、fioに代表されるディスク性能評価ツールには、データの読み書きをパターン化した設定が最初から備わっています。それらオプションを使うことで、ディスクが本来持っているポテンシャルを詳細に確認することもできます。

 なお、これら測定ツールがディスクI/Oを生成する際には、常にCPUパワーを使います。このため、測定する環境によって結果が異なる場合もあることに注意してください。測定を実施するときには、このことを十分理解しておくといいでしょう(図3)。

図3 fioを使った各種I/Oパターンの計測結果(クリックすると拡大します)

 「I/Oを目で見る」コマンド

 SSDやHDDなどのディスク性能を評価する際、OSの影に隠れてしまい、その本来の姿を見るのが困難になる場合が多くあります。

 単純にファイルを読み書きしているだけでは、本当にそのSSDが高速なのかどうかを目で見ることはできません。OS側が持つディスク性能を高速化させるためのキャッシング機構が非常に賢く動作してくれるがゆえの悩みといえるでしょう。

 Linuxなどで「ページキャッシュ」と呼ばれる機構の動作を確認するには、/proc/meminfoDirtyWritebackの状況を見るのが一番の早道です。以下のコマンドでは1秒単位でmeminfoの内容を表示してくれますので、変化量を元に、現在どのような処理がOS側で行われているかなどを体感できます。

# watch -n 1 cat /proc/meminfo
MemTotal:        2054624 kB
:
Dirty:              1124 kB
Writeback:           523 kB

 また、iotopコマンドを使うと、OS上のどのプロセスがどれぐらいの粒度でディスクアクセスを行っているかも見えてきます。こうやって、必要とされる粒度でSSDを取り巻く性能状況を常に確認しておくことで、性能限界の判定や最適な使い方も見えてくるでしょう。

# iotop -b -o
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
9164 be/4 root        0.00 B/s    8.57 M/s  0.00 % 90.71 % fio --directory=/ssd --rw=write --size=10G ...
9172 be/4 root        0.00 B/s    6.78 M/s  0.00 % 90.71 % fio --directory=/ssd --rw=write --size=10G ...

 なお、I/O関連のコマンドとしては、pidstatや、NFS環境での読み書き性能を測るnfsiostatなども有効に使えます。計測したい内容に合わせて選択するとよいでしょう。

 10GbE SSD IP-SANを作ってみよう

 SSDの普及によって、ディスクアクセスは非常に高速になりつつあります。しかし、ファイル共有を行う場合などは、現在の1ギガビットイーサネット(1GbE)では、少々心もとないところも出てきます。

 より高速なネットワークインターフェイスとして、昨今ではInfiniBandに注目が集まっています。一方イーサネット周辺でも、10GbE NICの低価格が始まりつつあり(執筆時点で$399〜付近)、普及への弾みもついてきました。

 ここでは低価格化した10GbE NICを使って、VMwareとLinuxを用いてIP-SANを構築する例を紹介します。

写真1 Mellanox ConnectX-3 EN(Dual-port 10GbE NIC)

 まずは、10GbE NICドライバをインストールするところから始めます。今回は10GbE NICとして、Mellanox社製の「ConnectX-3 EN Dual-port 10GbE NIC」を使います。VMwareおよびLinuxのドライバを提供サイトから適宜取得し、インストールしていきましょう。

・Mellanox 10GbEドライバのインストール手順(Scientific Linux 6.2Rの場合)

# yum install kernel-headers.x86_64 kernel-devel.x86_64 kernel.x86_64 gcc.x86_64 rpm.x86_64 rpm-build.x86_64 zlib.x86_64 zlib-devel.x86_64 gcc-c++.x86_64
# cd /tmp
# wget http://www.mellanox.com/downloads/Drivers/mlnx_en-1.5.7.tgz
# tar xzvf ./mlnx_en-1.5.7.tgz ; cd mlnx_en-1.5.7
# ./install.sh
#reboot

・VMware用ドライバを取得してからの手順

# cd /opt
# unzip mlx4_en-mlnx-1.6.1.2-471530.zip 
# esxcli software vib install -v /opt/net-mlx4-en-1.6.1.2-1OEM.500.0.0.406165.x86_64.vib
※再起動を行う

画面1 Mellanox 10GbE Driverインストール手順(VMware ESXi 5.0.0の場合)(クリックすると拡大します)

 続いて、Linux上でNFSサーバ設定を行っていきます。NFSサーバ側に搭載したSSDでファイルシステムを作り、mountおよびnfs exportを設定しておきます。

・ディスク追加手順(Scientific Linux 6.2Rの場合)

# fdisk /dev/sda
# mkfs.ext4 /dev/sda
# mkdir /ssd; mount -t ext4 /dev/sda /ssd
# vi /etc/fstab
: 
/dev/sda               /ssd                    ext4    defaults        1 2
# vi /etc/exports
/ssd    192.168.0.0/255.255.255.0(rw,sync,no_root_squash)

 続いて、NFSサーバとして外部にサービスを提供するための設定処理を行います。各種NFSに必要な設定やフィルタリングの解除を行いましょう。

・NFSサーバ設定手順(Scientific Linux 6.2Rの場合)

# vi /etc/sysconfig/nfs
RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
RPCNFSDCOUNT=256
MOUNTD_PORT=892
STATD_PORT=662
STATD_OUTGOING_PORT=2020

# iptables -I INPUT -m multiport -p tcp --dport 111,662,875,892,2049,32803 -j ACCEPT
# iptables -I INPUT -m multiport -p udp --dport 111,662,875,892,2049,32769 -j ACCEPT
# service iptables save
# setsebool -P nfs_export_all_rw 1
# service rpcbind start
# service nfs start
# service nfslock start
# chkconfig nfs on
# chkconfig rpcbind on
# chkconfig nfslock on

 これで一連の処理は完了です。ネットワーク越しにSSD環境を利用したいクライアントごとに、適宜VMwareやLinux、Windowsなどの設定を行い、アクセスしてみてください。

 

クラウドを加速させるSSD技術(後編)
ディスクI/O性能の特性を理解する
「I/Oを目で見る」コマンド
10GbE SSD IP-SANを作ってみよう
  SSD Caching利用時の注意点
I/O制御の必然性
InfiniBand 56Gbit/s FDR Networkという未来
最後の砦、「ストレージ」の保全に寄せて

「Master of IP Network総合インデックス」


Master of IP Network フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Master of IP Network 記事ランキング

本日 月間