ワーキンググループがハブとして機能することで、ドライババックポートのインタフェースを簡素化する
Linuxカーネルはバージョンアップのたびに新しいドライバを取り込んでいるが、新しいドライバを既存のディストリビューションで利用するためには、ドライバをバックポートする必要がある。現在認識されている問題とは、ドライバのバックポートとバックポートしたドライバの配布がコンポーネントベンダー(ドライバ開発者)やシステムベンダー、ディストリビューターごとに行われていて、それぞれが十分に連携できていないこと。そして、関係者間のインタフェースが整理されておらず「“うどん”のような状態」になっていることだという(Oberhauser氏は今回の来日で初めてうどんを食べたそうである)。こうした状況はエンドユーザーを混乱させるだけでなく、トラブルが発生した際に十分なサポートが得られないという状況を生み出している。
そこでDriver Backports & Distribution workgroupでは、この問題を解消するためのドライバのバックポートと配布に関する標準プロセスを確立しようとしているそうだ。ただし新しいドライバと言っても、その利用形態は新しいデバイスを既存システムに追加するケースもあれば、既存のドライバを新しい修正版で置き換えるケース、新しいサーバで既存のディストリビューションを利用するケースなどさまざまであるため、それぞれのケースごとに配布方法を標準化する必要がある。同ワーキンググループでは、ケースごとの要件を整理して、今年7月開催のOttawa Linux Symposium 2008に間に合うようにホワイトペーパーを作成・公開する考えだ。そして将来的には、Linuxの標準仕様であるLSB(Linux Standard Base)にドライババックポートに関する要項を盛り込み、ドライバの標準配布プロセスがLSB準拠のディストリビューションで機能するようにしたいとのことである。
メモリ管理の現状と問題
続いてSGIのChristoph Lameter氏から、Linuxのメモリ管理機構(VM)に関する現状と問題点についての講演「Memory Management Under Linux: Issue in Linux VM development」が行われた。
講演の冒頭でLameter氏は「Linuxのメモリ管理における普遍的な課題は、システムのプロセッサ数とメモリ容量が増大するにつれて、VMがどんどん複雑化しつつあることであり、個人的にここ1、2年の問題として心配しているのはページサイズが4KBのx86_64のシステムにおいて10億オーダーものページ群を管理しなければならないことだ」と述べた。ちなみにx86_64における問題は64KBページを導入することで解消でき、そのためのパッチもすでに存在するそうである。ただし、そのパッチがカーネルに取り込まれて実際の運用現場で利用できる状態になるまでは、現在の仕組みで持ちこたえなければならないとのことである。
続けてLinuxのVMのコンポーネント構成について簡単に解説したあと、Lameter氏は以下のようなLinuxにおけるメモリ管理の原則を紹介した。
-
搭載されているメモリはすべて使用する:使用されていないメモリは無駄でしなかない
-
割り当てたメモリは理由がない限り解放しない
-
メモリは用途ごとに“ゾーン”に分けて管理する(レガシーIOデバイス用メモリ、解放可能なメモリなど)
-
NUMAは(ノードごとの)多数のゾーンを持ったシステムとして扱われる
-
NUMAにおけるメモリ管理の要点は、プロセスにメモリを割り当てる際のゾーンの選択(どのゾーンからメモリを確保するか)にある
こうしたメモリ管理についての基本的なガイダンスをしたあとでLameter氏は、最近VMに取り込まれた新機能を解説した。解説された機能には以下のようなものがある。
-
Device based dirty throttling:低速デバイスによって生じるダーティページ(ディスクに変更が反映されていないページ)に制限されて高速デバイスの動作が低下する問題を解決する機能。ダーティページの書き出しタイミングをデバイスごとに調整することで、デバイス間の依存関係を低減する。
-
SLUBアロケータ:従来のSLABアロケータに代わるメモリ管理機構。SLABアロケータはあらかじめ確保しておいたキャッシュからメモリオブジェクトを作成することでメモリ割り当て処理を高速化する。しかし、プロセッサ数が数千のオーダーを超えるNUMAシステムでは、効率が低下するとともに、キャッシュ管理のために消費されるメモリ領域が無視できない大きさになってしまう。SLUBアロケータはキャッシュ管理のための仕組みを簡素化することで、この問題に対処する。
-
Cgroup(Control Group):リソースをグループ化して管理するためのフレームワークで、仮想メモリ管理においてはLRU(Least Recently Used)アルゴリズムによるページスワッピングをグループごとに行えるようにする。SMPシステムや小規模NUMAシステムでは有効だが、大規模NUMAシステムに適用するにはまだ改善が必要。
このあとLameter氏は、まだカーネルに取り込まれていないもののすでに解決策が存在する問題(冒頭のx86_64のページサイズの問題など)と対策が講じられつつある問題、認識はされているが手つかずの状態にある問題(デバイスやサブシステムによるメモリピンニングの問題など)について説明した。例えば、デバイスやサブシステムによってメモリのピンダウンが生じるといった問題にはこれといった有効な対策がないとのことである。
氏の講演ではさまざまな問題が指摘されたため、Linuxが問題だらけであるような印象を受けなくもない。だが、その多くは例えば大規模NUMAシステムにおいてのみ発現するような局所的な問題であり、しかも大抵はパフォーマンスが十分にスケールしないなどといった類の問題であってシステムが機能不全に陥るような致命的なものはなかったようである。問題によってはアプローチの異なる複数の改善案が提出されているものもあり、「LinuxのVM周りでハイレベルなチューニングが続けられている」というのがLameter氏の講演から抱いた感想である。
HAクラスタの市場を拡大するLinux-HA
昼の休憩後に再開された講演では、まず、Linux-HAプロジェクトの創始者でありリーダーであるIBMのAlan Robertson氏から、Linux-HAを紹介「World Class HA with Linux-HA」が行われた。
Robertson氏は、HAクラスタは「100%の可用性を実現するものではない」と最初に断ったうえで、「低可用性なシステムを望むユーザーはいないのに、HAクラスタが使われないのはなぜか?」と聴講者に問いかけ、その原因は大きく分けて「ハードウェアコストの増大」、「ソフトウェアコストの増大」、「システムの複雑化」、「HAクラスタの仕組みが標準化されていない」の4点であり、このうち一番やっかいなのが複雑性の問題であると指摘した。そして、ハードウェアコストはすでに十分低下しており、ソフトウェアコストもLinux-HAのようなオープンソースのソリューションであれば問題にならないため、(複雑性の問題はあるものの)Linux-HAはHAクラスタのユーザー層を個人レベルにまで広げる可能性があると述べた。実際、Robertson氏は自宅のサーバをLinux-HAでクラスタ化しているそうである。
Robertson氏はHAクラスタにおける基本的な仕組みを解説したあとで、話題をLinux-HAに移した。Linux-HAは、Heartbeatを中核コンポーネントとするHAクラスタウェアであり、Heartbeatはシングルシステムにおけるinitプロセスと同じような機能をクラスタに対して提供する。また、Linux-HAは特別なハードウェアを必要とせず、ユーザースペースで動作するためLinuxカーネルのバージョンに依存せず利用することが可能。最大ノード数は16で、アクティブ/パッシブ(純粋なHA)、アクティブ/アクティブ(HA+HPC)のどちらでも利用可能。Linux-HAは、このほかにも以下のような特徴を持っているという。
-
強力なポリシーエンジン
-
さまざまな条件によるフェイルオーバ
-
クローンリソース
-
マスター/スレーブ・リソース
-
仮想化サポート(仮想マシンのマイグレーション機能を)
-
ディザスタリカバリ向けの遠隔サイトサポート
このなかでも仮想化サポートは、サーバ仮想化がIT業界の注目トピックとなっている昨今では重要な機能といえるだろう。仮想化によるサーバ集約はハードウェアトラブルに伴うリスクを増大させる(1台の物理サーバのダウンが多数の仮想サーバのダウンにつながるため)が、物理サーバをHAクラスタ化することでそのリスクを低減することができるという。Linux-HAの仮想化サポートは、仮想化ソフトウェアの種類にかかわらず利用できるそうである。
最後にRobertson氏は、Linux-HAで今後の改良が必要となる項目として以下のようなものを挙げたうえで、「将来的にどのような機能が必要となるのか皆さんで考えて教えてほしい」と聴講者に語りかけ、講演を締めくくった。
-
仮想マシン管理の改良
-
より多くのノード数への対応
-
ドキュメントの改善
-
ユーザビリティの改善
-
クラスタファイルシステムとの統合
-
ハードウェア(サーバ、ストレージ)の監視機能との統合
-
構成履歴のトラッキング
-
省電力を意識した電源管理機能
水平方向の拡張とネットワークにおける課題
午後2つ目の講演は、Red HatのDavid S. Miller氏による「Horizontal Scaling and its Implications for the Linux Networking」。Miller氏はLinuxカーネルのネットワークサブシステムのメンテナーを務める人物だ。この講演で氏は、コンピューティングのトレンドが水平方向の拡張性に向かっている現状を解説し、それがLinuxにどのような影響を与えているのかを説明した。
最初にMiller氏が題材として取り上げたのは、プロセッサの進化の歴史である。氏は、現在のプロセッサが備える各種機能が主にメモリレイテンシを隠蔽するために追加されてきたものであると説明し、パイプラインやキャッシュ、スーパースカラーおよびそれらの多段化・大規模化は垂直方向にスケールするための拡張であり、水平方向への拡張が始まったのはIntelのPentium 4のハイパースレッディング以降であると指摘。そしてこの傾向を最大限に具現化したものがSunのNiagaraシリーズであるという。Niagaraは非スーパースカラーのコアを8つ備えており、コア当たり4同時スレッド(Niagara 2は8同時スレッド)をサポートする。実行スレッドの切り替え機構は極めて単純であり、各スレッドをランドロビンでスイッチするだけ。分岐予測も行わない。多数のシンプルなコアでプロセッサの作業負荷を高めることで、メモリレイテンシの影響を下げるという新しい考え方で設計された、エポックメイキングなプロセッサと言える。
次にネットワークに話題を移したMiller氏は、ネットワークのEnd-to-Endの原則を紹介した。
-
プロトコルの処理はエンドノードのなるべく近くで行う
-
エンドノードがスマートであればネットワークは単純な土管でよい
-
演算集約型の処理はネットワークのエッジからなるべく離れた場所で行う
そしてこの原則をうまく適用した例としてMiller氏が挙げたのがDNSである。DNSは分散した多数のサーバが協調動作することで機能しており、ドメインレベルごとの権威を分散することでスケールするようにできている。一方、悪い例として挙げられたのがHTTP(Web)だ。Webサーバは一極集中型のネットワークモデルに基づいており、たとえるならばルートネームサーバしかないDNSのようなものであるという。しかも、動的コンテンツが主流になっている昨今では、Webキャッシュやレプリケーションサーバは部分的な解決策にしかならないため、効率よくスケールさせることができない。
この2つの例を下敷きとしてMiller氏は、「ネットワークサービスをスケールさせるためにはローカルキャッシュをうまく利用する必要があり、そのためにはプロトコルを注意深く設計しなければならない」と訴える。具体的にはクライアントは「サーバXに情報Yを要求する」のではなく単純に「情報Yを要求する」ように設計し、Yを特定する方法とデータの整合性を確保する方法を実装する。その現代的な例がBitTorrentであるという。
さらに、このEnd-to-Endの原則を手元のコンピュータにまで拡張すると、システム内の各プロセッサをそれぞれ独立したエンドノードとしてみなすことができるという。そして、エンドノードにネットワークを介して(単純な情報ではなく)何らかの処理が送られてくるようになる。このような状況になってくると、ネットワークから送られてきた処理をシステム内で負荷分散する仕組みがネットワークデバイス(ネットワークカード)に必要になるが、そうした仕組みは別の問題――例えばパケットのリオーダリングによるパケットロス――を引き起こすことにもなりかねない。そこで、パケットを処理ごとにグループ化して管理するために、PCI MSI-X割り込みに対応したマルチキューのネットワークデバイスが開発されている。Miller氏がそうした製品の例として紹介したSunのNEPTUNE 10 Gigabit Etnernet chipsetは、TXパケット用とRXパケット用のキューをそれぞれ複数持つことができ、キューを仮想マシンのゲストノード(XenのdomU)に割り当てることもできるそうである。
さて、こうしたネットワークデバイスの登場に対応するために、Linuxのネットワークサブシステムにも変更が加えられている。変更されたのはRXパケットを処理するためのポーリング機構であるNAPI(New API)であり、従来はネットワークデバイスごとに1つのコンテキストしか保持できないかったものが、複数のコンテキストを扱えるように改良されたとのことである。ただし、TXパケットにおけるマルチキュー対応は不完全な状態であり、TXパスのロックのマルチスレッド化、マルチキューに適したTXパケットスケジューラの構成変更、ドライバから共通して利用できるTXロードバランスレイヤとその構成をユーザースペースから設定するためのインタフェースの追加といった作業が必要であるとのことだ。
カーネルコミュニティでうまく立ち回るには
The Linux Foundation Japan Symposiumでは、毎回日本人開発者による講演が少なくとも1つ行われるのが恒例となっているが、今回は日立の大島 訓氏による「Linuxにおけるリソース管理の改善」と題された講演が行われた。この講演で大島は、日立の開発者によって作成されLinuxカーネルに取り込まれたパッチを2つ紹介した。
1つ目は河合英宏氏によるcoredump maskingで、これはアプリケーションがクラッシュした際にどのタイプのメモリ領域のコアを取得するのかをプロセスごとに指定できるようにするものだ。もともとの発想は、巨大な共有メモリを利用するマルチプロセスのアプリケーションがクラッシュした際に、プロセスごとに共有メモリをダンプするのはディスクスペースおよび時間の無駄であるという考えである。完成したcoredump maskingでは、「anonymousかつprivate」、「anonymousかつshared」、「file-backedかつprivate」、「file-backedかつshared」という4タイプの領域ごとにコアダンプを取るかどうかを設定することができる。
2つ目はUDPでもカーネルが使用するメモリの上限値を設定可能にするパッチで、こちらは大島氏と青木英郎氏、安井隆弘氏によるもの。従来のLinuxカーネルにはUDPソケットバッファのサイズに上限がないという問題があり、これを悪用するとシステムがダウンするまでカーネルページを無制限にピンダウンするといった攻撃がユーザースペースから実行できてしまうそうである。そこでこの問題に対処するためにパッチの開発に取りかかったものの、当初はTCPのメモリアカウンティングと同様の機能をUDPに実装する方針だったものが、最終的にはTCPのメモリアカウンティングを削除して新たにstream/datagram汎用のメモリアカウンティングを実現するものになったそうだ。
大島氏の講演では、それぞれのパッチをLKML(Linux Kernel Mailing List)で提案した際にどのようなフィードバックを受けて、どのように設計・実装を変更したのかといった開発経緯の説明に重きが置かれていた。大島氏がLKMLでのやり取りから得た教訓には、以下のようなものがあるそうだ。
-
機能をカーネルで実現する必要性を明確に述べる
-
各々の提案の長所/短所を整理する
-
反対する人がいても諦めない(最終的にメンテナが納得すればなんとかなる)
-
テストはしっかりやる
-
大きな変更を恐れず、最初から問題点をすべて相談したほうが良い
-
早いうちのupstreamにパッチを投げてみる
以上、本稿では第7回 The Linux Foundation Japan Symposiumの講演内容を紹介した。