kaeruspoon

TokyoTyrant で ttacceptsock failed エラー

TokyoTyrantを使用していて、ある日、ttacceptsock failedというエラーがログに吐かれていました。
ソースを読んでみると、ttutil.c の ttacceptsock() 内でのTCPコネクションのaccept時に、エラーが出ているようです。printデバッグでエラーコードをしらべてみると、EMFILEでした。

EMFILE
    1プロセスがオープンできるファイル・ディスクリプタ数の上限に達した。 

(参考:http://www.linux.or.jp/JM/html/LDP_man-pages/man2/accept.2.html)

1プロセスがオープンできるfd数はデフォルトで1024のようです。つまり、デフォルトのままだと1024以上のクライアントが登場したときにコネクションが確立できなくなります。

[tsukasa@ubuntu] $ ulimit -a
-t: cpu time (seconds)         unlimited
-f: file size (blocks)         unlimited
-d: data seg size (kbytes)     unlimited
-s: stack size (kbytes)        8192
-c: core file size (blocks)    0
-m: resident set size (kbytes) unlimited
-u: processes                  4096
-n: file descriptors           1024
-l: locked-in-memory size (kb) 32
-v: address space (kb)         unlimited
-x: file locks                 unlimited
-i: pending signals            4096
-q: bytes in POSIX msg queues  819200
-e: max nice                   0
-r: max rt priority            0


TokyoTyrantは10000コネクション以上の環境でも高速に動くことが売りみたいなので、上限値をあげてあげました。
/etc/security/limits.conf に以下を追加します。設定方法は同ファイルのコメント内に丁寧に書かれています。

root soft nofile 16384
root hard nofile 16384
tsukasa soft nofile 16384
tsukasa hard nofile 16384


これで、上限値が16384になりました。ログインしなおして確かめます。

[tsukasa@ubuntu] $ ulimit -a
-t: cpu time (seconds)         unlimited
-f: file size (blocks)         unlimited
-d: data seg size (kbytes)     unlimited
-s: stack size (kbytes)        8192
-c: core file size (blocks)    0
-m: resident set size (kbytes) unlimited
-u: processes                  4096
-n: file descriptors           16384
-l: locked-in-memory size (kb) 32
-v: address space (kb)         unlimited
-x: file locks                 unlimited
-i: pending signals            4096
-q: bytes in POSIX msg queues  819200
-e: max nice                   0
-r: max rt priority            0


これでTokyoTyrantの本領を発揮させてあげることができます。
でも、この問題ってapacheやMySQLなどでも起きたりしないのでしょうか。

MySQLはopen_files_limitでファイルディスクリプタ数の上限を設定できる

「TokyoTyrant で ttacceptsock failed エラー」
昨日の記事で1プロセスあたりのファイルディスクリプタ数の上限にひっかかったことを書いたけど、MySQLはどうなのだろうと思ってググってみたらすぐにそれらしい記事が見つかりました。

table_cache, max_connections, open_files_limit の関係

fd数の上限は、ソースの中ではsetrlimit()を使って設定されていました。TokyoTyrantもttserverの起動時にfd数の上限を指定できるようになると便利だと思います。コードを修正してみよう。

トヨタ iQ ロングドライブ インプレッション

この週末は宮城県南部までの往復700kmを、トヨタのiQでドライブしてきました。
トヨタ iQ
エクステリアはキュートでなかなかカッコいい。驚くほど小さいです。特に全長が。まるでチョロQのよう。一応、後部座席がついているのですが、本当に緊急用と考えたほうがよくて、大人が座れるものじゃありません。なのに後部座席のヘッドレストが邪魔で、後方の視界がよくありませんでした。ドライブ中は後部座席のヘッドレストを外していました。
なぜか、缶ホルダーがひとつしかありません。室内の収納箇所もあまりなくて、その点はかなり不満。オートエアコンもついているし、スポーティなD字型ハンドルも感触が素晴らしくてインテリアの質感は高めです。ただ、全長が短いのに車高が高めなせいなのか、シートの座面が高すぎる感じでした。もっと低いほうが自然だと思うのだけど、おそらく足下のスペースが足りないせいなのかも。
全長が短くて車高が高いので、ロールをしないようにサスペンションは堅め。高速道路では突き上げ感がかなりあります。ただ、着座位置のすぐ後ろがリアタイヤなので、カーブを曲がる感覚がとても楽しい。お尻で回っている感じがおもしろいです。
ロングドライブはとにかく疲れる車です。疲労感と肩こりが強く残ります。全長が短くて車高が高いのが特徴ですが、その形状がすべての悪い点の元凶になっているようです。ユルさんとも話しましたが、おおいし家ではこの車を購入することはないでしょう。でも、街乗り中心で、近所の足代わりに使うのならけっこうおすすめかもしれません。小回りもきくので。

MiyazakiResistance0.1.4リリース。TTへのコネクションまわりの挙動を変更しました

MiyazakiResistanceのバージョンを0.1.4にアップしました。
今回の変更点は、以下のとおりです。

■必要になったときにはじめて、TTへのコネクションがはられるようになりました
RailsなどでMRを使っていると、TTへのアクセスを行わないプロセスからも(機能別にわけたmongrelやバッチ、consoleなど)、無駄にコネクションがはられていました。このことが原因で、TTサーバの最大ファイルディスクリプタ数を超えるという事態になったりして困りました。fd数の上限をあげればいいのですが、そもそも無駄にコネクションをはってリソースを消費することもありません。

■デュアルマスタ構成の場合、スタンバイサーバからの読み込みを行わないようにしました
今までは、デュアルマスタ構成のとき、スタンバイサーバへも読み込みは行っていました。TTはもともと一台のサーバでも十分に処理をまわせるポテンシャルを持っているし、スタンバイサーバなのに稼働しているというのもおかしな気もするので、一切のアクセスを行わないようにしました。
もちろん、アクティブサーバーが落ちたときは、スタンバイサーバーがアクティブに昇格するのは今まで通りです。

■タイムアウトのデフォルト値を5秒に変更しました
以前は60秒だったのですが、いくらなんでも長すぎるので…。本当は5秒でも長いと思いますが。

それから、今回からgemの公開はgemcutterを使用するようにしました。
インストールは以下のコマンドで実行できます。

gem install miyazakiresistance


gemcutterをインストールしていない人はまず先に下記のコマンドを実行する必要があります。
gemの探索先にGemcutter.orgを追加するだけでもOKです。

gem install gemcutter
gem tumble

MiyazakiResistance0.1.5リリースしました

昨日の今日ですが、MiyazakiResistanceのバージョン0.1.5をリリースしました。
変更点は以下のとおりです。

MiyazakiResistance::Base.first メソッドの追加
地味にconsoleでよく使うので追加しました。ActiveRecordと同様のメソッドです。

MiyazakiResistance::Base.delete_all メソッドの追加
指定した条件のレコードを削除します。

delete_allはセッション管理やキャッシュにTTを使ったりするときにexpireの実装で使えると思います。そのうち、Rackに積めるセッション管理用のクラスを作ろうかと思います。

WordScoop ver2.0.0をリリースしました。

WordScoopKaerukeywordの後継ライブラリです。
Kaerukeyword同様、与えられたテキスト中から、登録されたキーワードを高速に検索することができます。また、今回、HTML文章中にキーワードが現れた際、自動でリンクを付与するメソッドも追加しました。ずっとkaeruspoonでは使っていたものですが、晴れてリリースとなりました。

インストール

sudo gem install word_scoop


使い方は以下のとおりです。
まず、キーワード群の辞書を登録しておきます。

tree = WordScoop.new(["ruby", "rails", "おおいし"])


あとでキーワードを追加登録することもできます。

tree.add("つかさ")
tree << "焼き肉"


テキスト中に存在するキーワードを抽出するには、searchメソッドを使います。
テキスト中に出現した順番に配列に格納して返されます。

tree.search("ぼくはおおいしつかさです。rubyと焼き肉が大好きです。I love ruby!") 
    #=> ["おおいし", "つかさ", "ruby", "焼き肉", "ruby"]


テキスト中のキーワードに自動でリンクをはりたい場合は、filter_htmlメソッドを使います。
タグ内にキーワードが現れても無視します。また、a、script、pre、object、iframeタグの場合は、タグが閉じられるまでキーワードが現れても無視します。

tree.filter_html(|I love Ruby! <script>alert("Ruby!")</script>|)
    #=> %Q|I love <a href="http://www.kaeruspoon.net/keywords/Ruby">Ruby</a>! <script>alert("Ruby!")</script>|


リンクのAタグは自由に設定できます。wikipediaやはてなキーワードなどを利用すると便利かもしれません。デフォルトでは当サイトのかえるキーワードへのリンクとなります。"%s"の部分にヒットしたキーワードが割り当てられます。内部的には単純に、sprintfに渡してあげているだけです。

tree.link_url = %Q|<a href="http://ja.wikipedia.org/wiki/%s">%s</a>|
tree.filter_html(|I love Ruby!|)
    #=> %Q|I love <a href="http://ja.wikipedia.org/wiki/Ruby">Ruby</a>!|


パフォーマンス的には、filter_htmlはsearchに比べて若干落ちますが、許容範囲の速度だと思います。アルゴリズム的には何も工夫していないので、さらに高速化をいずれ目指そうと思います。

262380語の登録にかかる時間。

             user     system      total        real
total:   1.100000   0.320000   1.420000 (  1.419997)
avg:     0.000004   0.000001   0.000005 (  0.000005)


searchメソッド(1000回繰り返し)

             user     system      total        real
total:   3.540000   0.030000   3.570000 (  3.569992)
avg:     0.003540   0.000030   0.003570 (  0.003570)


filter_htmlメソッド(1000回繰り返し)

             user     system      total        real
total:   4.220000   0.050000   4.270000 (  4.269990)
avg:     0.004220   0.000050   0.004270 (  0.004270)

kaeruspoonの自作サーバ

昨日は楽天で自作サーバカンファレンスがあったのでustで見ました。チームラボさんはいつも楽しそうですね。

161
kaeruspoonも自宅に置いたサーバで動いています。単に、もらいものパーツを組み合わせただけなので、自作とはいえないですね。ガムテープは怪我防止用。全面が空いているのは、以前、玄関の下駄箱の上に置いていたときの熱対策の名残です。現在はリビングのソファの横に置かれていて、本やコーラを置いたりできる便利なサイドテーブルにもなっていますが、小汚いのでユルさんには不評です。
さっき調べてみたら、CPUはPentium3の600MHzで、メモリは640Mほどでした。もはや化石の域に達しようかというほどのロースペックですが、kaeruspoonなど4つのRailsアプリが動いていてもほとんど問題はありません。もちろん、Web+AP+DB+家庭用Fileサーバとオールインワンで活用しています。

162
これは以前ユルさんが使っていたvaioですが、次期kaeruspoonサーバ候補です。CPUは確かceleron1.4GHz、メモリ1Gほどだったと思うのでかなりのスペック増です。ネックはHDが一台しか載せられなくてRAIDが組めないことですが、レプリケーションと定期バックアップで十分カバーできそうです。あと、ひそかに音と消費電力が気になったりしています。

163
これはぼくが以前使っていたvaioノートですが、現在はUbuntu9.10が載っていてRails環境が構築されています。いざというときの代替マシンで、いろいろ検証したいときに使っている便利なやつです。

ひさしぶりに写真を使ってみました。というか、以前のリニューアルのときに写真アップロード機能をつけてなかったのでした。思い立って、さっき実装したところです。

職場の昼食会

164
今日は会社の懇親会でサン・ファソンに行ってきました。昼間からワインを飲んでしまいました。午後は仕事にならないと思ったのだけど、意外にもいつもよりはかどりました。お肉はおいしかったです。

最近iPhoneの調子がおかしくてバッテリーが異様に早く減ったり、かと思って電源を入れ直すと復活したり、なんて調子でしたが、ついには真っ白な画面になってハングしてしまいました。強制再起動で復活させます。右上の電源ボタンと□のホームボタンを同時に長押しすればOKでした。

明日は創作家集団のオフ会です。歯医者さんにも行きます。家賃の更新料も払ってきましょう。

創作家集団の最後の飲み会

165
昨日は神楽坂でぼくが以前参加していた創作家集団のオフ会がありました。サイト閉鎖に伴う最後のオフ会です。といっても、創作とか関係なしに普通にみんな友だちなので、これからもオフ会ではなく飲み会として続いていくのでした。お互いの小説の話などができて楽しかったです。