mod_luaを使い倒すためにリソース取得するLuaライブラリを作った

前回記事(Apache2.4.1のmod_luaをいきなり弄ってフックできる箇所を増やしてみたよ)と前々回記事(Apache 2.4.1のmod_luaでApacheに介入する(mod_rewriteの終焉?))とmod_luaがあればこれまで敷居の高かったApacheモジュール開発も人気が出てくるのではないかと思いだしている。それを促していくためにも、今回は少し使えそうなLuaのライブラリを作った。ライブラリの実装はC言語。C言語のライブラリと簡単に連携できるところもLuaの強みである。

続きを読む

Apache2.4.1のmod_luaをいきなり弄ってフックできる箇所を増やしてみたよ

mod_lua、色々触ってみた所、すごい簡単にモジュールっぽい動きが実装できて、可読性も良くて便利。

しかし、個人的にモジュール実装する時に良く使うのは、アクセスログ出力時のフック箇所(ap_hook_log_transaction)である。例えば、リクエスト毎にレスポンス処理前の最終段階であるap_hook_fixupsの段階でrusage()等でリソースの計測始めて、ap_hook_log_transactionの段階で差分を算出し、動的コンテンツ実行に利用したCPU使用時間等を計測する、といった使い方ができる。また、処理始めでカウンターを上げておいて、処理終わってログ書き込む段階でカウンター下げるといった使い方にもap_hook_log_transactionでのフックは便利だったりする。細かい話、コンテンツ処理するhandlerの前後で計ってもいいんだけど、hookに関数登録した方が分かりやすい。

しかし、mod_luaはそこでフックすることができない。これは面白くない。

だったら追加してやろう。ということで実装した。以下パッチ。

続きを読む

Apache 2.4.1のmod_luaでApacheに介入する(mod_rewriteの終焉?)

といいつつも、そこまで大したことはしていない。

luaという高速に動作する組み込み系のスクリプト言語で遊んでみたかったのと、それだったmod_luaで遊んでみればいいなと思っただけである。で、実際にmod_luaをコンパイルして遊んでみた。コンパイルオプションは以下。

./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --enable-modules=all --enable-mods-shared=all --enable-mpms-shared='prefork worker event' --enable-lua --enable-sed

後ろの方に–enable-sedとかあるが気にしない。

続きを読む

Webサーバのマルチスレッドでの実装における優位性をLinux Kernel 3.3のソースから読み解く

表題の通り、現行のカーネルの実装において、マルチスレッドとマルチプロセスでの実装の優位性はどういう所にあるのかを知りたい、というのが今回の調査の意図だ。

そのために、前提知識としてマルチスレッドとマルチプロセスの特徴について、カーネルのソースを見ていきたいと思う。カーネルの海に飛び込むには、やはり最新のLinux Kernel 3.3のソースを選択することにした。前置きの段階で少し長くなってしまいそうだ。ではカーネルの海に飛び込みたいと思う。

とはいっても、まずは最初の一歩が必要なので、当たりをつけようと思う。キーワードは、

  • マルチスレッド
  • マルチプロセス
  • コンテキストスイッチ
  • メモリ空間の共有
  • TLB(トランスレーション・ルックアサイド・バッファ)

である。

続きを読む

nginxの非同期I/Oとキャッシュ周りの実装について

nginx-1.0.14のソースを見ていく。非同期I/Oをどのようにくししているのか非常に興味がある。まずは、リクエストを受け取った後、どのようにファイルを非同期で読み込みそれをキャッシュとして扱っていくのか、また、非同期であることの優位性をどのように実装しているのかを紐解いていった。

まずは以下の「ngx_http_file_cache_read()」関数でキャッシュの読み込みや更新を行っている。

続きを読む