現在JavaScriptの設定が無効になっています。このページを利用するにはJavaScriptの設定を有効にしてください。トップ全記事一覧テクノロジー2014.06.23細かすぎて伝わらないmdbmこんにちは、匿名希望の社員Mでございます。INCが、NoSQLのmdbmをオープンソースとして公開しました。JAPANでも10年以上もお世話になっているものです。https://github.com/yahoo/mdbmさて、この場面ではライトなユーザードキュメントや紹介を期待されているところですが、そんな空気感は一切無視して進行したいと思います。個人的にどうしても言っておきたい見所を一方的に紹介してみたいと思います。お願いします!剰余の演算処理は遅いKVSの基本的な処理は、keyからハッシュ値を算出しハッシュ値の剰余を用いて、valueを格納するデータ領域(page)を決定するアプローチとなります。この処理を忠実に実装すると次のような実装イメージとなります。pagesize;しかしながら剰余は非常に遅い処理ですので、仕様に一定の制限を加えることでマスク値を利用したAND演算で実装されています。Hashingと呼ばれるハッシュアルゴリズムの影響を強く受けています。Hashingの詳細はwikipediaをご覧ください。http://en.wikipedia.org/wiki/Linear_hashingこのアルゴリズムによりmdbmは、扱うデータサイズが大きくなれば、動的にHashTableを拡大することができる非常に便利な特性を持っています。冷静になって考えてみてみましょう。Hasingの管理用のテーブルを走査する計算コストは可能なら避けるべきです。mdbmをはじめ、多くのKVSでは最終的なデータのサイズの予想がつくのであれば、あらかじめ大きめのサイズでデータベースファイルを作成する方が好ましいでしょう。この辺の話に興味がありましたら、コードの「hashval_to_pagenum()」という関数から追いかけ、処理コスト削減を努力を見ていただければ幸いです。Counter)タイムスタンプを取得する方法にrdtsc命令を使用する一部の方々が大喜びするテクニックがあり、その一部を垣間見ることができます。x86系のCPU(AMDの一部を含む)のCPU上に実装されている、CPUクロックごとにタイムスタンプカウンタを利用しています。この実装はgettimeofday()がシステムコールとして実装されていてオーバヘッドが非常に大きかったときに大活躍だったテクニックです。CentOS6.x/RHEL6.xでは、gettimeofday()はユーザースペース(vsyscall/vdso)で実装されているためオーバヘッドは大幅に低減しています。CentOS5.x/RHEL5.xでも、次のパラメータをチューニングすることでgettimeofday()のオーバヘッドを改善できます。kernel.vsyscall64=1ちなみに、clock_gettime(CLOCK_MONOTONIC)を利用してしまえば良いじゃん。いうツッコミは全くもってその通りでございます。インラインアセンブラを駆使した組み込み系の爽やかな風をウェブ業界にいながら感じることができるところがYahoo!の楽しいところでございます。いつか私もインラインアセンブラーマスターになりたいものです。この辺の話に興味がありましたら、コードの「rdtsc()」という関数から追いかけていただければ幸いです。HUGETLBFSのサポートLinux環境では、mmapの性能を生かすためにメモリーファイルシステムのtmpfs/ramfsを利用できます。キャッシュのミスヒットによるコストも課題となります。このソリューションの1つがhugepageメモリーの利用であり、mdbmではこのファイルシステムに対する実装がされています。おわりにいかがでしたでしょうか。ロックの実装が気になって仕方のない卒業生のエンジニアの皆様懐かしく思っていただけましたでしょうか。JAPANと一緒に仕事をしていただけるエンジニアが増れば幸いでございます。ここまで読んでいただきありがとうございました。JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。JAPANのサービス開発を支える技術やデザイン、文化を発信しています。Reserved.このページの先頭へ。