SourceForge.JP: Open Source Software

LoginCreate AccountAdd BookmarkHelp

OpenSource Downloads

(7,661) Cabos
(2,622) 7-Zip
(1,956) HandBrake Japanese Language Version
(1,671) CrystalDiskInfo
(1,621) Tera Term
(1,111) CrystalDiskMark
(827) ffdshow
(589) Tween
(586) ギコナビ
10  (542) Amateras
11  (495) VirtualDubMod-jp
12  (460) NNDD - ニコニコ動画DL&再生ソフト
13  (456) MergeDoc
14  (437) SMPlayer
15  (401) えこでこツール
More >>

最近ブックマークされた記事

Linuxのパフォーマンスを改善する3つのTips

2007年07月17日 13:08 1 2 3
  • スラッシュドットにタレコむ
  • あとで読む
 同じコンピュータでも、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.25 MB/secに改善されていた。つまり元の速度から5倍も高速化したことになる!

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

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

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

 またmultcountの値についても-m1から-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なのだが、ディストリビューションによっては異なるかもしれない。

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

Federico-Kereki(2007年7月12日(木))
2009年10月09日 16:01 更新