このページは、Linuxのパフォーマンスをさらに向上させるTipsを紹介します。
これらの中には効果がないものや、逆効果のものや、間違っている情報までも含まれているかもしれません。効果を端的に確認できる尺度がありませんし、体感速度も変わりません。つまりは自己満足の世界です。そのくせリスクを増すものもありますので注意してください。
なお、「この情報は間違っている!」と指摘くださる方とか、「こんなTipsもあるよ」とか御存知の方を歓迎します。(ていうか、それを待ってます)
Kernelコンパイル時の設定
Memory Type Range Registerの設定
HDDドライバの最適化
キャッシュの最適化
シリアルポートの最適化
カーネルを再構築する際に、Makfileを書き換えておくことでより高度な最適化を得られるようにします。(たぶん、やりすぎると逆効果になる類のものだと思います) なお、最近のカーネルでは、Processor type and featuresにおいて、ただしく設定すると、機種固有のカーネルが生成されるようになりました。
"/usr/src/linux/Makefile"の修正
コンパイラの最適化オプションを変更することで高速なバイナリを生成できます。これをカーネルにも適用します。下記の行を例のように書き換えます。
HOSTCFLAGS=-Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -fno-exceptions
CFLAGS=-Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -fno-exceptions
主なオプション
-O6 |
最適化レベルの指定(向上) |
-fno-exceptions |
例外処理の省略 |
-funroll-loops |
ループアンロールの明示的指定 |
"/usr/src/linux/arch/i386/Makefile"の修正
コンパイラがCPU依存の最適化を行える場合は、以下のようなオプションを指定することで高速なバイナリを生成します。
ifdef CONFIG_M586TSC
CFLAGS := $(CFLAGS) -march=pentium -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=586
endif
-march=pentium |
CPU依存の最適化を実施 |
P6系のCPUを使用しており、Kernel ConfigrationのProcessor type and featuresにおいて、(PPro/6x86MX) Processor familyを選択している場合は、"ifdef CONFIG_M686"から始まる行を編集します。
ifdef CONFIG_M686
CFLAGS := $(CFLAGS) -march=pentiumpro -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=686
endif
K6-2やK6-3を使用している場合は、以下のようにします。(たぶん)
ifdef CONFIG_M586TSC
CFLAGS := $(CFLAGS) -march=k6 -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=586
endif
K6,MII,P6が持つMTRRを設定することにより、Xの描画を高速化することができます。これは、効果が目に見える珍しい類のTipsです。最近のXでは、カーネルでMTRRを有効にしておけば、X側で自動的にMTRRの設定を有効にしてくれます。
Kernelの設定、Processor type and features において、MTRR (Memory Type Range Register) support を有効にしておく必要があります。
K6-3+RIVA128の場合、shのコマンドラインで以下のように入力して、MTRRを設定することができます。
echo "base=0xe7000000 size=0x4000000 type=write-combining" >| /proc/mtrr
mtrrに関する詳細は、/usr/src/linux/Documentation/mtrr.txtを参照のこと。
効果の確認は、xengineなどのbenchmarkなどを用いて行うことができます。
IDEドライブのDMA設定を最適化し、ディスクアクセスを高速化します。
kernelの設定
Block devicesにおいて、
Generic PCI IDE chipset support
Generic PCI bus-master DMA support
などを有効にしておく必要があります。また、使っているチップセットがLinuxでサポートされていることが必要です。
hdparmによる設定
/sbin/hdparmを使用して、カーネルの設定を変更します。
hdparm -c1 -d1 -m16 -a128 /dev/hda
主なオプション
-c1 |
32bit I/Oの有効化 |
-d1 |
DMAの有効化 |
-m16 |
一括読込数 |
-a128 |
事前読込数 |
-t |
ベンチマーク機能 |
/dev/hda |
対象デバイス |
上記設定はLinuxを立ち上げ直す度に再設定する必要があります。
(安定性が確認できたら、rc.localあたりで自動で設定させましょう)
ディスクキャッシュの設定を変更することによって、ディスクアクセスをコントロールします。パフォーマンスを向上させたり、ディスクアクセスの回数を減らして、ノートPCのバッテリを長持ちさせたりすることができるようになります。
なお、データベースは通常、自分自身でキャッシュ制御を行うのが通例なので、データベースサーバの場合は、キャッシュを大きく取る必要はありません。
Kernelの設定
Filesystemにおいて、 /proc filesystem supportを有効にしておく必要があります。
/proc/sys/vm/bdflushの設定
echo "80 500 64 256 15 6000 6000 1884 2" >| /proc/sys/vm/bdflush
1番目のパラメタ |
ダーティバッファの割合(%) |
2番目のパラメタ |
一度に書込むページ数 |
6,7番目のパラメタ |
書込みまでの遅延時間 |
5,8,9番目のパラメタ |
不使用 |
/proc/sys/vm/buffermemの設定
echo "2 40 40" >| /proc/sys/vm/buffermem
1番目のパラメタ |
キャッシュへのメモリ割当ての最下限(%) |
2,3番目のパラメタ |
不使用 |
モデム-PC間の伝送は、ハードウェア的にデータ圧縮機能があるモデムとモデムの間の伝送速度の、4倍程度に設定しておく必要があります。例えばモデム-モデム間の伝送速度が、28.8kbpsや33.6kbpsである場合には、モデムとPC間の伝送は115200bps。56kbpsである場合には230400bpsとしておくと効率的な伝送が可能になる「場合があります」
通常シリアルポートにおける伝送速度の最大設定は115200bpsですから、230400bpsに設定できるかどうかはハードウェアにも依存します。割とPCMCIAタイプのモデムカードでは、設定を持っていることが多いようです。
正直なところ効果は期待していなかったのですが、230400bps設定にしてから、 Netscapeでテキストファイルが主体のページの閲覧している際に、これまで見たことの無かったような接続速度が表示されるようになっていますので、そこそこの効果があるのかもしれません。
setserialの設定
setserial irq 3 port 0x2f8 spd_cust baud_base 460800 divisor 2
COM2ポートの設定例です。もしノートパソコンでPCMCIAのモデムカードを使用しているのであれば、/etc/pcmcia/serial.optsにおいて、
# Options for 'setserial'
SERIAL_OPTS="irq 3 port 0x2f8 spd_cust baud_base 460800 divisor 2 "
のように記載すればOKです。
COM1にモデムをつないでいるのであれば、irqとio-portの設定を適切に修正してください。(一般的には、"irq 4 port 0x3f8"だと思います)
pppdの設定
/etc/ppp-onの設定を変更します。
最近はpppdを使っている人も少ないかとは思いますが。チャレンジしてみてください。ポイントは230400と接続速度を決め打ちしているところ箇所です。
#! /bin/sh
exec /usr/sbin/pppd debug lock modem crtscts /dev/ttyS1 230400 \
kdebug 0 0.0.0:0.0.0.0 \
noipdefault netmask 255.255.255.0 defaultroute \
connect /etc/ppp-on-dialer \
name [Your Login Name]
rpmコマンドを使用して、出来るだけ管理情報を壊さずに、システムを高速化します。
optflags: i386 -O2 -m486 -fno-strength-reduce