今日は先日来社したtkh夫妻を囲んでお昼を食べる日。 妻とともに銀座へ。
11:30にJR有楽町駅の改札口で待ち合わせて、ガード下のスペイン料理のお店「ギーニョギーニョ」へ。 場所を決めていなかったので朝webで検索してあたりを付けておいたのだが、ゆっくりできたしなかなか良かったんじゃないかな。 バイキングが自分の好きなペースで食べれるかなと、最初は以前にもいった事もあったジョン万次郎にしようと思っていたのだがWebで確認したら銀座店は無くなっているようだ。
ギーニョギーニョは駅から近いし、時間制限がないし(日曜はランチ終了15:00までOK)、ちょっと集まる時にはいいのかも。 味はそこそこかな。料理はもう少し品数が多いといいんだけれど。 出来上がると店員が祭りのように大騒ぎして店内を巡ってから給仕が始まるパエリアは、ちょっとカタめでイマイチだった。 デザートは食べなかったので不明。 加藤茶のヅラtopのちょび毛みたいなくねくねチョコの乗った洋菓子が気になったかな。
今回はtkh夫妻、研究室が一緒だったやまだ君、花田君と我々夫婦の6人。
計算機談議に終始した昔とは違い、子育て・住まい・株などの話題も多くのぼりある意味衝撃的であった。大人らしくなってきたのか? ま、計算機の話ももっとモリモリしたかったけどね。
やまだ君が研究室から EOS-10Dを持ってきていた(持ってきてと頼んだ)。 やはり一眼レフはいいね。レスポンスがいい。
年末には1Fしかのぞかかなかったんだけれど、今日はきちんと4Fから1Fまで見てまわってみた。 tkhは sourceforge から iTerm をデモ端末にダウンロードして、他マシンにログインしてメールチェックしてた。ふふふ。
ゆっくり見てまわってから、お店の前で解散。 また帰国した際には飯食いましょう。
ディスク容量が結構やばくなってきたので、ホームにインストールしていた Ruby とともに、影舞を削除・www.naney.org BTS を停止。
WiKicker の高速化に Memcached が使えないかいろいろいじってみる。 評価は今のところ「微妙」。 Memcached はメモリキャッシュを提供するデーモンプログラムで、キーと値の配列を記憶しておいてくれる。 Slashdot でも使っているらしい。
ホスティングサービスのサーバ(FreeBSD 4.4-RELEASE)に入れてみる。
依存している libevent と一緒にビルドしてインストール。
cd /tmp wget http://www.monkey.org/~provos/libevent-0.7c.tar.gz tar zxvf libevent-0.7c.tar.gz cd libevent-0.7c ./configure make cd .. wget http://www.danga.com/memcached/dist/memcached-1.1.10.tar.gz tar zxvf memcached-1.1.10.tar.gz cd memcached-1.1.10 CFLAGS='-L../libevent-0.7c -I../libevent-0.7c' ./configure --prefix=$HOME/local/memcached-1.1.10 make make install
'-l' オプションがうまく動かない。
bind(): Can't assign requested address failed to listen /PRE
指定しなくても動くのでとりあえず、よしとする。
ちなみに、EVENT_SHOW_METHOD=1 の結果は以下の通り。
$ EVENT_SHOW_METHOD=1 ./memcached libevent using: kqueue
Perl 用の API モジュールを入れておく。 make test でこける。
Your vendor has not defined Socket macro MSG_NOSIGNAL
use Socket qw(MSG_NOSIGNAL PF_INET SOCK_STREAM); のところ。 Solaris/*BSD だと駄目らしい。 CVS版だと解決されいるようなので、こちらを。
cvs -d :pserver:anonymous@danga.com:/home/cvspub checkout wcmtools/memcached/api/perl
でとってくる。 こちらは Perl 5.005_03 という古いバージョンでいくつか問題。
our $SOCK_TIMEOUT = 2.6;
のところの our は Perl 5.005_03 には無いので、use vars に置き換え。 use bytes も 5.005_03 に無いのでコメントアウト。
IO::Handle::blocking() も無い。
sub my_blocking { my ($sock, $bool) = @_; my $old_flags = fcntl($sock, F_GETFL, 0) or die "Can't get flags for the socket: $!\n"; if ($bool) { my $flags = fcntl($sock, F_SETFL, $old_flags | O_NONBLOCK) or die "Can't set flags for the socket: $!\n"; } else { my $new_flag = $old_flags & ~O_NONBLOCK; my $flags = fcntl($sock, F_SETFL, $new_flag) or die "Can't set flags for the socket: $!\n"; } return $old_flags & O_NONBLOCK; }
...でいいのかな? ささっと書いたんで一部バグっているかもしれないが、とりあえず代替しておく。
ちなみに Cache::Memecached の古い版、MemCachedClient-1.0.7 も試してみたけれどこちらも IO::Socket::INET が必要だったり面倒(なので、1.0.11 のパッチ当ての方をがんばった)。
うーん。思ったほど速くないな。 いや手元のLinuxだとかなり速いんだけれど、FreeBSD だとそうでもない。 Client側の問題が大きいようだ。 下手するとLinux BOX からADSL経由でキャッシュを読み込む方が、FreeBSD のローカルホストから読むより速かったりする。
どうも Socket の接続/切断まわりでもたついている感じである。 (無駄なはずなのだが)毎回 disconnect_all してしまった方が、Benchmark の値が良かったりするし。 接続 -> キャッシュ取得 -> 切断 で 0.6秒というのはちょっと遅すぎる。 もうちょっといじってみれば実用的な速度になるのだろうか?
昨日送ったはずのメールが届いていないようだ。 確認したら Mew の draft に残っていた。 再編集しようとしたら化けたので kill。 draft からも消えてた。
30分かけて書き直し。
もう一度確認したら、昨日思っていたほどより遅くなかった。 また、CVS版では、Cache::Memcached の new オプションで select_timeout でちょっと大き目の値を指定してあげると(デフォルト 1.0)「selectがタイムアウト→ socket がクローズされる」事がなくなってそこそこいい速度が出るようになった。 ちなみに Cache::Memcached 1.0.11 にはまだこのオプションはない。
うん。これなら高速化に使えるかも。
WiKicker の機能のうち、ヘビーな処理が必要なものの筆頭に検索機能がある。 今のところ単純に全ページに対してマッチング処理を行うのでページ数が増えるに従い遅くなってくる。 ロボットの総ナメが怖い*1ので NaneyOrgWiki では load average が 5 を越えたら一時的に検索機能が停止するようになっている。
そこで Memcached を使って検索結果をメモリキャッシュするようにしてみた。 本当はWikiPageのパース・レンダリング結果をキャッシュして、通常のページ表示を高速化したいと考えているのだが、今はまず影響の少ないところから(何でもいいから Memcached を使ってみたいというのが本音)。
で、実装してみた。 キャッシュがヒットすればすばやくレスポンスを返せるはずなのだが...やはり微妙だな。 速くなった気もするのだが、サーバの状態によってかなり遅い時もあるようだし。 まずはこれでしばらく運用テストしてみて、効果がありそうだったら他の部分にも適用することにしよう。
本日移行。IP アドレス、DNS サーバ、メールサーバ、Web サーバを一斉入れ換え。
午前中にはJPRS側の設定が変更され一時的に名前が引けなくなる。 午後、ADSL側開通(フレッツADSL 12M からサービス変更)。 ほぼ順調。
ただし、中からADSL経由で外へ出ていけない(別の人がルータの設定に苦戦)。 OCNエコノミー側から外へ出れるのだが、」OCNエコノミー側の IP アドレスの正引きがキャッシュされていて古い名前が引けるけど、逆引きはもうできない」という状態に一時的にあるせいで、naney.org に ssh 接続できず(ssh_exchange_identification: Connection closed by remote host)。
別の某大学サーバへは ssh でき、そこから naney.org へ ssh。 ログを見ると、
Jan 16 15:20:05 www9 sshd[9382]: warning: /etc/hosts.allow, line 34: can't verify hostname: getaddrinfo(xxx.yyy.co.jp, AF_INET) failed Jan 16 15:20:05 www9 sshd[9382]: refused connect from aaa.bbb.ccc.ddd (aaa.bbb.ccc.ddd)
という感じ。うーん SSH経由での外部サーバからのメール取得ができん。 しょうがないので、某大学にSSHトンネルを掘り、そのトンネルの中にもいっちょトンネルを掘って一時的に迂回。
ssh -L 12345:www.naney.org:22 xxx.yyy.ac.jp
しておいて、
ssh -L 12346:xxx.naney.org:110 -p 12345 localhost
して、localhost:12346 にPOP3接続と。
そうこうしている間に直ったらしい。
今のところ WiKicker 自体にはアクセスログ機能はなく、Apache のそれに頼っている(NaneyOrgWiki ではサーバ側で combined log を提供していないので別途自前で、似非 combined log を吐かせている)。
1日毎程度のアクセス統計チェックはこれでまぁある程度済むのだが、それとは別に瞬間的なアクセス状況を知りたい時がままある。 特にサーバの負荷が上がりつつある時は
などをチェックしたい。 ロボットのアクセスがひどい場合は早急にはじく必要があるし。 しかし、生アクセスログの目視チェック(+grep etc)では限界がある(wiki のURIはページ名がエスケープされているからパッと見どのページかわからないし)。
ということで、直近のログを簡単にチェックできるような機能を検討。 まずはログをどこに取るか。 複数のCGI プログラムのプロセスから、ガシガシ書ける必要有り。
あたりか。 直近の数百アクセスだけあれば良く、逆にそれ以上のログはばんばん破棄したいのだが何が一番いい実装かなぁ。
シンプルに普通のファイルに append するのが一番楽だが、ログが増えると tail を取るのが遅くなるだろうし、ログを切り詰めるのも面倒。 Perl の Tie::File を使うとファイルの各行を配列要素に見立てて push、 unshift、splice ができるのだが、やはり切り詰めに時間がかかりすぎる。
使えそうなモジュールがないかいろいろCPANを検索して、とりあえずどんどんビルドしてみる(サーバの Perl が 5.005_03 なので、目的にあっても使えないかもしれないし)
妻と「キノコのおうち」の話で盛り上る。 小さい頃にどちらに家にあったアイテムとして(私の方は妹のだが)。 調べたら正確には「キノコちゃんとキノコのレストラン」だったか。 ちなみにウチには、
があった。
ゼロ。
昨日から本格的に検討していたアクセスログ管理であるが、今回は IPC::ShareLite モジュールを使って、IPC共有メモリに置くことにした。
ちゃちゃっと実装して、やっつけであるが直近のログを見れるようにした(RecentLog )。 順次表示する情報の追加や、表示数の調整を行う予定。 それから、各ページでのロギング処理が高負荷時に重荷にならないか要チェック。
先週末に本格始動した Debian BOX、午前中メーリングリストにメールを送ったら配送されない(10日ほど前に設定したやつ)。
log を見る限り permission の様子なのだが。 g+rw したりしたのだが改善されず。 うーん。メーリングリストオーナ(=naney)権限で動くから、その必要もないはずなんだけれどなぁ。vpopmail権限で動いちゃっているのかなぁ。 テストメメーリングリストを作った時には問題なかったのだが。
で小一時間。 /etc/qmail/users/assign
+xxx.co.jp-testml:naney:1000:1000:/var/spool/ml/etc/qmail/alias:-:testml:
ふう。xxx.co.jp ですよ。 手順まとめた時に伏せ字にしておいたのだが、そのままコピーしてあったよ。 当然実際にはマッチしないので、その後の、
+yyy.co.jp-:yyy.co.jp:64020:64020:/var/lib/vpopmail/domains/yyy.co.jp:-::
(yyy は本当の名前ね)
行により vpopmail 扱われたと。 で「/var/lib/vpopmail/domains/yyy.co.jp/.qmail-メーリングリスト名」が一応あるから、vpopmail 権限で fml.pl が動いて。
午前中つぶしてしまったよ。
先日実装したRecentLogページで、ピーク時*1のアクセスについてチェックしてみた。 特定のページだけに集中している訳ではなくて、その時間においても思ったより他のページにもアクセスがあるな。 1分あたりのリクエスト処理数は最大で約38(直前300リクエスト処理時間での平均)ぐらいだった。 同時アクセス数が増えると1リクエストにかかる処理時間も増えるし、これぐらいが今のサーバ/コードでは限界ということかな(SpeedyCGI で MaxBackends を 30 に設定しているため、これ以上は同時に処理しない)。
先日実装した Memcached による検索キャッシュ、1ページでも書き換えがあったら馬鹿正直にキャッシュを無効扱いするようにしてある。
NaneyOrgWiki は繁忙時にはサーバの負荷が上がるのを抑えるため自動的に検索機能を停止するようにしてあるのだが、本当はこの間も検索できるようにしたい(検索はWikiの肝だし)。 いまのところ WikiPage は内容が追加されるる事の方が多いので、多少古いキャッシュを使っても精度はあまり落ちないはず(再現率は下る可能性がある)。
ということで、load averages が高い時は古くても検索キャッシュがヒットすればそれを検索結果として返すようにしてみた。
SpeedyCGI はもともとPerlスクリプト起動時の遅さ(インタプリタ起動 + プログラムのコンパイル)を回避するために、一度起動させたPerlプログラムを使いまわすもの。 Apache管理権限のない一般ユーザでもインストールして利用できるしプログラムに問題があった時の対応も簡単なので、重宝している。
もちろん mod_perl でのコーディングと同様、グローバル変数の扱いなど気をつけなければならない点はある。 ハイパー日記システムも残念ながらそれらを意識しては書かれていないのでSpeedyCGI下では、うまく動かない。
このSpeedyCGIだが同時に生成できるバックエンドプロセスの数(-M オプション)と、各バックエンドプロセス(使いまわされるPerlプログラム)の実行回数(-r オプション)を指定できる。 例えば -M15 ならバックエンドの数を最大15になる。 16個目のアクセスがあるとバックエンドのどれかが空くまで待たされる事になる。 また -r の方は実行しているうちにどんどんメモリ使用量が増えてしまうような行儀の悪いプログラムの時などに使用するもので、例えば -r30 としておくとそのバックエンドは30回呼び出されると終了させられる(そして新しいバックエンドがまた作られる)。
で話は長くなったが例えば '-M15 -r1 -t1' というオプションにすれば、何度も実行できないようなコードのCGI プログラムでも、同時処理数制御用として SpeedyCGI が使えるというわけ(-t はバックエンドのタイムアウト指定)。
この日記もロボットの絨毯爆撃などがあるとサーバに高負荷をかけてしまう事があるので、SpeedyCGI で同時処理数を抑えるようにしてみた。 さて効果はあるかな?
ホスティングサーバに入っている別のユーザのCGI プログラム(index.cgi)が昨日の夜からメチャクチャ重い。 アクセス数が多いとかじゃなくて、プロセスどんどん残ってしまっている感じ。 普通CGI プログラムって30分も動かさないでしょ。 待ち状態じゃなくてずっとRUN状態だから、ループに落ちているのかなぁ。 load averages が下らん(さすがに朝は落ちついていたのだが、昼に確認したら20前後)。 メモリは1 CGI プログラムにつき3MB前後。 (Perl スクリプトである事を考えると)、たいしてメモリは使っていない様子。
2004/1/19・Diaryに一行つっこみフォームが復活しました。インタラクティブな日記 再び!是非ご利用ください。
これが非常に怪しい。
何か見覚えのあるサイト名だと思ったら、同じ高校出身の人だ。 4学年下の方だから同時に学校にいた事はないと思うが。 同じサーバに収容されたのかぁ (昔は違うURLだったから)。
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
nDiki は1999年1月に始めたコンピュータ日誌を前身とする Naney の Web 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。
※内容は個人的見解であり所属組織とは関係ありません。