タグ

ブックマーク / blog.nomadscafe.jp (26)

  • Module::Buildとcpanfileを組み合わせる案 - blog.nomadscafe.jp

    Module::Install::CPANfileと同じ事をModule::Buildでもやりたい Build.PL use Module::Build; use Module::CPANfile; my $file = Module::CPANfile->load("cpanfile"); my $prereq = $file->prereq_specs; my $build = Module::Build->new( license => 'perl', dynamic_config => 0, configure_requires => $prereq->{configure}->{requires}, build_requires => { $prereq->{build} ? %{$prereq->{build}->{requires}} : (), $prereq->{test

  • やったー PerlでProcfileベースのプロセス管理ツール foreman の互換コマンド "proclet" できたよ - blog.nomadscafe.jp

    Webアプリケーション開発時などに依存するバックグラウンドプロセスを管理するツールとして rubyで作られた foreman というツールがあります Procfileという名前のファイルに worker: ./bin/worker web: plackup web.psgi と書いて $ foreman start とやると指定したプロセスを起動してくれるらしいです。 cho45やtokuhiromからの提案もあったので、Procletをベースに同様の機能を持つprocletコマンドを作り、Procletに同梱してリリースしました。 https://metacpan.org/module/Proclet バージョン0.11で追加されました。 インストールは $ cpanm Proclet 使い方 実装されていない機能もあるけどだいたいforemanと一緒です Procfileを用意して p

  • Proclet という supervisor モジュール書いてリリースした - blog.nomadscafe.jp

    FreeBSD・OpenBSDと他で ps -e の動作が違ってハマってしまいましたが、Proclet という簡単なsupervisor・プロセス管理モジュールをCPANにあげました。 Proclet - minimalistic Supervisor https://metacpan.org/module/Proclet GrowthForecastでは、growthforecast.pl というスクリプトを実行するだけでWebサーバと2つのWorkerが起動します。CloudForecastのように個別に実行が必要になると使うのも面倒ですよね。 growthforecast.pl を実行後、pstreeで見るとこうなってます。growthforecast.plがsupervisor的に動作し、終了したプロセスがあれば自動で起動し直します。 -+= 70330 kazeburo perl

    ikasam_a
    ikasam_a 2012/08/31
  • cloudforecast に2つの機能追加をしました - blog.nomadscafe.jp

    久しぶりにcloudforecastの体に機能追加 グラフ作成時に複数のrrdファイル利用 一つ目は、グラフの定義中に他のrrdのデータを取り込みやすくする為の機能。 今までグラフ定義モジュールのグラフ設定中に <%RRD%> と書くと、それを自動的に該当するrrdファイルのパスへ置換していましたが、これを拡張して <%RRD_FOR サーバIP:リソース名:オプション %> とすることで他のサーバ、他のグラフのデータを楽に読み込めるようになりました。 この機能を利用したのが以下のグラフ。某サーバ群へのnginxのリクエスト数をstackして表示しています ちなみにグラフ設定はこんな感じ DEF:cache1=<%RRD_FOR 10.x.x.x:nginx:80:/nginx_status %>:request:AVERAGE DEF:cache2=<%RRD_FOR 10.x.x.x

    ikasam_a
    ikasam_a 2011/11/16
  • ディレクターやエンジニアが運用エンジニアにインフラの相談をする際に持って来て欲しい5つのこと - blog.nomadscafe.jp

    新しいWebサービスを開始する際や、既存サービスに変更を加える際に、サーバを何台確保するか、ストレージやAPIといった共有リソースを使用して良いか、ディレクターやアプリケーションエンジニアの方に訪ねられることがありますが(というかそれが仕事ですね)、その際相談のためにどんな情報を持って来て欲しいか書いてみます。人間同様にサーバやネットワークリソースも有限なので、無駄にならない最適なサーバ台数を割り出したり、増強が必要かどうかを判断して、会社のビジネスを効率よく進めていくことが重要です。 人によっては以下に書いてあることが、非常に緩く感じでしまうこともあるかもしれません。これはWebサービスを早く立ち上げて、柔軟に運用していくことができる環境ならではだと思います。それでも出して欲しいモノはいくつかあります 企画書 どんなサービスであるか説明できる企画書があるといいでしょう。ないわけはないと信

    ikasam_a
    ikasam_a 2011/07/18
  • HTTPコンテンツ圧縮とPlack - blog.nomadscafe.jp

    「HTTPコンテンツ圧縮はどのレイヤーで行うのがいいか」で書いたりしましたが、高トラフィック環境では、サーバ間の通信量も問題となるため、ApplicationサーバでもHTTP圧縮をかけたほう良さげです。Plackには既にPlack::Middleware::DeflaterというApacheのmod_deflate相当のMiddlewareがあるのですが、ちょいちょい弄っていたりするのでその紹介。 その前に、HTTPコンテンツ圧縮のおさらいです。HTTP圧縮はリクエストのAccept-Encodingにgzipやdeflateがあった場合に、コンテンツをgzip、deflateなどで圧縮し、レスポンスのContent-Encodingヘッダに圧縮に用いた方式を表記することで実現されます。さらに、クライアントサーバ間にキャッシュサーバが存在した場合に、Accept-Encodingを送って

  • 本当は難しいCPANモジュールのバージョン特定 - blog.nomadscafe.jp

    OrePANを作っていて一番難しいのはディストリビューションからモジュールのパッケージ名とバージョンを抜き出す部分。ExtUtils::MakeMakerやModule::Metadata、PAUSEのソースを参考にして書いているところ。 例えば、Log::Minimalであれば、パッケージを展開して $ tar zxf Log-Minimal-0.04.tar.gz $ cd Log-Minimal-0.04 $ find -name "*.pm" | grep "VERSION" のような処理をします。(実際はperl) これが一筋縄ではいかない作業でかなり苦労している 最初に引っかかったのがcommon::sense。これは*.pmファイルがない。実際にはsense.pm.PLというファイルがあり、実行することでperlのバージョンにあったモジュールを作りだす。 まずこれに対応するた

  • OrePANとcpanmでCPANの部分ミラーを作ってCPANモジュールを管理する - blog.nomadscafe.jp

    これまでサービスで使うCPANモジュールの管理と言えばrpm/debパッケージが主流だと思いますが、最近ではperlbrewで使いたいバージョンのperlをインストールすることもあり、rpm/debでは対応できなくなってきています。 perlbrewのperlに対してプロジェクトが依存しているCPANモジュールを入れる際、 $ perlbrew switch perl-5.12.3 $ cd /path/to/MyProj $ perl Makefile.PL $ cpanm --installdeps . などと cpanm —installdeps が使えます。 しかし、これではサーバを新規セットアップするたびに、最新のモジュールが入ることになりサーバ間でモジュールのバージョンの差異が生まれる可能性があります。 そこで対応策として考えられるのが開発サーバで—installdepsを実行

  • ログレベルの使い分け方/コミュニケーション手段としてのログ - blog.nomadscafe.jp

    Log::Minimal v0.02をリリースしました。xaicronさんのpatchにより出力するログのレベルを変更することができるようになりました。 WARN以上のログだけを出したい場合、$Log::Minimal::LOG_LEVEL を変更します。 use Log::Minimal; local $Log::Minimal::LOG_LEVEL = "WARN"; infof("info"); #出力されない warnf("warn"); #出力される デフォルトのレベルはDEBUGです。なお、デバックメッセージを出すには環境変数も設定されている必要があります。 ところで、Log::Minimalでは4つのログレベル、DEBUG、INFO、WARN、CRITICALをサポートしていますが、他のLogモジュールではより詳細なレベルを用意しているものがあります。そのため、アプリケーショ

    ikasam_a
    ikasam_a 2010/11/08
  • Contextの生成・破棄を任意のタイミングで制御可能にする Scope::Container(仮) - blog.nomadscafe.jp

    追記 CPANリリースしました http://search.cpan.org/dist/Scope-Container/ /追記 mod_perl のアプリケーションでは、Apacheモジュールの提供するpnotesを使うとリクエスト毎のデータを簡単に持つことができます。pnotesに入れたデータはリクエストの処理が終了したところで自動的にクリーンアップされます。これを利用したのがリクエストごとにインスタンスを作成破棄できる、Apache::Singleton(::Request)です。 また、pnotesはデータベースの接続の管理にもしばしば使われます。1リクエストを裁いている間だけデータベースとの接続を維持し、リクエストが完了したところで接続を閉じるような処理に利用されています。このようにすることでmod_perlのプロセス数分(数百)の接続がMySQLに常に張られることもなく、また1

  • 運用におけるエラーログの重要性もしくはLog::Minimalってモジュール書いた話 - blog.nomadscafe.jp

    追記 CPANにアップしました http://search.cpan.org/dist/Log-Minimal/ /追記 アプリケーションサーバでエラーが起きていたり、レスポンスが遅かったりする場合に、Operation Engineer(インフラエンジニア)がまず見るのは、エラーログです。エラーログにでているメッセージを手がかりに原因を探ります。 サーバでエラーが起きている時には、データベースに接続ができなかったり、外部のAPIからレスポンスが得られない、またプログラムのBugが原因となっている場合もあるでしょう。またエラーにならなくても、複数台あるデータベースのスレーブサーバうち一台が落ちて接続をretryしていたり、APIのレスポンスが遅い際にはサーバ全体のパフォーマンスが低下します。 エラーログに障害の原因を探る情報があれば、Operation Engineerは素早く対応を開始で

    ikasam_a
    ikasam_a 2010/10/21
  • Shibuya.pm#14 で memcachedの運用について発表しました - blog.nomadscafe.jp

    2010夏のmemcachedシリーズもいよいよ最後となりました。 1歳8ヶ月のうちの息子も見ていた Shibuya Perl Mongersテクニカルトーク#14「IPAとJPAは違う団体です」でmemcachedの運用について発表をさせていただきました。今回は監視scriptの書き方やcronlog、Nagiosの設定tipsなどの内容にしました。memcachedの監視というよりかは一般的なノウハウ寄りだったかなと 監視の狭間問題の対策としてmemcachedのuptimeを見るscriptを紹介していますが、この問題はmemcachedには限りません。自動的に再起動してくるようなサービスで勝手に再起動した=何か問題が起きたと想定できる、例えばMySQLや /proc/sys/kernel/panic が設定されているLinuxにも同じような監視が必要になるでしょう。 MySQLであ

  • プロのサーバ管理者がApacheのStartServers, (Min|Max)SpareServers, MaxClientsを同じにする理由 - blog.nomadscafe.jp

    kazuhoさんが「プロのサーバ管理者の間では存在価値が疑問視されて久しい (Min|Max)SpareServers だと思う」と書いたり、hirose31さんが去年のYAPC::Asiaで{Start,{Min,Max}Spare}Servers,MaxClientsは同じにしているよと発表したり、実際前職のサーバはそのように設定されていたのですが、自分でうまく説明ができてなかったので、調べながら書いてみた。 当はイントラブログ用に書いていたものですが、がんばったので転載。 前提として、CPUの使用率におけるsystemとfork Re: クラウドがネットワークゲーム開発者にもたらしてくれたもの - blog.nomadscafe.jpでも書いている通りforkってのはサーバにとって重い部類の処理になります。つまり負荷の高いときにforkを大量に行うのはしてはならないことの1つです。

    ikasam_a
    ikasam_a 2010/09/01
  • Re: @kazuho: handlersocket plugin や mycached を使えば memcached は不要か、それとも使うべきケースがあるか。考察せよ [10点] - blog.nomadscafe.jp

    handlersocket plugin や mycached を使えば memcached は不要か、それとも使うべきケースがあるか。考察せよ [10点] kazuho (Kazuho Oku) http://twitter.com/kazuho/status/21477219149 考えて答えてみる。 HandlerSocketやmycachedを利用し、MySQLへの接続数が数万単位で行えるようになったり、より多くのクエリ数が発行できるようになっても、memcachedは不要ではないし、使うべきケースもあります。 memcachedは単なるKVSではなく、ExpiresとLRUがついたキャッシュサーバです。キャッシュオブジェクトには期限を付ける事ができ、期限が過ぎたキャッシュは無効にされ、またアクセスがされていない不要になったオブジェクトは削除され、空いたスペースは新しいキャッシュオ

  • Yokohama.pm #6でcloudforecastについて喋って来た - blog.nomadscafe.jp

    Yokohama.pm#6 x Perl Casual#3でcloudforecastについて時間を頂いたので喋ってきました。 すてきな会場を貸して頂いたネイバージャパン株式会社さん、USTREAMを担当してくれた941さんありがとうございます。 発表資料はこちら。

  • Plack::Builderのenable_ifよりも簡単に、指定した条件下でmiddlewareを有効にするモジュール - blog.nomadscafe.jp

    CloudForecastや先日のNoPasteではPlack::Builderを使って、デフォルトの機能としてPlack::Middleware::ReverseProxyを有効にしている。 my @frontproxy = map { s/\s//g } split(/,/, $ENV{FRONT_PROXY} || ""); foreach my $ip ( @frontproxy ) { my $netip = Net::IP->new($ip) or die; push @frontproxies, $netip; } buider { enable_if { my $addr = $_[0]->{REMOTE_ADDR}; my $netip; if ( defined $addr && ($netip = Net::IP->new($addr)) ) { for my $pr

  • NoPasteを作るためにsinatraライクなWAFを書いてみた - blog.nomadscafe.jp

    社内にNoPaste的なものがなくてカッとなって作っていたらsinatraライクなフレームワークを作っていた。何を言っているか(ry NoNoPasteソースコード: http://github.com/kazeburo/NoNoPaste 元々、CloudForecastには、tokuhiromのMojaMojaやyusukebeのHitagiからコピペをしつつ作ったフレームワークがあり、NoPaste的なものを作成するにあたりCloudForecastからWAF部分だけを切り出して作り直した。 今回のWAFのコードはまだNoPasteのパッケージ内にある。名前はShirahata。 Shirataha.pm: http://github.com/kazeburo/NoNoPaste/blob/master/lib/Shirahata.pm 特徴は sinatraライクなURLの組み立て

    ikasam_a
    ikasam_a 2010/07/07
  • CloudForecast Updates - blog.nomadscafe.jp

    1ヶ月前ほどにBlogに書いたサーバリソースの監視ツール CloudForecastは弊社でも導入前提で試験をしつつ、さまざまなアップデートを行っているのでその紹介です 大きく変わったのはWeb画面の見た目です。 サーバ一覧 各サーバのグラフページ 多くのサーバを監視するにあたり、通常は見ないサーバに関してはグループ名をクリックすることで畳んでしまうことができます。見たくないサーバはこれで桶。また、各サーバのグラフページでは、デフォルトでMonthlyとYearlyのグラフの表示をやめています。通常ブラウザの画面には入りきらないと思いますし、参照することも24時間、1週間のグラフに比べて少ないだろうという判断です。表示速度も高速化される期待もあります。月間年間のグラフを参照したい時はワンクリックで表示できるので不便はないと思います 加えて、日時指定でグラフを表示することができます。Pick

  • CloudForecastっていうリソース監視のツール/フレームワーク作った - blog.nomadscafe.jp

    「クラウド」って言ってみたかった。今は反省していr 上のグラフは前回のエントリーを公開したときの、当blogを配信しているサーバのトラフィックグラフです。記事を公開した17時にぴょーんとトラフィックが伸びています。4時にも増えているけどこちらは謎。 実はこのグラフもCloudForecastを利用して取得しています。CloudForecastはサーバ等のリソース監視を行うツールもしくはフレームワークで、rrdtoolの薄いラッパーとして動作し、小規模から大規模なサーバ群を一括で管理できるように設計してあります。tokuhirom曰く、「perlが書けてrrdtoolがつかえるsysadminの人だったら使いやすいと思われる」というのがもっともしっくりくるような気がします。Perlとrrdtoolが使える運用者によるカスタマイズ前提なのがフレームワークと呼んでいる所以です。 CloudFor

  • Kickstart内蔵、自動仮想マシン作成スクリプト - blog.nomadscafe.jp

    cobbler/koanを使えば良さそうなんだけど、DHCP/PXEが必要となりそうで、それらを使えない場所で簡単に仮想マシンを作成するスクリプトを書いてみた。動作する環境はCentOS 5.4でKVM。ネットワークはブリッジで設定されていることが前提です。 依存するモジュールはEPELを使うと簡単にインストールできる $ sudo yum install perl-HTTP-Server-Simple perl-Regexp-Common スクリプトの実行は以下 $ sudo perl ./build-virt.pl --private 仮想マシンのプライベートIP スクリプトを実行すると、kickstartを配布するためのwebserverをforkして、virt-installを実行します。OSイメージはftp.iij.ad.jpから取得するように固定で書いてしまっています。 scr