「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法


投稿日:2014年3月19日
  • 32
  • 0



もはや様式美。「コンパイルあるある」

ccache

コンパイル待ちの時間は手持ち無沙汰なものです。仕方がないのでコンパイルしているソフトの公式サイトや参考書を読んで時間を潰していると、実は間違ったオプションでコンパイルしていることが判明。
再びコンパイルをやり直すはめに…。

そんな不毛な時間を短縮する方法を紹介します。

いくらパソコンが高速になってきたと言っても、Linux kernelMySQLなど、サイズの大きなものをコンパイルするには時間がかかります。
そうしたコンパイルにかかる時間を短縮してくれる便利なオプションとソフトを紹介します


makeコマンドの「-j」オプションを利用して高速化する

こちらはmakeコマンドのオプションです。
同時に実行できるジョブの数(並行処理の数)を指定します。「-j2」とすれば2つ、「-j3」とすれば3つ同時に作業してくれます。
また数字を付けずに「-j」とすると可能な限りジョブを増やします。しかし不用意にジョブ数を増やすとメモリ不足になり、逆に速度が低下するので注意してください。

適切なジョブ数については諸説ありますがおおよそ「CPUの数×2」が効果的です。
並行処理の得意なCPUや、Hyper-Threadingの有無など環境によって異なるので、最適な値は実際使用して試してください。

今回はAMD Phenom(tm) II X6という6つのコアを持つCPUで、メモリ2Gという環境で、Linux kernel2.6.18をコンパイルしました。

# make -j12

以上の設定で「-j」オプションを付けない状態で約40分だったコンパイル時間は、30分に短縮されました。125%高速化されたことになります。

ちなみにコンパイルにかかった時間を正確に調べたい場合は「timeコマンド」を併用すると計測できます。

# time make -j12

出力は以下の意味になります。「real time」だけ見れば実際にかかった時間が解ります。

real time(処理にかかった実時間)
user time(ユーザモードのCPU時間)
system time(システムモードのCPU時間)

ccacheを利用して高速化する

ccacheとはコンパイルしたデータをキャッシュし、変更がない場合はキャッシュを再利用するツールです。
そのため、一部の設定を変えて複数回コンパイルするような際に威力を発揮します。
1度導入すれば特別な手間をかけること無く自動で動作するので、ぜひ利用させていただきましょう。

ccacheの導入方法

ccacheEPELで提供されているのでリポジトリを指定してインストールします。
リポジトリの追加方法は「外部リポジトリの追加と、yum-prioritiesを利用した優先順位の設定」をご覧ください。

# yum install --enablerepo=epel ccache
(省略)
Dependencies Resolved

================================================================================
 Package          Arch             Version                 Repository      Size
================================================================================
Installing:
 ccache           x86_64           2.4-21.el5              epel            56 k

Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 56 k
Is this ok [y/N]: y ←インストールの実行の可否。Yesの「y」と入力してEnter
Downloading Packages:
ccache-2.4-21.el5.x86_64.rpm                             |  56 kB     00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : ccache                                                   1/1

Installed:
  ccache.x86_64 0:2.4-21.el5

Complete!

ccacheの設定

公式の設定方法の解説」にあるように、ccacheを利用するユーザーのホームディレクトリにある「.bashrc」に追記します。

書式

export USE_CCACHE=1
export CCACHE_DIR=<YOUR_CACHE_DIRECTORY>/.ccache

USE_CCACHE=1ccacheを有効にして、CCACHE_DIRでキャッシュを保存するディレクトリを指定します。

rootでccacheを利用する際の設定

# cd ←rootユーザーで
# vi .bashrc

最下部に追記します。

# ccache用
export USE_CCACHE=1
export CCACHE_DIR=/root/.ccache

CCACHE_DIRの後にディレクトリを指定しますが、余分なスペースが入ると以下のエラーが出るので注意してください。

bash: export: `/root/.ccache': not a valid identifier

これだけでccacheが有効になります。特別な設定は必要なく、単純に「make」とするだけです。2度目からコンパイル作業が高速化されます。
ccasheを有効にした状態で上記の「-j」オプションを併用したところ約30分だったkernelのコンパイルが10分にまで短縮されました。はじめの40分から比べれば400%高速化されたことになります。

ちょっとしたオプションを変更してコンパイルし直す」なんて作業にうってつけです。


番外編「分散コンパイルを実現するdistcc」

上記の方法でも満足できず更なる高速化を目指す方はdistccで分散コンパイルしましょう。
ネットワークで繋がった複数のパソコンで分散してコンパイルを行うという方法です。

同じ構成のパソコンで分散コンパイルをすると、ネットワークの環境にもよりますが、おおよそ170%程度に高速化されます。3台4台と増やしていけば240%310%と高速化していきます。
パソコンが余っている方や、稼働していないアイドル状態のパソコンがある方は試してみてください。

導入方法は「developerWorksのdistccでコンパイル時間を削減する」で詳しく解説されています。


以上、設定やソフトを利用して高速化する方法を解説しました。
これらの方法でも満足できない場合は、単純に高速なCPUを導入してください。何はさておき、一番効果がありますw


現在のページを共有する



現在のページに関連する記事

「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法 yum-utilsを使って/bootの不要なカーネルを削除する方法
「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法 yumコマンドで外部リポジトリを指定して、最新のPHPにバージョンアップ
「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法 CentOS5.9のMySQLを5.6.14にアップデートする方法
「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法 phpMyAdminのバージョンアップに合わせて、初期設定と拡張機能の有効化
「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法 外部リポジトリの追加と、yum-prioritiesを利用した優先順位の設定
「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法 CentOSでカーネルの再構築を行いカーネルモジュールを有効にする方法
「-j」オプションと「ccache」でコンパイル時間を400%高速化する方法 手軽にデータをグラフ化するGrowthForecastのインストールと使い方

おすすめの記事

fluentdとNorikraでDoS攻撃を遮断し、メールで通知する方法

fluentdとNorikraでDoS攻撃を遮断し、メールで通知する方法

パソコン用メガネなんていらない!無料でできる5つの疲れ目対策

パソコン用メガネなんていらない!無料でできる5つの疲れ目対策

Windows 10でpsd形式のファイルをサムネイル表示する方法

Windows 10でpsd形式のファイルをサムネイル表示する方法

自前の国別IPv6、IPv4アドレス割当リストを作成しよう

自前の国別IPv6、IPv4アドレス割当リストを作成しよう

Apacheのmod_deflateでコンテンツを圧縮してサイトを高速化する方法

Apacheのmod_deflateでコンテンツを圧縮してサイトを高速化する…

Apacheのmod_expiresでファイルタイプごとにキャッシュをコントロールする方法

Apacheのmod_expiresでファイルタイプごとにキャッシュをコント…

WordPressの新・旧ループからカスタムクエリ・アーカイブまで徹底解説

WordPressの新・旧ループからカスタムクエリ・アーカイブまで徹…

今さら聞けない、変数や関数の命名規則と、まず覚えるべき英単語200

今さら聞けない、変数や関数の命名規則と、まず覚えるべき英単…


コメントを残す

コメントは認証制のため、すぐには反映されません。

プログラミングに関する質問は「日本語でプログラミングの悩みを解決するQ&Aサイト sukegra」をご利用ください。