Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2007-07-27 (Fri)

2007-07-26 (Thu)

Linux pipes are broken, we need O_RDWR instead of O_RDONLY

PerlでEvent::Libのコードスケッチ(名前付きパイプを3つ監視してだれかがデータ入れたら読み出す)したんだけどどうも意図したように動かんなーと思ってたら、

/* Linux pipes are broken, we need O_RDWR instead of O_RDONLY */
#ifdef __linux
  socket = open (fifo, O_RDWR | O_NONBLOCK, 0);
#else
  socket = open (fifo, O_RDONLY | O_NONBLOCK, 0);
#endif 
http://www.monkey.org/~provos/libevent/event-test.c

が原因だったす。

$fh->open($p, O_RDONLY|O_NONBLOCK);

$fh->open($p, O_RDWR|O_NONBLOCK);

に変えたらOKだったす。

2007-07-25 (Wed)

無題

f:id:hirose31:20070725234353j:image:left

しばらくこれで。

→かなしくなってきたのでやめました。

2007-07-23 (Mon)

mb

Apache-2.2.4のab.cを改造。というほどのものでもない。

とりあえずこれで用は足せそう。

--- ab.c.orig	2006-07-12 12:55:27.000000000 +0900
+++ ab.c	2007-07-23 19:47:36.000000000 +0900
@@ -1515,17 +1515,9 @@
     /* setup request */
     if (posting <= 0) {
         snprintf_res = apr_snprintf(request, sizeof(_request),
-            "%s %s HTTP/1.0\r\n"
-            "User-Agent: ApacheBench/%s\r\n"
-            "%s" "%s" "%s"
-            "Host: %s%s\r\n"
-            "Accept: */*\r\n"
-            "%s" "\r\n",
-            (posting == 0) ? "GET" : "HEAD",
-            (isproxy) ? fullurl : path,
-            AP_AB_BASEREVISION,
-            keepalive ? "Connection: Keep-Alive\r\n" : "",
-            cookie, auth, host_field, colonhost, hdrs);
+                                    "get %s\r\n"
+                                    "quit\r\n",
+                                    "my_key");
     }
     else {
         snprintf_res = apr_snprintf(request,  sizeof(_request),

メモを書き込みながらコードリーディングする方法

調べたいことがあってApacheやらlighttpdやらkeepalivedやらのソースコードを読むときはGNU GLOBALを使ってたんですが、常々、メモが書き込めたらいいのになーと思ってました。

  • フローのメモ
  • 関数の動作、影響のメモ
  • マクロのメモ
  • とかとか

その場では覚えてられるんですが、最近は性能劣化のため日をまたぐと脳内バッファがフラッシュされるようになってきたので、howmでメモったり紙に印刷して手書きでメモったりしてたんですが、なんかどうもいまいち。

GLOBALのページに直接付箋はれるといいのになぁと思ってちょっと探したところ、InternoteというステキなFirefoxのextensionがありました。

こんな感じです:

f:id:hirose31:20070723152845p:image:w300


みんなでメモをシェアするのには向きませんが、個人的なメモをとるのにはよさげです。

2007-07-21 (Sat)

aio期はいったん終了

Perlの非同期I/Oモジュールも気になるけど。

全部、Marc Lehmannのモジュールだぁ。

Linuxでaio

実装が2つある。以下、あくまで今の時点でのLinuxの場合の状況/実装のおはなし。

POSIX aio

  • aio_read(3) とか aio_write(3), aio_error(3), aio_return(3) とか。
  • インターフェースはPOSIXで定義されているのと同じ。
  • システムコールじゃなくてライブラリ関数(librt)
  • 裏でpthreadつくってがんばってるげ。

libaio

Copy file by using a async I/O state machine.

1. Start read request

2. When read completes turn it into a write request

3. When write completes decrement counter and free resources

Usage: aiocp file(s) desination

    • がーっと読んでがーっと書くんじゃなくて、チャンクにブツ切りにして、読んだら新しいファイルの同じオフセットのところへ書く、というのをチャンクごとにやる。ほんで、このreadとwriteは全部非同期。仮に、おっそいチャンクがあってもほかのチャンクたちは影響ない、おっそいread(やwrite)がいてもほかのチャンクのreadやwriteには影響ない。あ、影響ないってのはいいすぎか。I/Oブロックされてほかの処理に移れないってことがなくなる。
    • イメージ的には、チーズをよってたかってみんなで一斉にちびっとずつ食べる感じ。

POSIX aio vs libaio

libaioはPOSIX aioの高レベルラッパだと思ってたんだけど違かった。どちらも「非同期I/O」だけど実装は別もの。

軽ーく比較したところ、Linuxの場合は、POSIX aioよりlibaioの方が超絶速かった。POSIX aioはライブラリ関数なのに対し、libaioはシステムコールであるというのが一因かも。

移植性優先ならPOSIX aio、性能優先ならlibaioか、な。

非同期I/Oを使ってるソフトウエアたち

lighttpd-1.5.0 (PRE RELEASE)

nginx

FreeBSDでaio - その2

id:hirose31:20070719:1184773995 の続き)

できた。

  • my_aiocb.aio_sigevent.sigev_notify = SIGEV_KEVENT を使えばおk

その名の通り、kqueue + kevent を組み合わせて非同期I/Oできたす。

  • 必要な大きさのstruct kevent *をまろっくして
  • kqueue()をこさえて
  • aiocbの通知設定をして
my_aiocb.aio_sigevent.sigev_notify          = SIGEV_KEVENT;
my_aiocb.aio_sigevent.sigev_notify_kqueue   = my_kqueue;
my_aiocb.aio_sigevent.sigev_value.sival_ptr = iocb;
  • aio_read or aio_write して非同期I/Oリクエストをして
  • keventでI/O完了したのを取り出して
  • あとは煮るなり焼くなり

若干はまったのは、struct sigeventのメンバがsival_ptrじゃなくてsigval_ptrな点。(Linuxだとgなしのsival_ptrなの)

めんどいんで↓な感じに。(lighttpdからのパクり)

#if (defined(__FreeBSD__) || defined(__DragonFly__))
#  define sival_ptr   sigval_ptr
#endif

あと、1このkeventの配列に、aio_readとaio_writeを混在させたときに、kevent()後にreadとwriteを判別する方法がいまいちわからんかったす。

とりあえず、

    :    :
iocb->aio_lio_opcode = LIO_READ;
rc = aio_read(iocb);
    or
    :    :
iocb->aio_lio_opcode = LIO_WRITE;
rc = aio_write(iocb);

して、kevent()後に

    switch (cb->aio_lio_opcode) {
    case LIO_READ:
      rd_done(cb);
      break;
    case LIO_WRITE:
      wr_done(cb);
      break;
    default:
      TRACE("%s","aio_lio_opcode: unknown case. hmmmmmm.....");
      break;
    }

な感じで判別はできたんだけど、これがいけてる方法なのかよくわからず。


はてなスターTシャツ欲しい!おっお!

2007-07-20 (Fri)

GNU Moe

GNU萌えー

ではないぽい。

シグナルハンドラの中で呼んでも安全な関数たち

逆に、sigaction(2)とかで登録しているシグナルハンドらの中で、上記以外の関数を呼んではダメ

2007-07-19 (Thu)

FreeBSDでaio

id:hirose31:20070714:1184341432 の続き)

aio (aio_readとかaio_errorとかaio_returnとか) の習作中。

developerWorksBoost application performance using asynchronous I/Oのサンプルコードに毛が生えた程度の超絶シンプルなコードがLinuxでとりあえず動いたんで、次はとFreeBSD 6.2で試してみた。

けど、いまいち芳しくない。。。

  • my_aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL の場合
    • my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;でセットしたmy_aiocbが、シグナルハンドラの中で(struct aiocb *)info->si_value.sival_ptrとやっても取り出せない。(NULLが出てくる)
    • my_aiocbをグローバルにしちゃってそれを使えば一応一応、うまくいった。
  • my_aiocb.aio_sigevent.sigev_notify = SIGEV_THREAD の場合
    • my_aiocb.aio_sigevent.sigev_notify_functionがない。
    • my_aiocb.aio_sigevent.sigev_notify_attributesもない。
    • /usr/include/sys/signal.hに「* XXX missing sigev_notify_function, sigev_notify_attributes.」というコメントがある。
    • sigev_notify_kqueueとかいうのがあるっぽい。
    • そういえば、こっちはスレッドの中の(struct aiocb *)sigval.sival_ptrでmy_aiocbがとれてるなぁ。
  • FreeBSDにはaio_waitcomplete(2)というのがあるらしい。

情報が少ない上にまだよくわかってないところがあるので試行錯誤中。

「オラ、FreeBSDでバリンバリンにaio_*使ってるヨ」という方と仲良く鳴りたい。



id:hirose31:20070721:1184950454 に続く…

2007-07-18 (Wed)

腰、重要

月(にくずき)に要と書いて腰。腰が壊れると何もできない。そんなニートというか強制寝たきりな連休+αでした。

  • 日曜の午前中になにげに腰をスイング(重いものとかは持ってなかった)
  • ぎっくり☆
  • 痛みでしばらく動けない
  • 痛みをこらえてハイハイで移動するのがやっと
  • 階段で2階にハイハイで移動して横になる
  • 痛くて立てないので1階に降りられなくなる
  • それはそれはとても困る
  • (自主規制)
  • バックハイハイで階段を降りる(すごい怖かった。。。)
  • 1階ですごす
  • 冷湿布++
  • 月曜日
  • 両手を両膝について支えにすればなんとか二足歩行が可能に。でも痛みが走る。がまん。
  • 寝返りは痛くてムリ
  • 横臥→ハイハイの体勢変更もけっこう痛みが走る
  • ハイハイ→二足立ちの体勢変更もかなり痛みが走る
  • 息子とハイハイして追いかけっこ
  • 夕方あたりからまぁなんとか二足歩行可能に
  • 温湿布に切り替え
  • 座るのはなんとなく大丈夫に
  • aioのコード書いてみる
  • 火曜日
  • 手放しで二足歩行ができるようになった
  • でも手を離すと痛い。長時間はムリ
  • 背筋をまっすぐできない
  • 座るのはもうばっちし
  • 午後、形成外科へ
  • レントゲンとマッサージと電気ビリビリ
  • 腰を曲げて傘さして町を徘徊するオサーン
  • だいぶ痛みはとれたけど、まだ歩くのはしんどい
  • またaioのコード書いてる ←いまここ

2007-07-17 (Tue)

labじゃなくてlabs

なんでだろ。ふくすうけい?

2007-07-14 (Sat)

Asynchronous non-blocking I/O (AIO)

現在PRE RELEASEのlighttpd 1.5系でも使われているAIOなんですが、どうもチュートリアル or サンプルコード的な資料がすくないです。

いまのところ、

ぐらいしかよさげなのを見つけられてません。。。

追記 2007-07-17

Listing 6の、

  my_aiocb.aio_sigevent.notify_function = aio_completion_handler;
  my_aiocb.aio_sigevent.notify_attributes = NULL;

は間違いで、正しくは:

  my_aiocb.aio_sigevent.sigev_notify_function = aio_completion_handler;
  my_aiocb.aio_sigevent.sigev_notify_attributes = NULL;

だと思う。

2007-07-13 (Fri)

まだまだ空いてる☆

次はどこかな☆

for d in ne.jp com; do
  for i in $(seq 97 122); do
    f="$(echo -e $(printf '\\x%x\n' $i)).hatena.$d";
    printf "HEAD / HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n" $f | nc $f 80 | head -n 1 | egrep -q '^HTTP/... 200' && { echo $f | cut -b1; } || echo $f;
  done;
  echo;
done
a
b
c.hatena.ne.jp
d
e.hatena.ne.jp
f
g
h.hatena.ne.jp
i
j.hatena.ne.jp
k.hatena.ne.jp
l.hatena.ne.jp
m
n.hatena.ne.jp
o.hatena.ne.jp
p.hatena.ne.jp
q
r
s
t.hatena.ne.jp
u.hatena.ne.jp
v.hatena.ne.jp
w.hatena.ne.jp
x.hatena.ne.jp
y.hatena.ne.jp
z.hatena.ne.jp

a.hatena.com
b.hatena.com
c.hatena.com
d
e.hatena.com
f.hatena.com
g.hatena.com
h.hatena.com
i.hatena.com
j.hatena.com
k.hatena.com
l.hatena.com
m
n.hatena.com
o.hatena.com
p.hatena.com
q.hatena.com
r.hatena.com
s
t.hatena.com
u.hatena.com
v.hatena.com
w.hatena.com
x.hatena.com
y.hatena.com
z.hatena.com

2007-07-12 (Thu)

さきどりすぎた

今日が締め切り! みんなはやくー!!

  1. はて☆すた ☆☆☆
  2. チャイナドレス スリット×スリット
  3. マンチカン 足短い
  4. 嫁動
  5. MySQL
  6. VRRP
  7. ロールバック
  8. naoyaのテスト用キーワード
  9. はてな年収上げて
  10. はてな技術発表会
  11. はてなパンツ欲しい!
  12. にゃにゃにゃーにゃ

とあるコマンドの出力を画面に表示しつつ行数もカウントするワンライナ

ps ax 2>&1|tee >(wc -l)

なんかもっとヘンタイ的なteeの使い方を見た記憶があるんだけど思い出せない。。。

2007-07-11 (Wed)

レプリケーションの遅延秒数を知る方法

MySQL 4.1.1以降なら、SHOW SLAVE STATUSでSeconds_Behind_Masterというのが見られるそうで、これが遅延秒数の指標として使えるっぽい。

Seconds_Behind_Master

This field is an indication of how “late” the slave is:

  • When the slave SQL thread is actively running (processing updates), this field is the number of seconds that have elapsed since the timestamp of the most recent event on the master executed by that thread.
  • When the SQL thread has caught up to the slave I/O thread and goes idle waiting for more events from the I/O thread, this field is zero.

In essence, this field measures the time difference in seconds between the slave SQL thread and the slave I/O thread.


If the network connection between master and slave is fast, the slave I/O thread is very close to the master, so this field is a good approximation of how late the slave SQL thread is compared to the master. If the network is slow, this is not a good approximation; the slave SQL thread may quite often be caught up with the slow-reading slave I/O thread, so Seconds_Behind_Master often shows a value of 0, even if the I/O thread is late compared to the master. In other words, this column is useful only for fast networks.

no title

ネタ元:

2007-07-07 (Sat)

さきどる

2007-07-04 (Wed)

うまいよ。カレーにラー油をたらすと。

カレーにかけるもの (隠し味に混ぜるのではなく、直前に上にふりかける) といえば、

  • ソース
  • 醤油
  • マヨネーズ

あたりはわりとメジャーだと思うのですが、カレー番長がラー油あうよラー油といっていたので試してみました。

ラー油をふりかけたのは、市販のカレールーでつくった豆カレー(キドニー、大豆、白花豆、緑色の名前忘れた豆(ゆるい名前だった気がする)の4種)です。

始めは「ん?んん?」って感じだったのですが、食べ進めるとやめられなくなりました。味は「カレー」という食べ物のそれとはちょっと変わってしまうのですが、これはこれで病み付きになります。インドカレーとかではまだ試したことがないのですが、少なくとも普通のカレールーでつくるご家庭のカレーにはあうんじゃないかと思います。


最後にひとつ注意を。

だれか(特に彼女/彼氏とか)につくってもらったカレーになにかをぶっかけるときは細心の注意をはらってください。

私は「いただきますー」の直後にマヨネーズをぶっかけたらDNBKされた苦い思い出があります。

2007-07-03 (Tue)

POEなスクリプトをプロファイリングしたいの

Devel::DProfだとセグフォる。

$ perl -d:DProf poe-poe-poe.pl
Segmentation fault (core dumped)

POE::Devel::Profilerというのがあったので試してみた。

が、dprofppやgprofに比べるとサマれる情報が少ない。

$ perl -MPOE::Devel::Profiler poe-poe-poe.pl
$ poepp BasicSummary
Visualizer::BasicSummary ( poe-poe-poe.pl started at Mon Jul  2 15:19:05 2007 )
Total number of sessions: 9
Total number of events profiled: 1054
Total number of alarms profiled: 0
Total number of delays profiled: 75
Total number of signals profiled: 0
Total number of GC passes: 1189
Runtime: 9.39870595932007 wallclock seconds

くまった。

[あとでまたやる]

追記 2007-07-03

POE::Devel::Profiler::Parserをちょっといじって、あとはPOE::Devel::Profiler::Visualizer::PerformanceSummaryをでっちあげて当座の用は足せた。

イベントハンドラ毎に、

  • 実行時間の総和
  • 実行回数
  • 1回あたりの平均実行時間

をソートして出力するす。

[あとでブラッシュアップして晒す]

2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |
2018 | 05 |