Linuxのパフォーマンスを改善する3つのTipsLinux Hacks(1/3 ページ)

同じコンピュータでも、Linuxを走らせたときの方がWindows XPやVistaを走らせたときよりも性能は高くなる。しかしLinuxシステムはさらに高速化することも可能だ。本稿では、Linuxシステムの性能を向上させるための、3つの異なるレベルで行う最適化の方法を紹介する。

» 2007年07月19日 03時54分 公開
[Federico-Kereki,Open Tech Press]
SourceForge.JP Magazine

 同じコンピュータでも、Linuxを走らせたときの方がWindows XPやVistaを走らせたときよりも性能は高くなる。しかしLinuxシステムはさらに高速化することも可能だ。この記事では、Linuxシステムの性能を向上させるための、3つの異なるレベルで行う最適化の方法を紹介する。

 あらゆる最適化について言えることだが、何らかの簡単なベンチマークを行なわなければ、結果を本当に向上させることができたのかどうかを知ることはできない。Linux PC上では通常、数多くのプロセスが走っていて、それらが性能の測定に影響を与える可能性がある。その影響を最低限に抑えるために作業はランレベル1で行うようにしよう。ランレベル1は、最低限のプロセスのみを実行するシングルユーザーモードだ。ランレベル1で作業を行うためには、[ALT]+[F1]キーを入力してコンソールに切り替え、ルートとしてログインして「init 1」コマンドを実行する。その結果ほとんどのサービスとアプリケーションが終了するので、ばらつきのない結果を得ることができる。

 しかしランレベル1においてもさらに、走っているべきでないプロセスがないかどうかを「ps xaf」コマンドを使って確認しておいた方が良いだろう。わたしの場合、ddclientプログラムが実行されていて(厳密に言うとスリープしていて)、最適化の結果に影響を与えかねなかったため、「killall ddclient」を実行して終了した。

ハードディスクの速度を最適化する

 最適化の最初のターゲットはハードディスクだ。「cat /etc/fstab」コマンドとmountコマンドを使用すれば、現在使用しているハードディスクを確認できる。わたしの場合「cat /etc/fstab」の実行結果は次のようになった。


/dev/hda3        /                  reiserfs  acl,user_xattr,noatime  1 1
/dev/hda1        /boot              ext2      acl,user_xattr          1 2
/dev/hda2        swap               swap      defaults                0 0
proc             /proc              proc      defaults                0 0
sysfs            /sys               sysfs     noauto                  0 0
debugfs          /sys/kernel/debug  debugfs   noauto                  0 0
usbfs            /proc/bus/usb      usbfs     noauto                  0 0
devpts           /dev/pts           devpts    mode=0620,gid=5         0 0
/dev/fd0         /media/floppy      auto      noauto,user,sync        0 0
/dev/hdd1        /media/disk2       reiserfs  defaults,noatime        1 2

 またmountの実行結果は次の通りだった。


/dev/hda3 on / type reiserfs (rw,noatime,acl,user_xattr)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
debugfs on /sys/kernel/debug type debugfs (rw)
udev on /dev type tmpfs (rw)
devpts on /dev/pts type devpts (rw,mode=0620,gid=5)
/dev/hda1 on /boot type ext2 (rw,acl,user_xattr)
/dev/hdd1 on /media/disk2 type reiserfs (rw,noatime)
securityfs on /sys/kernel/security type securityfs (rw)

 前記から、わたしのメインのハードディスクは/dev/hdaであり、/dev/hda1、/dev/hda2、/dev/hda3という3つのパーティーションがあることが分かる。またセカンダリのハードディスクは/dev/hddで、/dev/hdd1という1つのパーティーションがあることが分かる。ここではメインのハードディスクを最適化する。

 ハードディスクの設定の表示や変更は、hdparmコマンド(「hdparm」は「ハードディスクパラメータ」の略)を使って行うことができる。ただし変更すれば必ず良い結果がもたらされるというわけではなく、性能が低下したり、ひどく有害でデータが失われてしまう場合もある。「man hdparm」を実行すればhdparmコマンドの全オプションを見ることができ、危険なオプションについては「危険」と記されている。

 それではまず、現時点での性能を見ることから始めよう。「hdparm -t /dev/hda」コマンドを実行すれば、転送速度のテストが行なわれ、以下のような結果が表示される。


/dev/hda:

 Timing buffered disk reads:   10 MB in  3.14 seconds =   3.18 MB/sec

 この結果から、ディスクが非常に低速であることが分かる。わたしは通常このコマンドを12回実行して、最小値と最大値を捨て、残りの値の平均を取るようにしている。これを行うためには次のように実行するとよい。


for ((i=0;i<12;i++)) do; hdparm -t /dev/hda; done

 前記のコマンドは、テストを12回実行する。最小値と最大値の排除や平均の計算もスクリプトで行うようにしても良いが、それくらいは電卓でも十分簡単に済ませることができるだろう。

 次に、「hdparm -v /dev/hda」を実行してディスクのパラメータの現在の状態を見てみよう。


/dev/hda:
 multcount    =  0 (off)
 IO_support   =  0 (default 16-bit)
 unmaskirq    =  0 (off)
 using_dma    =  0 (off)
 keepsettings =  0 (off)
 readonly     =  0 (off)
 readahead    =  0 (off)
 geometry     = 16383/255/63, sectors = 156301488, start = 0

 一般的に最初に試す最適化は、転送の高速化のためにドライブが直接メモリにデータを保存できるようにするDMA(Direct Memory Access)を使用することだ。DMAを使用するようにするだけでも、かなりの高速化を実現できる。わたしの場合、「hdparm -d1 /dev/hda」を実行してハードディスクのDMAを有効にした後(なおオプションを-d0とすればDMAは無効になり性能は落ちる)、再び速度を測ってみると16.25Mバイト/secに改善されていた。つまり元の速度から5倍も高速化したことになる!

 DMA以外のオプションを試すこともできる。-c3オプションを使用してhdparm -c3 /dev/hdaを実行すれば、IO_supportの値を変更することができる。わたしのシステムで試したところ16.4Mバイト/secという結果になった。これはわずかな改善だが、それでも設定しておく価値はある。

 multcountは、一度の操作で読み取ることのできるセクタ数を示すパラメータだ。「hdparm -i /dev/hda」を実行すると、「maxMultSect=16」というやや紛らわしい表示も出るが、これはハードディスクが一度に読み取る数の最大値を示すものだ。従って最大値に設定したい場合には「hdparm -m16 /dev/hda」を実行すれば良い。

 セクタの読み取りに関連するもう1つのパラメータに、readaheadがある。readaheadについては、最適の結果を得るためにはさまざまな値を試してみる必要がある。わたしの場合、最も良い結果を得ることができたのは「hdparm -a1024 /dev/hda」という設定にしたときだった。このようにmultcountとreadaheadを最適化した結果、ハードディスクの速度は33Mバイト/sec前後にまで向上した。この値を得るためには、readaheadの値を-a128から-a256、-a512、-a1024、-a2048まで変えてみることで異なる組み合わせを試してみたのだが、-a1024のときが最も高速だった。ただしあなたも同じ結果になるとは限らない。当然ながらパラメータを変更する際には毎回前記の12回のテストを行なった。

 またmultcountの値についても-m初めから-m16まで変えてみたところ、-m16が最適だった。なお-m32も試してみたが、わたしのハードディスクではこの値を扱うことができないと警告するエラーが返ってきた。

 以上の変更を行なった結果、ハードディスクの速度を約11倍に上げることができた――なかなか悪くない結果だ。以上のほかにも試すことのできるオプションが後2、3個あるが、危険をともなう可能性がある。例えば「hdparm -u1 /dev/hda」として割り込みに関していじることや、「hdparm -X」コマンドを使って転送モードを変更することなどができる。今回これらについても試してみたが、特に高速化は見られなかったので元に戻しておくことにした。

 「設定した値はhdparm -k1 /dev/hda」を実行することにより保存することができるが、これは正しく最適化されていることが本当に確実になるまでは行うべきではない。その代わりの方法として、起動時に実行するコマンドを記述する /etc/init.d/boot.localファイルの中にhdparmコマンドを追加しておくことができる。ただしこのファイルは少なくともわたしが使っているopenSUSEシステムでは/etc/init.d/boot.localなのだが、ディストリビューションによっては異なるかもしれない。

 この時点で、ハードディスクは最高速度で動いているはずだ。そこで次にやや高レベルに移動し、ファイルのアクセスを最適化しよう。

       1|2|3 次のページへ

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ