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

» 2007年07月19日 03時54分 公開
[Federico-Kereki,Open Tech Press]
SourceForge.JP Magazine
前のページへ 1|2|3       

アプリケーションの読み込み時間を最適化する

 LinuxのプログラムのほとんどはELF(Executable and Linkable Format)形式になっている。ELFでは必要な全ライブラリではなくそれらへのリファレンスだけが含まれていて、実行時のコードのロードの際に解決(リンク)するようになっているため、通常はファイルのサイズが小さくなっている。

 これは古典的な時間/空間トレードオフの問題であり、ELFの場合、プログラムファイルの大きさは小さいが、ロードのために長い時間が必要となっている。同じライブラリを使用するプログラムは数多くあるので、ライブラリを共有することでメモリ空間も節約できる。また、小さいプログラムはたいていライブラリをほとんど必要としないので、リンクは通常は短時間で済む。しかし多数のライブラリを使用する大規模なプログラムでは、リンクにかなりの時間が掛かることもある。

 そこでもう少しディスク空間を使用してもよいという場合には、prelinkコマンドを使用することで、リンク作業を前もって行なってプログラムのファイル内にライブラリを一緒に保存しておき、読み込みが終わればすぐに実行可能になるようにしておくことができる。(厳密に言うとこれは正しくなく、実際にはプログラムが読み込まれる際に、プログラムをプレリンクして以来ライブラリが変更されていないかどうかライブラリの確認が行なわれる。しかしこの確認は瞬時に終わる)。

 ただし、プレリンクし始める前に、まずは/etc/prelink.confという設定ファイルに幾つか重要な項目を設定する必要がある。このファイルは、共有ライブラリがある場所をprelinkに伝える。また、プレリンク可能なプログラムすべてをプレリンクする-aオプションを使用する場合に、プレリンクするべきプログラムがある場所をprelinkに伝える。

 /etc/prelink.confの書き方は単純で、コメント(# から始まる行)と空行のほかに、以下のような行を追加することができる。

-l someDirectory

-h someOtherDirectory

-b someFilePatternToAvoid


-lの行では、処理するディレクトリを指定する。また-hの行は-lの行と同じだが、ただしシンボリックリンクの追跡も有効にする。-bの行は、処理するべきでない「ブラックリスト」のプログラムを示す(パターンで指定することもできる)。プレリンクすることのできないプログラムが前もって分かっている場合には、-bの行を適切に追加しておくことで、実行時にエラーメッセージが出ないようにすることができる。

 1つのプログラムをプレリンクするには、「prelink プログラム名」とするだけだ。プログラムをプレリンクすることが可能な場合は(不可能な場合もある)、元のバイナリファイルがより大きな新しい版で上書きされる。また「prelink -a」を実行することで、プレリンク可能なもののすべてをプレリンクすることもできる。この場合、設定ファイルの中の-lと-hで指定されたすべてのディレクトリを調べて、見つかったすべてのプログラムをプレリンクする。なお-nオプションをさらに追加して実行すれば「予行演習」をすることもできる。この場合すべての変更の表示だけを行ない実際には変更しないので、実際に実行したときに行なわれるはずのことを前もって確認できる。

警告:システム上のライブラリの数が多く、メモリの量が少ないときには、prelinkがメモリ量を節約するために-mオプションを追加する必要があるだろう。

 プレリンクしたファイルが気に入らない(あるいはライブラリが新しくなるたびに毎回更新するのが面倒になった)ときには、-uオプションを使用してプレリンクしていない元の状態に戻すことができる。従って「prelink -u プレリンクされているプログラム」を実行すれば、プレリンクされているプログラムを以前の形式に問題なく戻すことができる。

 プレリンクしたプログラムはほかのプログラムとまったく同じように実行することができるが、通常はロードの時間が短縮され、デスクトップの反応速度の向上を体感することができる。結果については異なる見方があるが、わたしが調べたほとんどの文書では明らかな高速化があると示されていた。今回は以下のような簡単なコマンドで時間を測定してみた。


prelink diff
time diff
prelink -u diff
time diff

 結果は期待の持てるものだった(人間がかかわる時間が含まれてしまうのを避けるために、ロードが終わった後すぐに終了するプログラムを試した)。もちろん今回行なったのは非常に小さな例にすぎないが、一般的な結果も同様のものになるはずだ。

まとめ

 性能の向上は、あらゆる場合において適切で現実的な目標だ。この記事で紹介した3つの案は、それぞれ独立しているが関連した方法であり、 Linux PCの全体的な速度を向上させることができる。手元のハードウェアからさらにもう少し魅力を引き出すことができるのは、やはりうれしいことだ。

Federico Kerekiはウルグアイのシステムエンジニア。20年に渡るシステム開発、コンサルティング、大学講師の経験がある。


前のページへ 1|2|3       

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ