erlang

R14A の HiPE が Segmentation Fault になる件

Nabble - Erlang Bugs - HiPE crash with crypto and R14Aの修正で直る。

Cost of of call on Erlang 2

Added parallel benchmarks http://github.com/higepon/Erlang-cost-of-call . call fun0 : 7 msec call fun1 : 7 msec gen_server:call fun0 local : 320 msec gen_server:call fun1 local : 318 msec gen_server:call fun0 local 10 proc : 544 msec gen_s…

Cost of call on Erlang

Erlang R14A (erts-5.8) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:true] Linux suneo 2.6.32-23-generic #37-Ubuntu SMP Fri Jun 11 08:03:28 UTC 2010 x86_64 GNU/Linux results call 100,000 times. call type msec cal…

Erlang 静的解析 dialyzer を mio で試す

Erlang の静的解析ツール dialyzer を試す。マニュアルは→Erlang -- dialyzer plt を作る % dialyzer --build_plt \ -r /usr/local/lib/erlang/lib/kernel-2.13.5/ebin \ -r /usr/local/lib/erlang/lib/memcached-client-0.0.1/ebin \ -r /usr/local/lib/erl…

第四回 Erlang 分散システム勉強会に参加しました

id:cooldaemon さんにお誘いいただき、第四回 Erlang 分散システム勉強会に参加しました。 自分は Skip Graphs ベースの KVS について発表しました。周りの発表者のレベルが高く緊張しましたが、おおむね好評だったようで安心しました。 懇親会ではkaiの作者…

Memcached のベンチマークツールを公開しました

Memcached のベンチマークツールを公開しました。自作の KVS のパフォーマンス測定に使っていたものです。 以下のように簡単にベンチマークがとれます。 $ mcbench -b 10000 -t 10 -n 1000 -s 127.0.0.1 -p 11211 -c get ==== mcbench started =============…

Erlang OTP アプリケーションのエラー処理

Erlang OTP アプリケーションのエラー処理について書かれた記事をあまり見かけないのでまとめてみました。 application -> supervisor -> workers という構成を想定。 application:start(app) 中のエラー application:start/1 中のエラーは戻り値 で分かる。…

Erlang で gen_server を利用してサーバーを書く場合のパフォーマンス懸念事項とその解決法

Erlang で分散 Key-Value Storage を書いているのだがデータの insert で思うように速度が出ていない。get の 10 倍ほど遅い。 ログを見た印象と直感的には insert の際の lock が競合しているのではないかと思われたがプロファイルをとってみたらボトルネッ…

gen_server の handle_call のアレが遅いらしい件

gen_server のベストプラクティスと思われていた handle_call で spawn して gen_server:reply/2 する方法。これがスループットが悪いという情報が。Deferring gen_server responses | Cliff 。dynomite の中の人の書いた記事なんだけど本当ならやばいね。 …

Erlang のリファクタリングツール refactoerl が普通に使える件について

Erlang Refactoring。Emacs で動くリファクタリングブラウザ。 以下のリファクタリングができると書いてある。Rename 系と extract function は動いた。 Eliminate variable Expand fun expression Extract function Generalize function definition Inline …

Erlang Common Test でストレステスト

テストグループ定義に、[repeat_until_any_fail, forever] と書いて一晩中動かしておけば簡単なストレステストになる。

Erlang で Consistent Hashing 実装

自作 memcached-client に必要だったので、ConsistentHashing - コンシステント・ハッシュ法 の解説を参考に Erlang で Consisten Hashing を実装した。 環状の配置は ETS の orderd_set を利用している。 レプリカを挿入しているところと get_node で next,…

id:Voluntas さんが memcached-client for Erlang のレビューをしてくれた

拙作の memcached client for Erlangを id:Voluntas さんがレビューしてくださった。 id:Voluntas さんは自分よりはるかに Erlang 力が上なので、より Erlang らしい運用しやすさを目指した視点が印象的。変更点は memcached-client を改悪してみた - Twiste…

Erlang のプロセスメモリを追う その3

自分の作っているサーバーに関しての結論。 erl の +P オプションに Max 値 134217727 を設定してはならない 自分のマシンでは 1GB のメモリが起動時に確保されてしまった。 マシンのメモリサイズと process_info で知る事の出来る process メモリサイズによ…

Erlang のプロセスメモリを追う その2

memsup メモリ周りなら id:voluntas さんに Rabbit MQ 見てみると良いとアドバイスを受け発見。 Erlang のメモリ使用量を監視して notify してくれる仕組み(supervisor)。 ユーザーが指定した上限か、物理メモリ上限に近づいたらデータを消していく仕組みに…

Erlang のプロセスメモリを追う

今作っている range search KVS が OOMKiller に kill されたのをきっかけに色々調べる。 結果として kill されたのはデバッグ用の dump 機能が悪さをしただけだったのだが、省メモリにこした事はないので少し深く突っ込んでみる。 前提 Erlang のメモリ関係…

worker とか do_times とか

こんな感じかな。 do_times(0, _Fun, _Args) -> ok; do_times(N, Fun, Args) -> apply(Fun, Args), do_times(N - 1, Fun, Args). do_workers(N, Fun, Args) -> do_workers(N, N, Fun, Args). do_workers(Max, 0, _Fun, _Args) -> wait_workers(Max, done), o…

Erlang otp のビルドオプション

パフォーマンス系で下記以外につけておくべきオプションあるだろうか。 ./configure --enable-kernel-poll --enable-hipe --disable-jinterface --enable-threads --enable-smp-support

Erlang VM CPU 使いまくり

きっちり使ってもらえるのはありがたい。 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 31877 taro 20 0 1695m 1.4g 2828 S 242 75.1 1:17.16 beam.smp

io_lib:fread には改行周りにバグがある

io_lib:fread には改行周りにバグがあるのを発見してしまった。 22> io_lib:fread("~c\n", [65,10]). {ok,["A"],[]} この結果はどうみてもおかしい。 これか。 http://www.erlang.org/cgi-bin/ezmlm-cgi?3:msn:369

Erlang の memecached クライアント作った

Erlang の memecached クライアント作った。まだ複数サーバーに対応してなかったり、あまり使わないコマンドはサポートしていない。 既存クライアントの merle は色々と使いづらかったので自作。github に置いてあるので気軽に fork してもらえるとうれしい。

Erlang Common Test で init_per_suite, end_per_suite を使うときの注意点

Erlang Common Test ではテスト SUITE の開始と終了時に hook を指定する事が出来る。 これは xUnit にはよくある機能で、例えば開始時にリソースを取得し、テスト中は使い回す、終了時に解放みたいなことに使う。 ところが Erlang Common Test では init_pe…

Erlang のコードを書くときに注意すべき事

Erlang ライブラリ関数の戻り値を必ずドキュメントでチェックして、以下のようにマッチさせておく事。 ok = hoge(), 少しでもさぼると痛い目にあう。

Erlang Common Test の run_test スクリプトを使わずにテストを実行

Erlang アプリケーションを配布する際には run_test スクリプトを同梱するのは難しい。開発者の環境の絶対パスがうめこまれてしまうから。 そのため ct モジュールを利用して直接テストを実行する必要がある。 ドキュメントを読みあさり、方法が分かったので…

Erlang の application:get_env/1 にはまる

アプリケーションのログディレクトリを erl -xxx log_dir としていたのだが の部分が . (カレントディレクトリ)になると application_controller: syntax error before: '.': . と謎のエラー。 これは get_env/1 の戻り値が Erlang Term であることに気付…

Erlang の logger の謎が見えてきた

Erlang で書かれたアプリケーションの logger 。使っていると色々と疑問がわいてくる。 今思いつくだけでも error_logger という名前なのに設定で sasl とか log_mf_h など違う名前が出てくるの? error_logger の吐くログはなぜ rb で見るの?面倒だよね。 …

RabbitMQ 方式の ctl 作った

Apache でいうところの apachectl 相当のものを作った。 構成は xxxctl シェルスクリプト で getopts して nodename などをうけとる Windows なら bat ファイル(まだ作ってない) xxx_control.erl 実際に stop などのコマンドを実行 コマンドは rpc:call(No…

Erlang の inet:setopts と -kernel オプション

man inet(3) すると分かるのだが erl に kernel application へのオプションを渡す事が出来る。 % erl -kernel inet_default_listen_options [{nodelay,true}

Erlang プロジェクトの配布形態などを見る

Erlang で書かれたアプリケーションを配布する場合に ビルド方法 ディレクトリ構成 起動・再起動・終了方法 などをどう提供しているのかを調べてみた。 id:Voluntas さんと id:cooldaemon さんに教えてもらった候補たち RabbitMQ, Yaws, MochiWeb, ejabberd,…

releasing erlang otp code を読んでみた

http://eaglestreet.wordpress.com/2008/08/22/releasing_erlang_otp_code/ を読んでメモ。 Application はバージョン番号を持つ 複数の Application は Rlease にグループ化される Release もバージョン番号を持つ(Application のバージョンと関連なし) A…