デフォルトコンパイラをGCCからLLVM Clangへ

FreeBSD 10.0からはデフォルトのコンパイラが従来のGCCからLLVM Clangへ置き換わっている。FreeBSDプロジェクトはGPLv3のソフトウェアをベースシステムにマージしない方針をとっているため、これまではGPLv3にライセンスが変更される以前のGCC 4.2.1を使い続けてきた。古いコンパイラで、さまざまな面で最新の状況への対応が難しくなっていた。

そこでFreeBSDプロジェクトはコンパイラインフラストラクチャとしてLLVM Clangの採用を決定した。LLVM ClangはBSDライセンスで開発されており、開発も活発、LLVM ClangのコミュニティとFreeBSD開発者のコミュニケーションも円滑に進んでいる。さらにGCCと比較してコンパイル時間がとても短いという特徴がある。ビルドを繰り返すソフトウェアのプロジェクトにあってはソフトウェアのビルド時間が短いことは大きなアドバンテージになる。

% cc --version
FreeBSD clang version 3.3 (tags/RELEASE_33/final 183502) 20130610
Target: x86_64-unknown-freebsd10.0
Thread model: posix
% c++ --version
FreeBSD clang version 3.3 (tags/RELEASE_33/final 183502) 20130610
Target: x86_64-unknown-freebsd10.0
Thread model: posix
%
デフォルトのコンパイラはLLVM Clangへ

FreeBSDに限らず、同様の理由でGCCからLLVM Clangへ移行したプロジェクトはいくつもある。Linuxでもコンパイル時間の短さなどを理由にLLVM Clangでビルドできるようにする取り組みが行われている。

% gcc
cc is correct? [n,y,a,e]: n
zsh: command not found: gcc
% whereis gcc
gcc: /usr/src/contrib/gcc
% which gcc
gcc not found
%
GCCはデフォルトではインストールされない

LLVM Clangが出力するエラーメッセージはGCCのエラーメッセージと比較して理解しやすいという点も開発者に好まれる一因になっている。GCCのエラーメッセージでは原因が掴みにくいものでも、LLVM Clangでビルドするとエラー部分が理解できることが多い。開発のみならず教育向けのコンパイラとしても利用できる。

マルチコア/メニーコアで性能向上させる Unmapped VMIOバッファ

FreeBSD 10は従来のバージョンよりも大規模なマルチコア/メニーコアの性能が発揮できるようになっている。これはJeff Roberson氏およびKonstantin Belousov氏が開発した「Unmapped VMIOバッファ」という機能が理由になっている。FreeBSDカーネルは大規模なマルチコア/メニーコアのシステムに対してまだ性能を引き上げる余地があるとされており、「Unmapped VMIOバッファ」はそうした取り組みのひとつ。

VMIOバッファの作成と削除のタイミングですべてのコアに対してTLBの無効化の操作が実施されているが、この部分が性能のひとつのボトルネックになっている。この処理のなかでデータのコピーが発生するもののまったく使われることなく破棄されているものがある。「Unmapped VMIOバッファ」はこうした無駄な処理を実施しないようにする機能。この機能が取り込まれたことでいくつかの作業が高速化している。

高速ネットワーク通信機能 NetMap

動画配信やビックデータ処理(大量のログデータの処理、遺伝子情報解析、天文台データ処理、統計データ処理など用途はさまざま)、ネットワークの基幹部分の通信などではより高速な通信が求められており、10GbEや40GbEといったより高速なネットワーク通信が求められている。こうした高速通信のデバイスをより効率的に利用するための機能「NetMap」が統合されている点もFreeBSD 10のひとつの特徴といえる。

NetMapの機能は10GbEのみならず1000baseTのNICでも効果が期待できる。ハードウェア的にはNetMapを活用することでネットワームモニタやソフトウェアスイッチなどを開発しやすくなるという特徴がある。ネットワークを流れるパケットを取得して高速に解析する必要があるようなアプライアンスの開発に利用できる。

高速通信という面では費用対効果的にもInfiniBandに人気があるが、InfiniBandはドライバの提供されているオペレーティングシステムが限られており、さまざまな種類のノードが混在するような環境では使いにくい面がある。一方、10GbEや40GbEといったネットワークは利用できるオペレーティングシステムも多く、従来の技術の延長でシステムが構築できるという利点がある。