Perl

weak referenceではまる

weakenしたはずなのに循環参照になって、Devel::Cycleで怒られて困ってたら、Scalar::UtilのPODに >> Copying a weak reference creates a normal, strong, reference. と書いてあった。ってことはnewの中で、引数をコピーする前にweakenをやっても無駄って…

ポーリングについて(+POEでepoll/kqueueを使う方法)

先日のサンプルもそうでしたが、POEもデフォルトではポーリングにselectを用います。 selectのコストは接続数に比例します。N人接続しているとき、各々にN倍のコストがかかるので、全体ではO(N**2)のコストがかかります。 それに対して新しい方式のepoll (BS…

POEを使ったサーバーの作り方

先日も述べましたが、サーバーは基本的なところは大体同じなので、使い回しがききます。 ですので、車輪の再発名をせず、人が作ったいいモジュールを利用させてもらいましょう。 ここでは、某プロジェクトに使っているPOEというフレームワークを使ってサーバ…

複数の接続を処理できるサーバーの書き方

telnetを同時に起動して試してみれば分かりますが、上のサーバーでは複数の接続を同時に捌くことはできません。 while(accept)のループで一つの接続のみを処理していて、そこを出るまでは次の接続を処理することができないからです。 自鯖のHTTPd位ならとも…

基本的なサーバーの書き方

Perlでサーバーを書くのは難しくありません。 ソケットを作り、ポートに結びつけ(bind)、接続を待ち(listen)、接続を受け付け(accept)、来たら適当に処理するだけです。 このときlistenまでは一回だけやればよく、acceptをwhileでループして、何度も接続をう…

Smart::Comments::Logなんてどうかな

use Smart::Comments::Log 'hoge.pl', '####'; って感じでSTDOUTの代わりにファイルに書かせたい。モジュールごとにログの場所を変えてみたりとか。 # at script.pl use Smart::Comments::Log 'script.pl', '####'; use MyLib; print "unkounko"; ### hogeho…

負荷だだ下がり

結局、ping受付での処理を極力軽くして、さらにping間隔を多少長くしただけで、サーバーの負荷が半分近く下がった。 これで当分は放っておいても良さそうだ。突っ込んでやりたいことは色々あるけど、tracに未処理チケットが山のように・・・

POEのプロファイラみつけた

POE::Devel::Profiler あとで試す。

POEで作ったサーバーの遅いところを調べた

DB周りで止まってるのかと思ったら全然違って、切断検出用のPING受信が殆どの時間を食っていた。(クライアントが30秒に一回PINGを送ってくる) 当然一個あたりの時間はクソなんだけど、なにしろ数が多い。1000人いて30秒に一回PINGが飛んでくるとしたら、0.03…

POEで作ったサーバーの遅いところを調べる

とりあえず計画。 マルチスレッド化も良いけどリソース的に死ぬ予感なので、まず現状の軽量化からやる。 プロファイラ使えばいいんだけど、前に何か使ったときModule::Refreshでリフレッシュしたらいきなり本番落ちたトラウマが・・・ 基本が本番環境ぶち込…

POEをマルチコアに対応させたい

POEはマルチタスクで働いてくれるけど、実際はシングルスレッドなので、CPUは1コア分しか使えない。 POEのサーバーが負荷でいっぱいいっぱいでも1コアしか使えないので、サーバーのCPUが4コア(or 4 CPUs)だと、一見CPU使用率が30%位で余裕に見えたりする。 …