Linux Tips – RAMディスク(/dev/shm)のIO性能をチューニングに活用する方法
アプリケーションやプログラムのパフォーマンスが思うように上がらない場合、ハードディスクへのファイルIOがパフォーマンスのボトルネックになっているケースが多々あります。ここでは、そのようなケースに対して有効なチューニング方法の一つ、LinuxのRAMディスク(/dev/shm)を用いたパフォーマンスチューニングについて紹介します。
RAMディスクとは、メモリの一部の領域を「仮想的なハードディスク」として割り当てて利用するものです。Linuxには標準でtmpfs(/dev/shm)というRAMディスクの仕組みが組み込まれており、簡単にRAMディスクの領域の作成して利用することができます。
RAMディスクのIO性能は、「CPUがメモリにアクセスするスピード」から「ファイルシステム制御のオーバーヘッド分」を引いた性能になります。RAMディスクを利用することで、ハードディスクではとても到達できないレベルのIO性能を確保することができます。
RAMディスクの長所・短所
RAMディスクとして作成した領域は、各プログラムからはファイルシステム上のディレクトリとして認識されます。このため、パフォーマンスチューニングを行う際にプログラムの修正が軽微で済むという長所があります。システムのボトルネックがファイルIOであれば、パフォーマンスチューニングにRAMディスクのIO性能を活用することは、有力な選択肢であると言えます。
しかしながら、データ保全性の観点で大きな弱点が存在することには十分留意して下さい。ハードディスク(※ 厳密にはwrite through設定のハードディスク) 上に配置されたデータと違い、RAMディスク上に配置されたデータには、ハードウェア故障等による「突然のサーバ停止時に跡形もなくデータが失われるリスク」が存在します。従って、実装にあたっては、サーバ停止時のリカバリ/リラン方式を確立しておくことが非常に重要になります。
なお、Linux OSもファイルをキャッシュ制御していますし、最新のハードディスク・ストレージ製品は高性能なキャッシュ機能を備えています。RAMディスクを使用すればファイルIOに関連するパフォーマンスが必ず向上する、という訳ではありません。方式設計・性能設計時には、システムの構成要素全体を見て最適化を行う必要があります。
RAMディスクの活用を検討すべき処理・構成例
以上のポイントを考慮した上で、次のような処理・構成例でパフォーマンスの向上を求められる場合、RAMディスクの活用を検討してみては如何でしょうか。
- 一連の処理の中で何度も特定ファイルのopen、更新、closeを繰り返す。
最終的にハードディスク上に書き出すことで十分であれば、処理中は一時ファイルをRAMディスク上に配置することも考えられます。 - 一連の処理の中でプログラム間のデータ受け渡しをファイルで行う。
サーバ停止等の対応でリランする際、処理の頭から実行するのであれば、受け渡し用のファイルをRAMディスク上に配置することも考えられます。 - ファイル群を圧縮して、すぐに別サーバにFTP転送する。
圧縮元ファイルのreadは発生しますが、圧縮ファイル(tar.gz等)のwriteはRAMディスクに対して行うことができます。転送先のサーバでも圧縮ファイルをRAMディスク上に配置することが考えられます。 - 大容量でない参照用スレーブデータベース
レプリケーションを行って参照用のスレーブデータベースを作成する場合、スレーブデータベースのファイル容量がRAMディスク上に展開可能な範囲であれば、RAMディスク上に配置するシステム構成も考えられます。
RAMディスク/ハードディスクのIO性能比較
ディスクベンチマークツール「bonnie++」を用いて、RAMディスク/ハードディスクのIO性能を比較してみます。RAMディスクは、Linux上で簡単に利用できるtmpfs(/dev/shm)を利用しています。
環境準備
tmpfs(/dev/shm)の最大サイズは、デフォルトでは物理メモリの1/2に設定されています。今回の測定ではRAMディスクの性能測定時に256MBの一時ファイルを作成するので、RAMディスク上に同ファイルを配置可能な容量があるか、dfコマンド等で確認して下さい。
RAMディスクの容量が足りない場合は、次のように最大サイズ(例:384MB)を指定してtmpfs(/dev/shm)を再作成してサイズを拡張します。
- RAMディスク領域を再作成して拡張
# umount /dev/shm # mount -t tmpfs -o size=384m tmpfs /dev/shm # mkdir /mnt/ram # mount -t tmpfs -o size=384m /dev/shm /mnt/ram
なお、コマンド3、4行目の /mnt/ram にマウントする手順は必須ではありません。/dev/shm をそのまま使用することもできます。この場合は測定時にコマンドのパス部分を読み替えて下さい。
測定手順
測定コマンドの詳細は「bonnie++の使用方法」を参照して下さい。また、RAMディスクの測定向けにbonnie++のソースを若干修正しています。修正方法も記載していますので参考にして下さい。
- RAMディスクのIO性能を測定
$ ./bonnie++ -d /mnt/ram -s 256 -r 128
RAMディスクの性能測定時には、bonnie++が作成する一時ファイルのサイズを256MB、メモリサイズを128MBに指定します。メモリサイズを指定する理由は、bonnie++の仕様で「メモリサイズは作成する一時ファイルの1/2以下」である必要があるためです。
$ ./bonnie++ -d /tmp
性能測定結果一覧
実環境での測定結果を一覧にまとめました。測定条件等は以下の通りです。測定値の妥当性を確認する際、参考にして頂ければと思います。
- 他処理が実行されないサーバ環境構築後の無風時に測定
- 測定結果は5回実行した結果の中から、Sequential Input(read)Block、Sequential Output(write)Blockの最大値を「M/sec」値で記載
- 小数点第1位以下は切り捨て
RAMディスクの測定時には、CPU使用率が100%、IO待ち(vmstatのwa値)が0%となっており、CPU・メモリがボトルネックになっています。従って、CPU・メモリが非力なサーバにおいてはRAMディスクのIO性能の純粋なピーク値を示すものではありませんが、RAMディスクの高速性は十分に感じて頂ける数値だと思います。
H/W <SDRAM> | RAM | RAM Disk | I/F | H/W RAID | OS kernel | RAM Disk | HDD | ||
read | write | read | write | ||||||
OptiPlex GX115 < PC133 > | 512 MB | 384 MB | 40GB 7.2K * 1 Ultra ATA/100 | no | RedHat 8.0 2.4.18-14 | 427 | 171 | 51 | 37 |
CentOS 3.6 2.4.21-37.EL | 202 | 158 | 39 | 39 | |||||
Fedora Core 4 2.6.11-1.1369 [ SE Linux / non SE Linux ] | 191 | 141 | 32 | 20 | |||||
216 | 157 | 32 | 22 | ||||||
OptiPlex GX240 < PC133 > | 512 MB | 384 MB | 40GB 7.2K * 1 Ultra ATA/100 | no | RedHat 8.0 2.4.18-14 | 786 | 302 | 55 | 39 |
CentOS 3.6 2.4.21-37.EL | 759 | 289 | 38 | 41 | |||||
Fedora Core 4 2.6.11-1.1369 [ SE Linux / non SE Linux ] | 685 | 281 | 32 | 24 | |||||
712 | 281 | 39 | 25 | ||||||
ML350 G3 < PC2100 > | 1GB | 384 MB | 9GB 10K * 2 Ultra 160 SCSI | 1 | CentOS 3.6 2.4.21-37.ELsmp | 1058 | 285 | 31 | 27 |
ML110 G4 < PC2-5300 > | 2GB | 384 MB | 160GB 7.2K * 2 SATA | 1 | CentOS 3.6 2.4.21-37.ELsmp | 1872 | 770 | 73 | 70 |
ProLiant MicroServer < PC3-10600 > | 2GB | 1GB | SATA 2 (3.0 Gb/s) | no | CentOS 6.0 2.6.32-71.el6.x86_64 | 2427 | 991 | - | - |
ML110 G6 < PC3-10600 > | 2GB | 1GB | SATA 2 (3.0 Gb/s) | no | CentOS 6.0 2.6.32-71.el6.x86_64 | 4909 | 2310 | 123 | 41 |
ML110 G7 < PC3-10600 > | 2GB | 1GB | SATA 2 (3.0 Gb/s) | no | CentOS 6.2 2.6.32-220.el6.x86_64 | 4556 | 2144 | 122 | 40 |
関連記事
STREAMの使用方法 (Linuxメモリ帯域幅の計測方法)
姫野ベンチの使用方法・測定結果一覧 (Linux編)
HDDベンチマーク手順+性能測定結果一覧 (hdparm,dd,bonnie++)
SSD I/Oブロックサイズの調整によるチューニング効果検証 (DC S3700編)
「Linux」カテゴリーの記事一覧
参考になるサイト
@IT – 容量が動的に変化するRAMディスクを使うには
Linuxでのtmpfsを用いたRAMディスク作成方法の解説。
SOURCEFORGE.JP – ログ・ファイルをRAMに置いてシステム・パフォーマンスを改善する方法
ログファイルをRAMディスク上に配置することでI/O頻度を下げ性能向上を図る「Ramlog」の紹介。
ITmedia – ディスクアクセスを減らしたい – update(bdflush)編
update、bdflushデーモンによるHDD書き込み・フラッシュ設定の変更に関する情報。
ITmedia – ハードディスクのキャッシュ制御をコントロールしたい
/proc/sys/vm/bdflush を使ったキャッシュ制御設定の変更に関する情報。
PC Watch – ギガバイト「i-RAM」ファーストインプレッション
不揮発性RAMディスク「i-RAM」を用いたベンチマーク結果を紹介。
(2005年10月 発売開始。もう少し安価で手に入るようになれば、Linux上で検証したい。)
@IT – RAMディスクで処理を劇的に高速化する
Windows 2000、XP、Windows Server 2003 でRAMディスクが作成できる無料ソフト「Free RAMDisk」の紹介記事。設定方法の解説が充実している。