Linuxのパフォーマンスを改善する3つのTips - SourceForge.JP Magazine : オープンソースの話題満載
あらゆる最適化について言えることだが、何らかの簡単なベンチマークを行なわなければ、結果を本当に向上させることができたのかどうかを知ることはできない。Linux PC上では通常、数多くのプロセスが走っていて、それらが性能の測定に影響を与える可能性がある。その影響を最低限に抑えるために作業はランレベル1で行なうようにしよう。ランレベル1は、最低限のプロセスのみを実行するシングルユーザモードだ。ランレベル1で作業を行なうためには、ALT-F1を入力してコンソールに切り替え、ルートとしてログインして「init 1
」コマンドを実行する。その結果ほとんどのサービスとアプリケーションが終了するので、ばらつきのない結果を得ることができる。
しかしランレベル1においてもさらに、走っているべきでないプロセスがないかどうかを「ps xaf
」コマンドを使って確認しておいた方が良いだろう。私の場合、ddclient
プログラムが実行されていて(厳密に言うとスリープしていて)、最適化の結果に影響を与えかねなかったため、「killall ddclient
」を実行して終了した。
ハードディスクの速度を最適化する
最適化の最初のターゲットはハードディスクだ。「cat /etc/fstab
」コマンドとmount
コマンドを使用すれば、現在使用しているハードディスクを確認することができる。私の場合「cat /etc/fstab
」の実行結果は次のようになった。
マザーボードにUSBを接続する方法
/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倍も高速化したことになる!
SVGAおよびVGAとは何か
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
」という設定にしたときだった。このようにmultcount
とreadahead
を最適化した結果、ハードディスクの速度は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なのだが、ディストリビューションによっては異なるかもしれない。
この時点で、ハードディスクは最高速度で動いているはずだ。そこで次にやや高レベルに移動し、ファイルのアクセスを最適化しよう。
0 件のコメント:
コメントを投稿
登録 コメントの投稿 [Atom]
<< ホーム