Open Source Web Development Tutorials - Dev Shed
適切なI/Oスケジューラの設定と最適化
(2009/03/31公開)
Linux I/Oファイルのシステムコール
Linuxファイルとイベントポーリングインターフェース
LinuxのMMAPシステムコール
mmap()を利用する高度なファイルI/O
Linuxカーネルに与えるファイルI/Oのアドバイス
Linux I/Oスケジューラ
適切なI/Oスケジューラの設定と最適化
全7回でLinux I/Oファイルのシステムコールを解説してきた本連載も、最終回となりました。今回は、適切なI/Oスケジューラの選択、設定、最適化を解説します。内容は、ロバート・ラブ著『Linux System Programming: Talking Directly to the Kernel and C Library(Linuxシステムプログラミング-カーネルおよびCライブラリへ直接話しかける:仮題)』第4章からの抜粋です。(原著はオライリーより2007年に出版、ISBN: 0596009585(Copyright 2007 O'Reilly Media, Inc.))禁無断転載。出版社の許可を得て使用しています。書店あるいはオライリーメディアから直接購入できます。
適切なI/Oスケジューラの選択と設定
デフォルトのI/Oスケジューラは、起動時、カーネルコマンドラインパラメータioschedによって選択できます。有効な選択肢はas、cfq、deadline、noopです。また、実行時、/sys/block/device/queue/schedulerを使って、デバイスベースでI/Oスケジューラを選択することも可能です。この場合、deviceは当該のブロックデバイスです。このファイルを読み出すと現在のI/Oが戻され、このファイルに有効な選択肢のいずれかを書き込むと、指定したI/Oスケジューラが設定されます。例えば、デバイスhdaにCFQ I/Oスケジューラを設定する場合は、以下のとおりです。
# echo cfq > /sys/block/hda/queue/scheduler
/sys/block/device/queue/ioschedのディレクトリには、I/Oスケジューラに関連した調整値の読み出しと設定を行えるファイルがあります。厳密な選択肢は、現行のI/Oスケジューラによって異なります。設定の変更には、常に、ルート特権が要求されます。
優秀なプログラマーは基本的なI/Oサブシステムに制限されないプログラムを書くものですが、最適コードを書く上で、サブシステムに関する知識が助けになることも確かです。
I/O性能の最適化
ディスクI/Oは、システムのほかのコンポーネントの性能と比較して、非常に時間を要する動作です。しかし、I/Oは現代のコンピューティングにとって非常に重要な側面ですから、I/O性能を最大限に高めることが不可欠です。
(多数の小規模な動作を併合して、少数の大規模な動作にまとめる)I/O動作の最少化、ブロックサイズに合わせたI/Oの実行、ユーザーバッファの使用(第3章を参照のこと)のほか、高度なI/O技術-ベクターI/O、位置I/O(第2章を参照のこと)、非同期I/O、など-の活用は、システムプログラミングを行う時、必ず考慮する必要のある重要な措置です。
もっとも要求の厳しいミッションクリティカルなI/O集約型アプリケーションの場合は、さらに付加的な措置を施して性能の最大化を図ることができます。前述したように、Linuxカーネルは高度なI/Oスケジューラを活用して望ましくないディスクのシーク動作を最小限に抑制しますが、ユーザースペースアプリケーションも、同様の方法で同じ効果を達成し、性能の向上を実現することが可能です。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








