<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10japanesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>blog.nomadscafe.jp</title>
    <link rel="alternate" type="text/html" href="http://blog.nomadscafe.jp/" />
    
    <id>tag:blog.nomadscafe.jp,2009-07-12://1</id>
    <updated>2010-03-17T03:59:59Z</updated>
    <subtitle>横浜から渋谷方面に通勤する Web Engineer のBlog</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.27-ja</generator>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/nomadscafejp" /><feedburner:info uri="nomadscafejp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><logo>http://feeds.feedburner.jp/~fc/nomadscafejp?bg=99CCFF&amp;fg=444444&amp;anim=0</logo><entry>
    <title>Kickstart内蔵、自動仮想マシン作成スクリプト</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/UBD47QcTrpU/kickstart.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.34</id>

    <published>2010-03-17T03:58:00Z</published>
    <updated>2010-03-17T03:59:59Z</updated>

    <summary>cobbler/koanを使えば良さそうなんだけど、DHCP/PXEが必要となり...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>cobbler/koanを使えば良さそうなんだけど、DHCP/PXEが必要となりそうで、それらを使えない場所で簡単に仮想マシンを作成するスクリプトを書いてみた。動作する環境はCentOS 5.4でKVM。ネットワークはブリッジで設定されていることが前提です。</p>

<p>依存するモジュールはEPELを使うと簡単にインストールできる</p>

<pre><code>$ sudo yum install perl-HTTP-Server-Simple perl-Regexp-Common
</code></pre>

<p>スクリプトの実行は以下</p>

<pre><code>$ sudo perl ./build-virt.pl --private 仮想マシンのプライベートIP
</code></pre>

<p>スクリプトを実行すると、kickstartを配布するためのwebserverをforkして、virt-installを実行します。OSイメージはftp.iij.ad.jpから取得するように固定で書いてしまっています。</p>

<p>scriptはgistにおいてます =>  <a href="http://gist.github.com/334894">http://gist.github.com/334894</a></p>

<script src="http://gist.github.com/334894.js?file=build-virt.pl"></script>

<p>かなり決めうちで書いてますので実際使うにはカスタマイズが必要だと思います。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/03/kickstart.html</feedburner:origLink></entry>

<entry>
    <title>WEB+DB PRESS Vol.55「大規模Webサービスの裏側」最終回</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/5tC72A2-9zs/webdb-press-vol55web.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.33</id>

    <published>2010-02-19T08:55:18Z</published>
    <updated>2010-02-19T09:13:14Z</updated>

    <summary>偶数月なので、WEB+DB PRESSの季節です WEB+DB PRESSで連載...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>偶数月なので、WEB+DB PRESSの季節です</p>

<p>WEB+DB PRESSで連載させて頂いている「大規模Webサービスの裏側」はVol.55にて第六回となり、最終回です。最終回は「監視」です。</p>

<p>「監視」の切り口を死活監視とリソース監視にわけて紹介し、後半はNagiosの設定や、Nagosの分散構成の解説です。Nagiosの分散構成はあまり資料がないので、（必要かどうかはおいておいて）面白いんじゃないかと思います。
同じVol. 55には宮川さんによるPSGI/Plackの記事もあるので、楽しみです。</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&npa=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=nomadscafejp-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4774141593" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p><br />
昨日のデブサミ2010でRedHatの平さんとVmwareの各務さんの仮想化インフラのセッションでもでてきましたが、ハードウェアを知ることがその上で動くさまざまなソフトウェアを構築・運用していく上でも大事です。そのハードウェアを知るためにも監視を行い、リソースの利用のされかたを知るというのが重要だと思います。監視を楽に行えるよう様々なソフトウェアがあるので、どんどん活用して行きたいものです。</p>

<p>最終回となりますので、1年間のご愛読(まだ出てない)ありがとうございました！ 1年間連載できたことがいい経験になり、記事を書くことでより深く技術を理解できたことも非常によい体験になりました。それから、執筆に協力いただいた、吉野君、加藤幹生さん、木村さん、藤沢さん、あと校正手伝ってくれたたんぽぽおよび、運用グループの方、奥さんありがとうございました。</p>

<p>また、何か記事の内容について詳しく聞きたいとか、「ここはどうやっているの？」とか質問がありましたら、メールなどで頂けたらと思います。ブログ等どこかで紹介していこうと思います。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/02/webdb-press-vol55web.html</feedburner:origLink></entry>

<entry>
    <title>local::libを使ってバンドルRPMを作る。</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/1xD8teiunrw/perl-locallibrpm.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.32</id>

    <published>2010-02-19T08:36:29Z</published>
    <updated>2010-02-19T08:53:40Z</updated>

    <summary>PlackやAnyEventなどなど新しめのモジュールを使いたいんだけど、既存モ...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>PlackやAnyEventなどなど新しめのモジュールを使いたいんだけど、既存モジュールのrpmを作っていくのが面倒な場合に、それらのモジュール群をlocal::libを使ってまとめてどこかにディレクトリに入れるバンドルパッケージRPMができないかと考えてやってみた。</p>

<p>んで、できたので、specファイルをさらしてみる</p>

<pre><code>Summary:        bundle package of Plack+AnyEvent
Name:           perl-bundle-plack
Version:        0.3
Release:        1%{?dist}
License:        Artistic
Group:          Development/Libraries
Source:         http://search.cpan.org/CPAN/authors/id/A/AP/APEIRON/local-lib-1.004009.tar.gz
Patch10:        local-lib-1.004009_destdir.patch 
BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires:       perl(YAML)
BuildRequires:       perl(Config)
BuildRequires:       perl(File::Path)
BuildRequires:       perl(FindBin)
BuildRequires:       perl(ExtUtils::MakeMaker)
BuildRequires:       perl(ExtUtils::Install)
BuildRequires:       perl(ExtUtils::CBuilder)
BuildRequires:       perl(ExtUtils::ParseXS)
BuildRequires:       perl(Module::Build) &gt;= 0.28
BuildRequires:       perl(CPAN)
AutoProv: no

%define buildhome %{_tmppath}/%{name}-%{version}-%{release}-home-%(%{__id_u} -n)
%define bundle_prefix /usr/local/bundle-plack
%define __perl_requires /usr/lib/rpm/perl.req --ignore_deps 'perl(Plack)'

%description
bundle package of Plack+AnyEvent

%prep
%setup -n local-lib-1.004009
%patch10 -p1

%build
[ "%buildroot" != "/" ] &amp;&amp; rm -rf %buildroot
[ "%{buildhome}" != "/" ] &amp;&amp; rm -rf %{buildhome}
export HOME=%{buildhome}
%{__mkdir_p} %{buildroot}%{bundle_prefix}
%{__mkdir_p} %{buildhome}/.cpan/CPAN

cat &lt;&lt;EOF &gt; %{buildhome}/.cpan/CPAN/MyConfig.pm
\$CPAN::Config = {
  'urllist' =&gt; [q[ftp://ftp.jaist.ac.jp/pub/CPAN/], q[ftp://ftp.riken.jp/lang/CPAN/]],
};
1;
__END__
EOF

perl -Ilib Makefile.PL  --bootstrap=%{buildroot}%{bundle_prefix}
make
make install
rm -rf %{buildroot}%{bundle_prefix}/.modulebuildrc

%install
export HOME=%{buildhome}
export ORIGINAL_PREFIX=%{bundle_prefix}
export DESTDIR=%{buildroot}
sed -i "s/'urllist' =&gt; \[\],/'urllist' =&gt; [q[ftp:\/\/ftp.jaist.ac.jp\/pub\/CPAN\/], q[ftp:\/\/ftp.nara.wide.ad.jp\/pub\/CPAN\/], q[ftp:\/\/ftp.riken.jp\/lang\/CPAN\/]],/" %{buildhome}/.cpan/CPAN/MyConfig.pm

perl -I%{buildroot}%{bundle_prefix}/lib/perl5 -Mlocal::lib=--self-contained,%{buildroot}%{bundle_prefix} -MCPAN -e '
$ENV{PERL_MM_OPT} .= " INSTALLMAN1DIR=none INSTALLMAN3DIR=none";
$ENV{PERL_MM_USE_DEFAULT} = 1;
for my $m (qw/EV IO::AIO AnyEvent AnyEvent::AIO Coro 
              HTTP::Parser::XS Plack Plack::Request Plack::Server::AnyEvent/){
    CPAN::Shell-&gt;rematein("notest", "install", $m);
}
'
#↑にいれるモジュールを書く

find %{buildroot}%{bundle_prefix} -name *.so -type f | xargs -I{} sed -i "s@%{buildroot}@@g"  {}
sed -i "s@%{buildroot}@@g" %{buildroot}%{bundle_prefix}/.modulebuildrc

find %{buildroot} -name perllocal.pod -or -name .packlist | xargs rm -f
find %{buildroot}%{bundle_prefix} -type f -print |
        sed "s@^$RPM_BUILD_ROOT@@g" |
        grep -v ^%{_mandir} |
        grep -v perllocal.pod |
        grep -v "\.packlist" &gt; %{name}.files
if [ "$(cat %{name}.files)X" = "X" ] ; then
    echo "ERROR: EMPTY FILE LIST"
    exit -1
fi

%clean
rm -rf %{buildroot}
rm -rf %{buildhome}
%post

%preun

%postun

%files -f %{name}.files
%defattr(-, root, root, -)
%dir %{bundle_prefix}

%changelog
</code></pre>

<p>どこかからのコピペが混ざっていたりと、あまりきれいではないけど。このspecファイルによって、/usr/local/bundle-plack以下にlocal::libと依存モジュールがすべてインストールできる。</p>

<p>使用するときは、普通のlocal::libと同じようにshellだったら</p>

<pre><code>eval $(perl -I/usr/local/bundle-plack/lib/perl5 -Mlocal::lib=/usr/local/bundle-plack)
</code></pre>

<p>とやればOK。</p>

<p>この方式を利用することで、サービスで用いている他のモジュールに影響することなく、新しいモジュールをインストールでき、一部の必要としているところだけに適用できるってのがいいですね。</p>

<p>以下はlocal::libにあてているpatch</p>

<pre><code>diff -ur local-lib-1.004009.orig/lib/local/lib.pm local-lib-1.004009/lib/local/lib.pm
--- local-lib-1.004009.orig/lib/local/lib.pm    2009-11-08 10:27:23.000000000 +0900
+++ local-lib-1.004009/lib/local/lib.pm 2009-11-26 11:59:21.000000000 +0900
@@ -235,6 +235,20 @@
   File::Spec-&gt;catdir($class-&gt;install_base_perl_path($path), $Config{archname});
 }

+sub install_base_path {
+    my ($class, $path) = @_;
+    $ENV{ORIGINAL_PREFIX} ? $ENV{ORIGINAL_PREFIX} : $path;
+}
+
+sub destdir {
+    my ( $class ) = @_;
+    if ( $ENV{DESTDIR} &amp;&amp; $ENV{DESTDIR} !~ m!/$! ) {
+        $ENV{DESTDIR} .= '/';
+    } 
+    $ENV{DESTDIR};
+}
+
+
 sub ensure_dir_structure_for {
   my ($class, $path) = @_;
   unless (-d $path) {
@@ -253,8 +267,11 @@
     warn "Attempting to create file ${modulebuildrc_path}\n";
     open MODULEBUILDRC, '&gt;', $modulebuildrc_path
       || Carp::croak("Couldn't open ${modulebuildrc_path} for writing: $!");
-    print MODULEBUILDRC qq{install  --install_base  ${path}\n}
+    print MODULEBUILDRC qq{install  --install_base  } . $class-&gt;install_base_path(${path}) . qq{\n}
       || Carp::croak("Couldn't write line to ${modulebuildrc_path}: $!");
+    if ( my $destdir = $class-&gt;destdir ) {
+        print MODULEBUILDRC qq!         --destdir $destdir\n!;
+    }
     close MODULEBUILDRC
       || Carp::croak("Couldn't close file ${modulebuildrc_path}: $@");
   }
@@ -344,9 +361,10 @@

 sub build_environment_vars_for {
   my ($class, $path, $interpolate) = @_;
+  my $destdir = ( $class-&gt;destdir ) ? " DESTDIR=" . $class-&gt;destdir : "";
   return (
     MODULEBUILDRC =&gt; $class-&gt;modulebuildrc_path($path),
-    PERL_MM_OPT =&gt; "INSTALL_BASE=${path}",
+    PERL_MM_OPT =&gt; "INSTALL_BASE=" . $class-&gt;install_base_path(${path}) . $destdir,
     PERL5LIB =&gt; join($Config{path_sep},
                   $class-&gt;install_base_perl_path($path),
                   $class-&gt;install_base_arch_path($path),
</code></pre>

<p>もっとスマートな方法があればだれか教えてくださいませ(_ _)</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/02/perl-locallibrpm.html</feedburner:origLink></entry>

<entry>
    <title>memcachedのプロトコル変更の件</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/qnUz15gFLA8/memcached.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.31</id>

    <published>2010-02-08T04:01:03Z</published>
    <updated>2010-02-08T04:06:44Z</updated>

    <summary>memcachedに依存するシステムやコードを書く人は大嫌いな訳だけど、スケーラ...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p><a href="http://memcached.org/">memcached</a>に依存するシステムやコードを書く人は大嫌いな訳だけど、スケーラビリティを向上させてレスポンス時間の高速化には必須なmemcachedですが、最近のプロトコル変更には疑問を感じてしまう。</p>

<p>1.4.0では、<a href="http://limilic.com/entry/okk7d6bh8twt2w6j">こちら</a>に書いた通り、いつの間にかdeleteのtimeoutがサポートされなくなった。なので、</p>

<pre><code>delete key timeout noreply
</code></pre>

<p>というコマンドが無効になって困ることになった。それでも</p>

<pre><code>delete key timeout
</code></pre>

<p>というコマンドは、timeoutにどんなも文字列が入っていてもエラーになることはなかった。timeoutは効かないけど。</p>

<p>ここから1.4.4ではさらに悪化。timeoutが0でないとエラーになるようになった。つまり</p>

<pre><code>delete key 0 noreply
delete key 0
</code></pre>

<p>は有効なんだけど、</p>

<pre><code>delete key 10
</code></pre>

<p>がエラーになるようになった。
この変更のコミットは<a href="http://github.com/memcached/memcached/commit/62a0cf9e0ba4592870b5e86e5cb2f79e1a78f9ba">これ</a>。</p>

<p>実際試す。</p>

<pre><code>% telnet localhost 11234
 Trying 127.0.0.1...
 Connected to localhost.
 Escape character is '^]'.
 version
 VERSION 1.4.4
 delete key 10
 CLIENT_ERROR bad command line format.  Usage: delete &lt;key&gt; [noreply]
 quit
</code></pre>

<p>プロトコルの変更は下位互換が基本中の基本だと思うんだ。また１つmemcachedが嫌いになった。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/02/memcached.html</feedburner:origLink></entry>

<entry>
    <title>nginxの組み込みperlで非同期に遅延させてレスポンス</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/4FJqZz94334/nginxperl.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.30</id>

    <published>2010-02-05T08:55:51Z</published>
    <updated>2010-02-05T09:19:48Z</updated>

    <summary>ひさびさにnginxなどいじっている。 nginxがnon-blockingで動...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>ひさびさにnginxなどいじっている。</p>

<p>nginxがnon-blockingで動いているので、組み込みのPerlでもblockingする処理をいれることはおすすめされていないのですが、sleepだけは機能が用意されていました。使い道がよくわからないけど、とりあえずレスポンスを遅延させるのだけやってみた。</p>

<p>まず、handlerとなるperlモジュール</p>

<pre><code>package delay; 

use nginx; 

sub handler {
    my $r = shift; 
    my $args = $r-&gt;args;
    $args =~ m/sleep=([^&amp;]+)/;
    my $sleep = $1 || 1;
    $r-&gt;variable("sleep", $sleep);
    if ( $sleep ne "no" ) {
        $r-&gt;sleep($sleep * 1000, \&amp;next);
        return;
    }
    $r-&gt;send_http_header("text/html");
    $r-&gt;print("&lt;html&gt;&lt;head&gt;&lt;title&gt;title&lt;/title&gt;&lt;/head&gt;&lt;body&gt;sleep:$sleep&lt;/body&gt;&lt;/html&gt;\n");
    return OK; 
}

sub next {
    my $r = shift;
    my $sleep = $r-&gt;variable("sleep");
    $r-&gt;send_http_header("text/html");
    $r-&gt;print("&lt;html&gt;&lt;head&gt;&lt;title&gt;title&lt;/title&gt;&lt;/head&gt;&lt;body&gt;sleep:$sleep&lt;/body&gt;&lt;/html&gt;\n");
    return OK;
} 

1;
</code></pre>

<p>このコードの中の$r->sleepが遅延実行ようにするところ</p>

<pre><code>$r-&gt;sleep( msec, func )
</code></pre>

<p>となるようです。</p>

<p>これを利用するnginx.conf</p>

<pre><code>worker_processes  16;

events {
    worker_connections  32768;
}

http {
    include       /usr/local/nginx-server/conf/mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush      on;
    keepalive_timeout  60;

    perl_modules /path/to/lib;
    perl_require  delay.pm;

    server {
        listen       80;
        server_name  localhost;
        access_log off;

        location / {
            perl  delay::handler;
        }
    }
}
</code></pre>

<p>ApacheBenchでベンチマークをとったところ、</p>

<pre><code> ab -c 1000 -n 100000 'http://localhost/?sleep=0.1'
 Concurrency Level:      1000
 Time taken for tests:   10.449 seconds
 Complete requests:      100000
 Failed requests:        0
 Write errors:           0
 Total transferred:      19100000 bytes
 HTML transferred:       6900000 bytes
 Requests per second:    9570.41 [#/sec] (mean)
 Time per request:       104.489 [ms] (mean)
 Time per request:       0.104 [ms] (mean, across all concurrent requests)
 Transfer rate:          1785.11 [Kbytes/sec] received
</code></pre>

<p>想定通り、1コネクションあたり10req/secできるみたい。</p>

<p>これだけだと使い道があまりわからないだけど、nginxのevent loopが組み込みperlから利用できるようになる最初の一歩だと期待すればwktkです。</p>

<p>あと、調べた感じ、組み込みperlを入れるオーバーヘッドは5%ぐらいだった。7万req/secが6万6千req/secぐらい</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/02/nginxperl.html</feedburner:origLink></entry>

<entry>
    <title>アプリケーションがマルチスレッドでもマルチコアCPUを活かせない件</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/huAPMR9vI9Y/cpu.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.29</id>

    <published>2010-01-29T08:02:10Z</published>
    <updated>2010-01-29T08:28:40Z</updated>

    <summary>もっと詳しい方のフォロー募集です アプリケーションがマルチスレッドになってもネッ...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>もっと詳しい方のフォロー募集です</p>

<p>アプリケーションがマルチスレッドになってもネットワーク処理が分散されなければマルチコアを活かせない典型的な例です。id:viverの古橋さんが<a href="http://d.hatena.ne.jp/sdyuki/20090422/1240398932">s100kps</a>としてあげていた件にも近いかも。</p>

<p>memcachedで現象を確認します。最近のmemcachedはマルチスレッドで動くようになっているので、まずはそれを確認します。</p>

<pre><code>$ memcached-tool localhost stats|grep threads
threads           4
</code></pre>

<p>スレッドが4つで起動しています。</p>

<p>負荷がそれなりにある状態(8000req/sec程度)で、コマンドラインでtopを開き、「1」キーを押して、CPUごとの使用率を表示します。(例はFedora8 kernel-2.6.23)</p>

<pre><code>Tasks:  77 total,   1 running,  76 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  3.0%us,  5.7%sy,  0.0%ni, 75.3%id,  0.0%wa,  7.7%hi,  8.3%si,  0.0%st
Cpu2  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                            
3692 nobody    20   0 10.9g  10g  716 S   10 44.0  10253:09 memcached
</code></pre>

<p>＊メモリの行は削除しています。</p>

<p>CPUは4つ認識されていますが、CPU1しか使用されていないのがわかると思います。おそらく、CPU1のアイドルがなくなった時点で他のCPUに空きがあってもそれ以上の処理ができなくなります。なぜCPU1しか使われないかは「/proc/interrupts」をみるとなんとなくわかります。NICはBroadcom BCM5722です。</p>

<pre><code>$ cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3 
  0:      10569          0      10460          0   IO-APIC-edge      timer
 16:        301        301        302     303161   IO-APIC-fasteoi   aerdrv, aerdrv, aerdrv, ioc0, eth0
 17:          8 3570118309          7          7   IO-APIC-fasteoi   eth1
</code></pre>

<p>memcachedの通信は主にeth1で行われるのですが、このeth1に関する割り込み処理がCPU1でしか行われていません。ソフトウェア割り込みはハードウェア割り込みが行われたCPUでしか行われないのもこの傾向を強めます。</p>

<p>マルチコアCPUの性能を活かすために考えられることは、ネットワークの割り込み処理を複数のCPUに分散することだと思うのですが、最新のNICにはRX/TX Multiple Queue(正式名称がわからない。Receive Side ScalingとかScalable I/O？)機能が備わっています。もともとRX/TX Multiple Queueは10GbpsのNICなどに備わっていた機能で、複数の割り込みチャンネルを持つことでネットワーク処理の分散を実現しています。最近のIntelやBroadcomの1GbpsのNICにも同じ機能があります。</p>

<p>以下はBroadcomのBCM5709を搭載しているマシンのinterrupts。(CentOS 5.3)</p>

<pre><code>           CPU0       CPU1       CPU2 ..  CPUy      CPUz
  0:  342688765          0          0         0          0    IO-APIC-edge  timer
114:         55         34      19613     39212         11       PCI-MSI-X  eth0
122:         23          0        145       193          0       PCI-MSI-X  eth0
130:        243          0         75       138          0       PCI-MSI-X  eth0
138:         24         12      10423     35836          6       PCI-MSI-X  eth0
146:       2141          0        110       556          0       PCI-MSI-X  eth0
154:         21          4      12802     17806          7       PCI-MSI-X  eth0
162:        561          0        216        72          0       PCI-MSI-X  eth0
186:         72         76      97076    137548     197952       PCI-MSI-X  eth1
194:         24      45478     100337    140189     554148       PCI-MSI-X  eth1
202:         24     527452      94677     87876     305476       PCI-MSI-X  eth1
210:         23     220400     175792     56390     205521       PCI-MSI-X  eth1
218:         24      37023      30778      6169      11788       PCI-MSI-X  eth1
226:         21     349792      48599     91969          0       PCI-MSI-X  eth1
234:         23     206063       5911     43536          4       PCI-MSI-X  eth1
</code></pre>

<p>＊加工済み</p>

<p>こんな感じで、割り込み処理用のチャンネルが複数個存在して、CPU間で分散ができています。</p>

<p>まとめると、マルチコアCPU、SSDの普及によってハードウェアの性能があがり、epoll/kqueue/event portsによって大量のコネクションをさばけるようになると、こういった複数のCPUに分散できない処理がボトルネックになってくるので、最新のハードウェアとか対応しているカーネルを利用しようということです。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/01/cpu.html</feedburner:origLink></entry>

<entry>
    <title>来年度(2010年度)のRFPで主流となりそうなサーバ</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/6JodORVVSFI/2010server.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.28</id>

    <published>2010-01-27T02:26:39Z</published>
    <updated>2010-01-27T02:31:19Z</updated>

    <summary>WEB+DB PRESS Vol.51の連載で、サーバRFPを設定してそれに基づ...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>WEB+DB PRESS Vol.51の連載で、サーバRFPを設定してそれに基づいて購入していると書きましたが、来年度(2010年度)ぐらいのRFPになりそうな主流となるサーバを考えてみました。</p>

<p>まず、共通していること、前提など</p>

<ul>
<li>CPUのコア数はHTなどによる論理コア含む計算</li>
<li>ネットワークインターフェイスは1Gbpsを2つ以上。RX/TX MultiQueueをサポートしていること</li>
<li>SSDはIntel X25-M 160GBもしくは同等製品</li>
</ul>

<p>サーバは主に4タイプあります。</p>

<h3>■Utility Server</h3>

<p>小規模DB、Q4MやGearmanなどのJobQueue/Workerサーバ、memcachedやSquid/Varnishなどのキャッシュサーバに利用するサーバ。目的に応じてHDDをSSDに換装して利用できることが必要となります。</p>

<ul>
<li>CPU 8コア以上 * 1</li>
<li>Memory 16GB</li>
<li>HDD SAS 15krpm 146GB</li>
<li>SSDに換装可能</li>
</ul>

<h3>■Application Server</h3>

<p>アプリケーションサーバやリバースプロキシーに使う。おそらく最もCPU(ユーザ)の負荷が高い。性能の高く、コア数が多いCPUでぶん回して全体のサーバ台数は減らしたい。</p>

<ul>
<li>CPU 8コア以上 * 2</li>
<li>Memory 16GB</li>
<li>HDD SAS 15krpm 300GB</li>
</ul>

<h3>■High Memory DB</h3>

<p>中負荷〜高負荷DBとして利用。SSDについて入れ替えではなく追加としてしているのはデータベースのデータ部分をSSD、バイナリログをHDDとそれぞれの特性に応じて使い分けるためになります。メモリについては後述します。</p>

<ul>
<li>CPU 6コア以上 * 2</li>
<li>Memory 48〜64GB</li>
<li>HDD SAS 15krpm 146GB</li>
<li>SSDを追加可能</li>
</ul>

<h3>■Large Data DB</h3>

<p>メモリにすべてのデータが乗り切らないデータ蓄積型、大規模なDB用。</p>

<ul>
<li>CPU 6コア以上 * 2</li>
<li>Memory 48〜64GB</li>
<li>HDD SAS 15krpm 300GB * 6本以上</li>
<li>RAID5</li>
</ul>

<p>48〜64GBとしたメモリに関して、64GBを積むためには1本8GBのものを買わないとならなく、4GBと比べると3倍程度するのが悩みどころ。メモリの値段は上がってきている中で8GBの値下がりするのか注目。また、今年の後半(前半？)には、Westmere-EPが出て、6コア/12スレッドになるので、また少し状況が変る可能性がありますね。こちらも注目</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=nomadscafejp-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4774138908" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/01/2010server.html</feedburner:origLink></entry>

<entry>
    <title>データベースサーバを複数台構成とか2010年代には流行らない</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/ZnoY1LZpeOc/2010.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.27</id>

    <published>2010-01-12T05:26:16Z</published>
    <updated>2010-01-12T05:35:55Z</updated>

    <summary>奥一穂さんの「ウェブアプリケーションサーバを複数台構成とか2010年代には流行ら...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>奥一穂さんの「<a href="http://d.hatena.ne.jp/kazuhooku/20091226/1261838127">ウェブアプリケーションサーバを複数台構成とか2010年代には流行らない</a>」にフォローのような感じで。
例によってタイトルは煽りです。</p>

<p>奥一穂さんのエントリーでは、「5,000万PV/Month」という見積もりでアプリケーションサーバの台数を1台と計算していますが、これからは「1,000万PV/Day」を超えるサイトが多く生まれてくると予想しています。どんなサイトかというと、mixiアプリやモバゲーなどにソーシャルゲームを提供するサイトです。</p>

<p>ソーシャルゲームサイトのキャパシティプランニングについては中澤さんのエントリーが参考になります。</p>

<ul>
<li><a href="http://www.sssg.org/blogs/naoya/archives/1648">The Art of モバゲー Capacity Planning</a></li>
<li><a href="http://www.sssg.org/blogs/naoya/archives/1645">The Art of Mixi-mobile-appli Capacity Planning</a></li>
</ul>

<p>最も人気がでた場合には数千万から数億PV/Dayという数字がならんでいます。怖い怖い</p>

<p>1,000万PV/Dayとなると、ピークのリクエスト数が平均の2倍として秒間に230リクエストとなります。</p>

<pre><code>( 10,000,000 pv / 86400 sec/day ) * 2 = 231.481481
</code></pre>

<p><br />
奥一穂さんの試算であれば、クアッドコアのサーバで秒間40回の処理が可能なので、6台程度のアプリケーションサーバがあれば、1日1,000万PV、月に3億PVがさばけることになります。冗長性や安全をとるためにサーバを増やしたり、またクアッドコアを2つ搭載するマシンを採用することも考えられますが、この数字は自分の経験と比べても大きなずれはない数字です。</p>

<p>さて、ここからが本題で、1,000万PV/Day（秒間230 req/sec)には何台のデータベースが必要となるのでしょうか。Shardingを行ってデータベースの分散を行い多くのデータベースサーバを運用する必要があるのでしょうか。</p>

<p>1リクエストにつき、SQLを8回発行した場合、秒間のクエリー数の最大は1840query/sec</p>

<pre><code>230 req/sec * 8 = 1840 query/sec
</code></pre>

<p><br />
このうち、5%程度が更新系のクエリーだったとしたら、更新系クエリは92 query/secとなり、</p>

<pre><code>1840 query/sec * 0.05 = 92 query/sec
</code></pre>

<p><br />
残りが参照クエリとなり、1748 query/secとなります。1リクエストあたりのSQL数や更新回数はアプリケーションにより大きく変動しますが、この程度のクエリー数の場合、MySQLであれば1台で処理することは可能です。冗長性やバックアップのためのSLAVEサーバも追加して1組2台あれば安定稼働できます。</p>

<p>多くのSQLをさばくためには、クアッドコア以上のCPUや十分なメモリー、最適なデータベースサーバの設定や、効率のよいスキーマとSQLの設計が必要です。Blogサービス等でなければデータをあまり蓄積しないのも重要です。MySQLであれば次の書籍が非常に参考になります。</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&nou=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=nomadscafejp-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4798120723" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p><br />
もし、アプリケーションがもっと多くのクエリーを発行していたり、負荷が大きな場合には、安くなったSSDを使ったり、SLAVEサーバを追加して参照クエリーを分散を行ったり、memcachedを利用して参照クエリを減らしたり、また、更新が多いテーブルだけを別のMySQLサーバに移動したり、データが単純なkey-valueであれば<a href="http://1978th.net/tokyotyrant/">Tokyo Tyrant</a>や<a href="http://code.google.com/p/redis/">Redis</a>などを利用すれば、データベースサーバを最小限にとどめることができます。</p>

<p>2010年代は手軽に購入できるようになった高性能なハードウェアでスケールアップし、OSやミドルウェアのチューニングを行うことで、アプリケーションサーバ、データベースサーバを最小限に食い止め、サービスの収益率を改善してお給料を増やしてもらうのがよいのだろうと思う。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/01/2010.html</feedburner:origLink></entry>

<entry>
    <title>あけましておめでとうございます。</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/6vv8U9VaZtM/post-2.html" />
    <id>tag:blog.nomadscafe.jp,2010://1.26</id>

    <published>2010-01-03T12:58:42Z</published>
    <updated>2010-01-03T13:30:57Z</updated>

    <summary>あけおめ！ことよろ！今年は耐えた感じです！ プライベートでは、昨年は子供が生まれ...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>あけおめ！ことよろ！今年は耐えた感じです！</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="R0012587.jpg" src="http://blog.nomadscafe.jp/2010/01/03/R0012587.jpg" width="320" height="240" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></p>

<p>プライベートでは、昨年は子供が生まれ生活ががらりと変わった一年でした。仕事の方に目を向けると、前回に続いてのYAPC::Asiaでの発表、mixiアプリの開始による変化への対応、また、技術評論社様のWEB+DB PRESSで連載をさせて頂くなど新しいチャレンジもできました。</p>

<p>今年は息子が保育園に入る予定があるなどなどまだまだ激動は続きそう。そして6月には0x20歳。仕事も去年の激動の余波が残っていますが、2011年、2012年と何を目指すのかも自分なりに考えていたいなぁと思っています。</p>

<p>ってことで今年もよろしくお願いします。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2010/01/post-2.html</feedburner:origLink></entry>

<entry>
    <title>WEB+DB PRESS Vol.54「大規模Webサービスの裏側」 第五回</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/fDonG_z-qLE/webdb-press-vol54web.html" />
    <id>tag:blog.nomadscafe.jp,2009://1.25</id>

    <published>2009-12-22T01:34:47Z</published>
    <updated>2009-12-22T01:52:26Z</updated>

    <summary>2009年もそろそろ終わりですね。 WEB+DB PRESSで連載させて頂いてい...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>2009年もそろそろ終わりですね。</p>

<p>WEB+DB PRESSで連載させて頂いている「大規模Webサービスの裏側」もVol.54にて第五回となりました。</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&nou=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=nomadscafejp-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4774140643" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p><br />
第五回目の今回は、「ログ＆データ解析 .. 現状の改善と新サービス開発のために」ということで、アクセスログの解析やデータマイニングの話題を、システム運用グループの加藤幹生さん、研究開発の木村さんと藤澤さんに書いて頂きました。</p>

<p>一般にシステム運用の仕事のイメージとは少し異なりますが、大量のデータをさばく重要な技術のひとつです。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2009/12/webdb-press-vol54web.html</feedburner:origLink></entry>

<entry>
    <title>Plack::Server::AnyEvent::Prefork</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/qwEpp65mymE/plackserveranyeventprefork.html" />
    <id>tag:blog.nomadscafe.jp,2009://1.24</id>

    <published>2009-12-05T04:27:03Z</published>
    <updated>2009-12-05T05:16:01Z</updated>

    <summary>Preforkした上でAnyEventのloopを動かすPlack::Serve...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>Preforkした上でAnyEventのloopを動かすPlack::Server::AnyEvent::Preforkを、先週のPlack Hackathonの時間で形にしてgithubに<a href="http://github.com/kazeburo/Plack-Server-AnyEvent-Prefork">push</a>しました。</p>

<p>はなぼくろ師との共作です。</p>

<p>目的は、AnyEventでもマルチコアを使いたいよねという理由ですが、それほど一般的な利用はないと思います。plackupの方でprefork処理を行うとかいう話もあったりなかったりなので、しばらくCPANにはアップロード予定ありません。不足している部分もありますので、fork &amp; patchウェルカムです</p>

<p>Hello Worldだけのテストで生AnyEventとの比較
ベンチマークをしたサーバはVMware ESXi上の仮想マシン。一応CPU 2つ割当てある</p>

<p>起動はこんな感じ</p>

<pre><code>plackup -a hello.psgi --server AnyEvent::Prefork --max_workers 2 --max_reqs_per_child 10000 --port 8080 --env production
</code></pre>

<p>AnyEvent</p>

<pre><code>Concurrency Level:      100
Time taken for tests:   3.941 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      680000 bytes
HTML transferred:       40000 bytes
Requests per second:    2537.41 [#/sec] (mean)
Time per request:       39.410 [ms] (mean)
Time per request:       0.394 [ms] (mean, across all concurrent requests)
Transfer rate:          168.50 [Kbytes/sec] received
</code></pre>

<p>AnyEvent::Prefork</p>

<pre><code>Concurrency Level:      100
Time taken for tests:   2.673 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      680000 bytes
HTML transferred:       40000 bytes
Requests per second:    3740.71 [#/sec] (mean)
Time per request:       26.733 [ms] (mean)
Time per request:       0.267 [ms] (mean, across all concurrent requests)
Transfer rate:          248.41 [Kbytes/sec] received
</code></pre>

<p>preforkにするだけで、req/secが50%アップしてます。
これで多少CPUを使ったり、block処理が入ってもAnyEventで動かすことができるんじゃないかなと思います。</p>

<p>現在残っている課題としては、子プロセスがmax request per childに達した際にまず、新規のacceptを行わないようにしていますが、その際に既存のコネクションをいつまで保持するかの処理が入っていない点です。streamingをやっていた場合は新規のacceptを受けない状態でいつになってもプロセスが死なない→新規のプロセスが立ち上がらない→リクエストを全く受けれない。なんていうことが起こることです。
現状としては、アプリケーションに応じてそのあたりの処理を入れていくしかないと思われます。</p>

<p>会社の最新サーバでも試してみたいな。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2009/12/plackserveranyeventprefork.html</feedburner:origLink></entry>

<entry>
    <title>JPerl Advent Calendar 2009始まりました</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/4cRI_opErzY/jperl-advent-calendar-2009.html" />
    <id>tag:blog.nomadscafe.jp,2009://1.23</id>

    <published>2009-12-02T01:34:31Z</published>
    <updated>2009-12-02T01:53:21Z</updated>

    <summary>いよいよ12月ですねー。 去年から始まった、JPerl Advent Calen...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>いよいよ12月ですねー。
去年から始まった、JPerl Advent Calendarですが、今年は<a href="http://perl-users.jp/articles/advent-calendar/2009/hacker/index.html">Hacker track</a>と<a href="http://perl-users.jp/articles/advent-calendar/2009/casual/index.html">Casual track</a>の2本立てで書かれることになりました。さらにnekokakさんによる<a href="http://perl-users.jp/articles/advent-calendar/2009/dbix-skinny/index.html">DBIx::Skinny track</a>も始まってます。Advent Calendarを紹介するMeta Advent Calendarができそうな勢いです</p>

<p>毎日どんなtipsが上がってくるのか楽しみです。</p>

<p>いきなり初日ですが、Casual trackで記事を1つ書かせて頂きました。</p>

<p>最速IPアドレスマッチ研修会 - JPerl Advent Calendar 2009<br />
<a href="http://perl-users.jp/articles/advent-calendar/2009/casual/01.html">http://perl-users.jp/articles/advent-calendar/2009/casual/01.html</a></p>

<p>内容はIPアドレスが指定したCIDR内にあるかの確認を行なえる各モジュールのベンチマークです。Net::IP::Match::XSは高速ですが、まだまだ最適化の余地がありそうな気がしています。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2009/12/jperl-advent-calendar-2009.html</feedburner:origLink></entry>

<entry>
    <title>UPSが壊れたっぽい。Femo,LIMILIC復旧</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/hj8ekAFaLqE/upsfemolimilic.html" />
    <id>tag:blog.nomadscafe.jp,2009://1.22</id>

    <published>2009-10-22T14:53:40Z</published>
    <updated>2009-10-22T15:20:56Z</updated>

    <summary>本日(2009/10/22)の午前5時頃より、本BlogとFemo、LIMILI...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>本日(2009/10/22)の午前5時頃より、本Blogと<a href="http://femo.jp/">Femo</a>、<a href="http://limilic.com/">LIMILIC</a>にアクセスができない状態になっていました。<br />
利用していて頂いている方にご迷惑をおかけしました。</p>

<p>アクセスが出来なくなっていた原因は、自宅サーバが落ちていたということですが、なぜ落ちていたかというと、UPSが壊れたっぽいからです。<br />
現在はUPSなしで動いてますので、停電があるとまた止まってしまう可能性があります。こちらの対策も早めに行うつもりです。<br />
(そういや、ここ何年か停電を経験してないかも)</p>

<p>これまで使っていたUPSは、三菱電機の<a href="http://www.mitsubishielectric.co.jp/frequps/">FREQUPS</a>の350VA製品。
実は6年ぐらい使っていました（ここが駄目
バッテリがもうだめだったのでしょう。交換考えないとなぁと思っていた矢先でした。</p>

<p>UPSが壊れて気になるのは、その廃棄方法です。調べると、鉛が入っているので通常のゴミとして捨ててはならないようです。</p>

<blockquote>
  <p><a href="http://ror.hj.to/r/content/entry/1/200805/3499-570b3c152566319bc191ad264616f4df">元祖ワシ的日記2.0 無停電装置の廃棄で困った</a></p>
</blockquote>

<p>そこで調べたところ、オムロンのUPSを新規にUPSを購入した場合に、オムロンが他社のUPSでも無料で引き取っていることを発見。</p>

<blockquote>
  <p><a href="http://www.omron.co.jp/ped-j/dengen/product/ups/replace.htm">UPSリプレイスサービス｜製品情報｜OMRON 電源機器</a></p>
</blockquote>

<p>APCでも同じようなサービスやってる</p>

<blockquote>
  <p><a href="http://www.apc.com/jp/s/trade/index.cfm">Trade-UPS(UPS買い替え促進プログラム)</a></p>
</blockquote>

<p>ということで、オムロンもしくはAPCのUPSを買い直して、こちらのサービスを利用して今のUPSを引き取ってもらおうか検討中。</p>

<p>350VAクラスのUPSなら、Amazonで結構安いNe。</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=nomadscafejp-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=B000BL8S98" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p><br /></p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=nomadscafejp-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=B0000AG7HB" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2009/10/upsfemolimilic.html</feedburner:origLink></entry>

<entry>
    <title>WEB+DB PRESS Vol.53「大規模Webサービスの裏側」 第四回</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/04Yu1pfE_Zo/webdb-press-vol53web.html" />
    <id>tag:blog.nomadscafe.jp,2009://1.21</id>

    <published>2009-10-21T05:15:27Z</published>
    <updated>2009-10-21T05:44:51Z</updated>

    <summary>10月は偶数月。 そして偶数月といえば、こちら。 WEB+DB PRESSで連載...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>10月は偶数月。<br />
そして偶数月といえば、こちら。</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&npa=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=nomadscafejp-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=477414004X" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p><br /></p>

<p>WEB+DB PRESSで連載させて頂いている「大規模Webサービスの裏側」の4回目がVol. 53に掲載されます。<br />
<a href="http://blog.nomadscafe.jp/2009/08/webdb-press-vol52web.html">第三回目のデータベース設計編</a>に続いて実運用編となっています。</p>

<p>内容は、OSの設定、ファイルシステムのチューニングから、MySQLの設定と監視の話です。1000台を超えるサーバを管理・運用していく上でのポリシーなども混ぜて書いています。<br />
紹介している設定などは大規模なサービスにだけ利用できるものではなく、小規模な運用でもパフォーマンス向上のために参考にできることが多いと思います。
<a href="http://blog.nomadscafe.jp/2009/09/linux-db.html">松信さんの本</a>や、<a href="http://blog.nomadscafe.jp/2009/10/mysql.html">アメブロ</a>さんの本と内容が被っていますが、8ページと手軽に読めると思いますので、ぜひお手をとって頂ければと思います。</p>

<p>その他Vol. 53には、mixiと同じくというか、規模がそれより大きいかもしれないYahoo!オークションの運用についての特集があります。<br />
10年以上サービスを続けているということで、さまざまなノウハウや経験がつまった記事になっています。やはり、他社の事例を読んだり、想像したりするのは面白いですね〜。参考になりました</p>

<p>あわせて読みたい</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&nou=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=nomadscafejp-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4798120723" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p>(即納できるみたいです)</p>

<p>【オマケ】<br />
Software Designの11月号にはバタラさんのインタビューが載ってますね。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2009/10/webdb-press-vol53web.html</feedburner:origLink></entry>

<entry>
    <title>PSGI/Plackで非同期 Web Server</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/nomadscafejp/~3/yEpNtbHJFd0/psgiplack-web-server.html" />
    <id>tag:blog.nomadscafe.jp,2009://1.20</id>

    <published>2009-10-18T14:04:54Z</published>
    <updated>2009-10-18T14:40:57Z</updated>

    <summary>PSGI/Plackにおいて、非同期にレスポンスが返せるstreamingという...</summary>
    <author>
        <name>Masahiro Nagano</name>
        <uri>http://blog.nomadscafe.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.nomadscafe.jp/">
        <![CDATA[<p>PSGI/Plackにおいて、非同期にレスポンスが返せるstreamingという仕様/機能が追加されました。<br />
<a href="http://bulknews.typepad.com/blog/2009/10/psgiplack-streaming-is-now-complete.html">PSGI/Plack streaming is now complete</a></p>

<p>これを使うと、streamingをサポートしたサーバから非同期/nonblockingにhttpやGearmanを利用して外部へ問い合わせを行い、その結果をレスポンスしたりできます。</p>

<p>また、これがPlackで既に実装済みなので、非常に短いコードでサーバの実装ができちゃいます。<br />
すばらしいですね。</p>

<p>すでにmiyagawaさんが、この機能を利用した非同期Web Framework「<a href="http://github.com/miyagawa/Tatsumaki">Tatsumaki</a>」を書かれています。
イベントを扱う部分が隠蔽されているので、これを使うとさらに簡単に実装できます。<br />
すばらしすぐる。</p>

<p>ここでは、簡単に外部へAnyEvent::HTTPを用いて、HTTPリクエストを行うサンプルを書いてみます。</p>

<pre><code>use AnyEvent;
use AnyEvent::HTTP qw//;

$AnyEvent::HTTP::MAX_PER_HOST = 20;

my $url = 'http://localhost/tmp/sleep3.cgi';

my $hanlder = sub {
    my $env = shift;

    my $cv = AE::cv;
    AnyEvent::HTTP::http_get $url, sub {
        my $content = shift;
        $cv-&gt;send(
            [ 200, [ "Content-Type" =&gt; 'text/plain', ], [$content] ] );
    };

    return sub {
        my $start_response = shift;
        $cv-&gt;cb(
            sub {
                $start_response-&gt;( shift-&gt;recv );
            }
        );
      }
  }
</code></pre>

<p>PSGIのHandlerでcallbackを返し、その中でhttpアクセスからの通知を待ちます(recv)。
Any::Event::http_get でレスポンスが得られたら、配列形式のレスポンスを構築しcallbackへ通知します。</p>

<p>起動はplackupを利用します。</p>

<pre><code>% plackup --app test.psgi --server AnyEvent port 8080
</code></pre>

<p>アクセス先のsleep3.cgiは3秒間のsleepしてからレスポンスを返す通常のCGIです。
なので、このサーバへアクセスすると必ず、レスポンスに3秒かかります。</p>

<pre><code>% time curl http://localhost:8080/
sleep 3
curl http://localhost:8080/  0.00s user 0.01s system 0% cpu 3.052 total
</code></pre>

<p>では、abを利用して、平行してリクエストするとどうなるでしょう。</p>

<pre><code>% time ab -c 10 -n 10 http://localhost:8080/
Concurrency Level:      10
Time taken for tests:   3.328 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      720 bytes
HTML transferred:       80 bytes
Requests per second:    3.01 [#/sec] (mean)
Time per request:       3327.714 [ms] (mean) 
Time per request:       332.771 [ms] (mean, across all concurrent requests)
Transfer rate:          0.21 [Kbytes/sec] received
</code></pre>

<p>ここで重要なのは、3行目のこのテストにあわせてどれくらいの時間がかかっているかです。<br />
3秒×10回の30秒ではなく、ほぼ、3秒しかかかっていません。これは10個のリクエストを非同期に処理、sleep3.cgiへのアクセスし、レスポンスを返していることで実現できています。</p>

<p>これだけコード量も少なくこのような機能をつくれるのはうれしいですねー。</p>
]]>
        

    </content>
<feedburner:origLink>http://blog.nomadscafe.jp/2009/10/psgiplack-web-server.html</feedburner:origLink></entry>

</feed>
