アプリケーションの性能を改善することで,Tru64 UNIX 全体の性能が改善できます。
この章では,アプリケーションの性能のガイドラインについて説明します。
詳細は,表 7-1を参照してください。
7.1 アプリケーションの性能改善
良くできたアプリケーションは,CPU,メモリ,および入出力リソースを効率的に使用します。
表 7-1は,アプリケーションの性能を改善する際のガイドラインを示しています。
表 7-1: アプリケーションの性能改善のガイドライン
ガイドライン | 性能上の利点 | 欠点 |
オペレーティング・システムの最新のパッチをインストールする (7.1.1 項)。 | 最新の最適化が反映される。 | なし |
最新バージョンのコンパイラを使用する (7.1.2 項)。 | 最新の最適化が反映される。 | なし |
並列処理を使用する (7.1.3 項)。 | SMP の性能が改善される。 | なし |
アプリケーションを最適化する (7.1.4 項)。 | 効率的なコードが生成される。 | なし |
シェアード・ライブラリを使用する (7.1.5 項)。 | メモリが解放される。 | 実行時間が長くなることがある。 |
アプリケーションが必要とするメモリ量を減らす (7.1.6 項)。 | メモリが解放される。 | プログラムの実行状態が最適でなくなることがある。 |
リアルタイム・プログラムの初期化処理でメモリをロックする (7.1.7 項)。 | 必要に応じてメモリがロックまたはアンロックされる。 | プロセスおよび UBC に使用できるメモリが減る。 |
以降の項では,上記の改善のガイドラインについて詳しく説明します。
7.1.1 オペレーティング・システムの最新のパッチをインストールする
常にオペレーティング・システムの最新のパッチをインストールします。 パッチには,性能改善が含まれていることがよくあります。
/etc/motd
ファイルを調べて,適用済みのパッチを把握してください。
パッチのインストールについての詳細は,カスタマ・サービスにお問い合わせください。
7.1.2 最新バージョンのコンパイラを使用する
常に最新バージョンのコンパイラを使用して,アプリケーション・プログラムを構築します。 通常,新しいバージョンでは,より高度な最適化が行われます。
システム上のソフトウェアをチェックして,最新バージョンのコンパイラを使用していることを確認してください。
7.1.3 並列処理を使用する
並列処理を強化するために,Fortran や C で開発しているアプリケーション開発者は,KAP (Kuch & Associates Preprocessor) の使用を検討してください。
これを使用すると,SMP の性能が大きく改善される可能性があります。
KAP の詳細については,『プログラミング・ガイド』 を参照してください。
7.1.4 アプリケーションを最適化する
アプリケーション・プログラムの最適化では,構築プロセスの変更やソース・コードの変更が必要になることがあります。 コンパイラおよびリンカのさまざまな最適化レベルを用いて,より効率的なユーザ・コードを生成できます。 最適化についての詳細は 『プログラミング・ガイド』 を参照してください。
32 ビットのシステムから Tru64 UNIX へアプリケーションを移植する場合と,新しいアプリケーションを開発する場合のどちらでも,アプリケーションのデバッグとテストを十分に行うまでは最適化しないでください。
C で記述されたアプリケーションを移植する場合は,lint
コマンドに
-Q
オプションを指定して使用するか,C コンパイラに
-check
オプションを指定してコンパイルすると,解決する必要がある移植上の問題があるか調べることができます。
7.1.5 シェアード・ライブラリを使用する
シェアード・ライブラリを使用すると,メモリおよびディスク・スペースの必要量が減少します。 複数のプログラムが 1 つのシェアード・ライブラリにリンクされている場合,各プロセスが使用する物理メモリの容量は大幅に削減されます。
ただし,シェアード・ライブラリを使用すると,最初の実行での実行速度が,静的ライブラリを使用した場合よりも遅くなることがあります。
7.1.6 アプリケーションが必要とするメモリ量を減らす
アプリケーションのメモリ使用量を削減することで,他のプロセスやファイル・システムのキャッシュのためのメモリ・リソースを増やせることがあります。 コーディングの際に以下の項目を考慮すると,アプリケーションのメモリ使用量を削減できます。
アプリケーションのインストレーション処理で示されるガイドラインに基づいてアプリケーションを構成し,チューニングします。 たとえば,アプリケーションに必要な可変メモリの削減,並列/多重処理属性の設定,共用グローバル領域とプライベート・キャッシュのサイズの変更,オープン/マップされたファイルの最大数の設定を行います。
アプリケーション内では,read
関数や
write
関数の代わりに
mmap
関数を使用することができます。
read
および
write
システム・コールはバッファ・メモリのページと UBC メモリのページを必要としますが,mmap
は 1 ページのメモリしか必要としません。
使用頻度の高いデータ構造体の間の,データ・キャッシュの衝突を探します。
これは,メモリ内に割り当てられている 2 つのデータ構造体の間の距離が,1 次 (内部) データ・キャッシュのサイズと等しい場合に発生します。
データ構造体が小さい場合は,メモリ内に続けて配置することで衝突を防止できます。
このようにするためには,malloc
を何度も呼び出さないで 1 度だけ呼び出すようにします。
アプリケーションが,大量のデータを短い時間だけ使用する場合,メモリを静的に宣言せずに,malloc
関数を使ってデータを動的に割り当てます。
動的に割り当てたメモリの使用を終えたときには,メモリを解放して,プログラム内でその後に発生する他のデータ構造体で使用できるようにします。
メモリ・リソースが限られている場合は,データを動的に割り当てると,アプリケーションのメモリ使用量が減り,実質的に性能が改善されます。
アプリケーションが
malloc
関数を頻繁に用いている場合は,関数の制御変数を用いてメモリ割り当てをチューニングすると,処理速度が改善され,メモリ使用量を削減できます。
メモリ割り当てのチューニングについての詳細は,
malloc
(3)
アプリケーションが 32 ビットのアドレス空間に納まっていて,多くのポインタを含む構造体を用いて動的メモリを大量に割り当てている場合は,-xtaso
オプションを使用するとメモリ使用量を削減できます。
-xtaso
オプションは,すべてのバージョンの C コンパイラ (-newc
,-migrate
,-oldc
バージョン) でサポートされています。
-xtaso
オプションを使用するには,ポインタの割り当てサイズを制御する C 言語のプラグマでソース・コードを変更します。
詳細は,
cc
(1)
プロセスのメモリ割り当てについての詳細は,『プログラミング・ガイド』 を参照してください。
7.1.7 メモリ・ロックを制御する
リアルタイム・アプリケーションの開発者は,メモリ・ロックをプログラムの初期化処理に必須の処理と考えなければなりません。 リアルタイム・アプリケーションの多くは,実行中はロックされたままですが,一部のアプリケーションでは,実行状況に応じてメモリをロック/アンロックした方が良いこともあります。 メモリ・ロック関数を用いると,関数呼び出しの時点からアプリケーションの存在期間全体を通じてプロセス全体をロックできます。 ロックされたメモリのページはページングの対象にできなくなり,プロセスはスワップ・アウトできなくなります。
メモリ・ロックは,プロセスのアドレス空間に適用されます。 プロセスのアドレス空間にマップされたページだけをメモリにロックできます。 プロセスが終了すると,ページはアドレス空間から削除され,ロックは解除されます。
プロセスのアドレス空間全体をロックするには,mlockall
関数を使用します。
ロックされたメモリは,プロセスが終了するか,アプリケーションが
munlockall
関数を呼び出すまでロックされたままです。
ps
コマンドを使用すると,プロセスがメモリにロックされてスワップ・アウトできない状態かどうかがわかります。
12.3.2 項
を参照してください。
メモリ・ロックは,子プロセス (fork 関数で生成) には継承されません。
また,プロセスに対応するすべてのメモリ・ロックは,exec
関数を呼び出したとき,またはプロセスが終了したときにアンロックされます。
詳細は,『Guide to Realtime Programming』と
mlockall
(3)