1月版 GCC 4.0向け最適化開始で2.95はオシマイ


上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2006/1/31

GCC 2.95サポート断念とGCC 4.0向けの最適化

 かなり以前から、カーネルが利用するスタックサイズを4kbytesに変更する「4K Stacks」の採用にまつわる議論が続いています。現時点でのx86用カーネル2.6では、カーネル空間におけるスタックサイズが8kbytesになっています。4K Stacksは、この8kbytesのカーネルスタックを「通常処理用4kbytes、割り込み処理用4kbytesに変更する」というものです。もともとは、貴重なlowmem領域を消費するカーネルスタック領域を1ページ単位に抑えたい、という要望が発端でした。しかし、これはカーネルスタック利用の自由度低下を招くため、予期しないスタック利用量増加が生じる場合のあるGCCのインライン化()との戦いとなりました。

注:関数呼び出し手続きのオーバヘッドを省略するため、関数として分離されている部分を関数ではないように展開する処理。局所変数として確保するスタックの存続期間が長くなるという副作用がある。

 GCC 3.x系列のインライン化アルゴリズムは、カーネルにとって好ましくないコンパイル結果を出力していました。そこで、現在のLinuxカーネルはコンパイラの自動インライン機能を無視する仕組みを取り入れています。

 Ingo Molnarは、インライン化の制御をGCCに任せ、さらにunit-at-a-time()の制御オプションを有効にするパッチを発表しました。GCC 4.0系列はインライン化のアルゴリズムが改善されているので、強制的に無視しなくてもうまく動作する。また、-fno-unit-at-a-timeを外してunit-at-a-timeを有効にすることにより、コンパイル後のコードサイズが小さくなる、というのが彼の提案です。

注:GCCのオプションで、ファイル全体を処理した後で最適化を行う。unit-at-a-timeを無効にした場合は、ファイルを上から順番に処理した結果になる。

 コンパイルオプションについての議論を通して明らかになったのは、長い間カーネルコンパイルにおいて標準的な地位を占めてきたGCC 2.95は、コンパイラにパッチを適用しなければSCSIドライバをコンパイルできないなど、すでに使い物にならなくなっている状態であるということです。そして、LKMLに投稿しているメンバーの多くがGCC 4.0系列を利用しているという現状でした。

 Andrew Mortonは、「もうGCC 2.95のサポートはあきらめましょう」として、そのためのパッチをLKMLに投げました。この変更はカーネル2.6.16に入る予定です。

iSCSI+スワップデバイスは危険!?

 iSCSIは、SCSIコマンドをネットワーク経由で送受信するためのプロトコルです。現状ではファイバチャネルやSCSIなど、専用のケーブルを使ってディスクを接続する方式が主流ですが、iSCSIを利用すればネットワークとディスク接続に関してはイーサネットケーブルに統一できます。その利点を考えると、今後はiSCSIで接続したディスクデバイス上にスワップデバイスを作成するケースも増えていくでしょう。

 そうした場合に重要なのが、メモリが足りなくなっている状態でもネットワークを動作させる必要があるということです。メモリ不足になってスワップアウトしようとしても、ネットワークスタックは通信用に別途バッファを確保する必要があり、そこでデッドロックになる可能性があります。

 Sridhar Samudralaは、そうした事態を回避するためのパッチを提案しました。彼のパッチは、SO_CRITICALというソケットオプションを利用してソケットを開くと、__GFP_CRITICALページプールからメモリを確保するように変更する、というものです。

 一方で、そもそもiSCSIの各デバイスはそうしたネットワーク用のバッファを事前に確保しておくべきなのではないか、という意見が出ました。しかし、例えばiSCSI経由でディスクを1000個接続しているシステムで、それぞれにバッファを確保しておくのは現実的ではないという反論がありました。また、ユーザー空間からどのアプリケーションもSO_CRITICALを指定できるというインターフェイスは、アプリケーションに乱用されるだけだろう、という指摘も出ました。

 今後、iSCSI上に作成したスワップデバイスを実用的にしていく過程に注目です。

mutexの実装は吉か凶か?

 David Howellsは、mutexをカーネル空間に実装しようと提案しました。

 セマフォ(semaphore)は、カーネルの中で排他処理などを実現するのに利用されている一方で、数を数える機能も持っています。カーネルの中ではセマフォをロックとしてしか使っていない部分が多いので、数を数える機能を利用していない場合を区別してmutexとして分離すればより高速で便利になる、というのが彼の主張です。この意見に対応して、Ingo Molnarは彼が行っているmutexの実装を投稿しました。-RTカーネルでは以前からmutexを実装していたようで、議論が盛り上がりました。

 Andrew MortonやLinusたちが参加し、どの命令がどのアーキテクチャでどれくらい高速か、いまこれだけの変更をすることに対するメリットがあるのか、という点が議論されました。

 mutexやセマフォはCPUアーキテクチャによってアトミックに動作する命令が違うため、CPUアーキテクチャごとに実装が違います。レジスタ・メモリ間での値の交換命令(XCHGやSWPなどの実装がある)か、メモリの値のアトミックな減算加算命令(lock decl)のどちらかしか実装されていないCPUアーキテクチャが多いようです。どちらの方法を採用しているかによって実装の利点や欠点も変わってくるようで、議論は続いていました。

 セマフォしか利用できないがためにコードが複雑になっている場合は、mutexが実装されると便利になります。一方、このパッチを適用するとカーネル全体にわたって手が入ることになるため、リスクも大きいようです。

-stableツリーの変化

 2005年12月にリリースされた-stableツリーは2つです。

  • 2.6.14.4(12月14日)
    ・kauditdがいてもサスペンドできるようにする
    ・ccissの修正
    ・IDEフロッピーのejectができるようにする
    ・i8kの修正
    ・libataのロックの修正
    ・ブリッジやbondingのネットワーク関連の修正
    ・serverworksのtlb flushの修正
    ・i82365のアンロードの修正
    ・ALSAのNM256の修正
    ・v4lのcx88の修正など
    ・invalidate_inode_pages2の整数オーバフローの修正
    ・HP nx8220のためのACPIの修正
    ・SELinuxのlistxattrの修正
    ・NETLINKの修正
    ・仮想端末のキーバインド変更をrootでのみ行えるようにする
    ・USB microtekドライバの修正
    ・ptraceがhugepageをさぐっているときのクラッシュの修正
    ・メモリをフリーしてから利用しているコードを修正する複数のパッチ
    など、25個のパッチ
  • 2.6.14.5(12月26日)
    ・NFSのセキュリティホール(CVE-2005-3623)の対応
    ・iPod接続関連で見つかったSCSIの修正
    ・sysfsがモジュールオフでも動作するようにする
    ・HIDのoopsの修正
    ・ネットワーク関連の複数の修正
    など、18個のパッチ

(以上、敬称略)

2/2

Index
Linux Kernel Watch 1月版
 GCC 4.0向け最適化開始で2.95はオシマイ
  Page 1
 HAVE_ARCH_XXXは悪だ
 メモリバリアの実装ってどうなっているの?
 mountコマンドの拡張
Page 2
 GCC 2.95サポート断念とGCC 4.0向けの最適化
 iSCSI+スワップデバイスは危険!?
 mutexの実装は吉か凶か?
 -stableツリーの変化

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間