2008年12月

マルチコアの時代になれば、当然のごとく多重実行をいかにうまくやるか、というのがトレンドになってくる。しかしこれは非常に難しい。例えば、1995年の頃では、並列技術としては以下のような順序であっただろう。

  1. OSサポートの始まった最先端、マルチスレッド。n:m対応がかぎ。

  2. fork()によるマルチプロセス。オーバーヘッドも大きいので、prefork()

  3. 旧態依然とした非同期実行select()


しかし、これは時代とともに揺れ動いている。例えば、昨今のトレンドはもう違っていて

  1. C10K問題解決のための救世主、epollとかkqueueなどによる最先端非同期処理

  2. 成熟に向かっているマルチスレッド。ただし、n-m対応はカーネルレベルよりライブラリレベルが主。

  3. いまどきfork()


となって久しい。なにしろ最新の非同期技術は、ボトルネックをカーネルのソケット処理に押し込んでしまったので、もはやユーザレベルで出来るようなことはないに等しくなってしまった。

しかし、だ。最近出たGoogle chromeは、今時マルチプロセスモデルを採用する。他のブラウザが当然のようにマルチスレッドを使いこなすのに対して、だ。ブラウザのような場合は、性能面のオーバーヘッドはそれほどない。そして、プロセスが独立することによってサンドボックス化し、一部の影響を全体に及ぼさないようにしている。

そういえばIllustraがInformix Universal Serverになったときも、従来許されていたような関数がDataBlade内で使えなくなるなど、面倒な部分が目立ったものである。これもまた、マルチプロセスがマルチスレッドになることによる問題点である。おそらく性能面でプロセス<=スレッドなのはほぼ変わらないだろうが、使いやすさも考慮しないといけなくなりつつある。その点、おそらくRDBMS界隈では未だに旧態依然としたfork()を使っているPostgreSQLが有利なのだろうと思う。それがうまく生きるケースというのはなかなか見えてこないが。

おそらく商用のシステムなどの場合、OSのボトルネックの位置などを見越して、マルチスレッドとマルチプロセスの組み合わせなどということは頻繁にあるだろう。そのため組み合わせまで考慮し出すと大変なことになる。星の数ほどあるデザインの中で、適切なソリューションがなんなのかを考え続け、しかもその変化を見極めていかなければなぁ、とは思う。しかし、気を引き締めないと古い間違った意見にとらわれてしまいそうだ。

昨日は会社の宴会で飯食って帰る。日本だと居酒屋っぽいところで、だがこっちだとレストランでコースを食する感じ。まあ、あまり変わらない。
- 2.7にupgrade。automatic upgrader使えば何の苦もなく終了した。Dashboardが大幅に変わっている。
- 思い立ってメールやRSSの未読0を心がけるようにしようとする。
- Google chromeが正式版になっていたらしいので久々に起動。ことGoogleアプリについては圧倒的に軽いので、アプリ実行環境と思って暫く使ってみようかなと思う。
- Fx3.1Beta2は、会社で入れてみたがCPU100%張り付いたので3.0のまま継続することにする。Extension入れすぎのせいでやはり重い。

たまに技術的なことをちくちくすると楽しいものだ。

eAcceleratorを入れてみた。WP-SuperCacheに比べて明らかに早くなった。その代わりメモリ消費量が増えたが、素晴らしいの一言。
いい加減メールアドレスをgmailに統合する。正確にはgoogle appsのサブドメインに全部移行した。今の所このドメインからappsのメールアドレスに移動、spam以外をこのドメインのメールアドレスにアーカイブとして戻す形。あとはspamassassinとclamsmtpの停止だろうか。
publishToMixi導入。とりあえずこのポストもmixiに入れられるテストとなる予定。
tiarraのバージョンを割と最近のものにあげる。どっかのdeb作成者をつっついてみたら、唐突にupdateされていた(鬼畜

たまに技術的なことをちくちくすると楽しいものだ。

  • eAcceleratorを入れてみた。WP-SuperCacheに比べて明らかに早くなった。その代わりメモリ消費量が増えたが、素晴らしいの一言。

  • いい加減メールアドレスをgmailに統合する。正確にはgoogle appsのサブドメインに全部移行した。今の所このドメインからappsのメールアドレスに移動、spam以外をこのドメインのメールアドレスにアーカイブとして戻す形。あとはspamassassinとclamsmtpの停止だろうか。

  • publishToMixi導入。とりあえずこのポストもmixiに入れられるテストとなる予定。

  • tiarraのバージョンを割と最近のものにあげる。どっかのdeb作成者をつっついてみたら、唐突にupdateされていた(鬼畜

SQLはObsoleteだと言うなら、じゃあ次はどのようなソリューションであらねばならないか、と言うことにもふれないといけなくなるだろう。これには色々なものが考えられる。L.starは、以下のような要素が求められているのではないか、と思っている。

  • Relational Modelに代わる、もっとプログラミングフレンドリーなもの。

リレーショナルモデルは、ご存じの通りデータ表現形式としては完璧である(あるいは、かなり完全を期して設計されている - 以後、この辺の厳密性は考慮しない)。一方で、性能的にわかりやすかったとはとても言えない。正規化はデータの完全性をより高める。しかし、性能面の高さを保証する方法としては完璧ではない。「正規化しない方が性能が良い」とかいうたわごとが流通するのはそのためだ。実際にはRDBMSは進歩するに従って正規化したデータを賢く捌けるようになっているため、現在ではかなりの確率で(特に第一、第二ぐらいは)正規化した方が早い。なにしろそれが見えづらいことがRDBMSと言うシステムを欠点の多いものにしている。いやもちろんそれを扱う人間が本当は問題なのだが。

一方でこれまた、正規化したから常に早くなると言えるような状況も、未だ現れていない。そもそも第四第五正規化など、もはや何がどういいのかもさっぱり分からない。この複雑な正規化のさじ加減のコントロールをいつまで人間にやらせるのか。つまり何が言いたいかというと、適度に最適化されるような正規化状態が組みやすいような性能ドリブンなモデルが求められるのではないか。

  • クエリ言語として持つべきは物理構造に即したもの。Planningを標準でコンピュータ任せにすべきではない。

先の項目と重なるが、RDBMSの性能を維持しづらいのは、なにより論理的構造を記述することしかできないことにある。それゆえ、古いエンジニアのSQLノウハウは、たいていにおいてプランナの進化とともに役に立たなくなる。進化して、人間が任せっきりに出来るレベルになればいいのだが、そこもまだ遠い。複雑な副問い合わせが大量に現れるようなケースではお手上げである。

個人的には、そういう意味で「物理的」なクエリ言語、いきなりプランナ出力を構文木から作るようなものが必要なのではないかと思っている。いや、確かにプランナが介入することによってデータ質の変化に対応できるとか、お題目は素晴らしいのである。しかし一方で、現実にはデータモデルは頻繁に変化したりはしない。物理的な特性を入力できないために性能を損しているケースと、論理的な特性を記述していたために性能を得したケースはどちらが多いのだろうか。L.starは、正直自信をもって後者だと言い切ることは出来ない。というか、この2つは両方とも並立しうるのではないか、とまで思うのである。仮に「物理的」なプラン記述言語をここでQEL(Query Execution Language)とでも名付けると、SQL->QELコンパイラ(Explain表示)、QEL実行機、その両方を一貫して実行できるものを3つ用意すれば、いいとこ取りに出来るのでは無かろうか。あのクエリキャッシュのような、微妙なAPIも用意しなくて済むのだ。

  • 主に多数のCPUコアやマシンでの高性能を実現すべく、より並列性を考慮したトランザクションとストレージモデル

ACID属性を全て実現するためのRDBMSの構造は大変に美しいものであるが、ところどころでやはり難しい部分を抱えている。一貫性の維持、ロック、ロギングによる多大なオーバーヘッド。いずれも一朝一夕には理解しづらい。これを理解して性能を維持するのが非常に難しくなってきている。ある程度の自由度を与える方向には行きつつあるが、どうすればいいかというノウハウも、今の所十分ではない(これは、RDBMS側だけでなく、ユーザ側もそうである)

もちろん、制限を緩めることも大切なのであるが、もっと今後の性能向上を目指せるようなモデルを構築した方が良くないか。例えば具体的にはすぐ思いつかないが「よりパーティショニングしやすい」「より安定させやすい」「よりロックがかからない」と言ったことが挙げられないだろうか。

こうつらつらと書き連ねてきたが、結局のところここまでのはすべて

「今までのSQL-RDBMSは完璧を追求し過ぎて余計大変なことになっている。もっと現実的にいこうよ」

 

という一文に集約されるのではないかという気がしてきた。なにしろ70年代のIBMなどに代表される最先端(SQLもそれだ)は、いかに美しく完璧に、という理想を持って作られているものが多く、その「理想」が結果として間違っていた、あるいは時代とともに間違いになってしまったことが問題なのだろう。

そう考えると、実はそのようなアプローチはOODBにしろ何にしろ、何度も試みられているわけで、未だに効果的な手法は誕生していない。いややはり、また同じ繰り返しになるがGooglefs+MapReduce+BigTable(あるいはそのコピー品であるHadoop+HiveQL)なんかは、ある意味上記の部分を満たしている。BigTableはへんてこなカラムベースの定義だし、分散パーティショニングありきのアーキテクチャだし、おそらくSQLのようなフロントエンドは持たない。おおむねここに書いているようなのを満たしているように思われる。まあ、RDBMSがダメだなぁ、と言うことに今後なって、駆逐されていくとすればWeb2.0もたけなわとなり、SQL-RDBMSだけでは補いきれない大規模アプリケーションを動かすための標準が出てきた頃になるんじゃ無かろうか。それを逸すと、またSQLの天下が10年続くんじゃ無かろうかという気がする。

そのとき、自分が居るのはどっちの側だろうか。SQL側だろうか、破壊する側だろうか。はたまた関係ない道にいるのだろうか。

↑このページのトップヘ