さくらの VPS で撃沈 (WordPress + HipHop 編)

高速化、最適化へのあくなき挑戦は続く。

今回は、PHP のアプリケーションを C++ に変換してネイティブ動作させてしまうという、にいさんに教えてもらった HipHop for PHP で WordPress を動作させることに挑戦です。

きまったリソースの中で最大限を求めるロマンは、コンピュータの世界もバイクの世界も同じに違いない、きゅるるるるる…、ぼぼん! では、いってみましょう。 🙂

…結論から言いますと、WordPress を動かすことは失敗しています。。 にいさんに夢を託します。(笑)

まずは、HipHop for PHP から。

Home – hiphop-php – GitHub

HipHop transforms your PHP source code into highly optimized C++ and then compiles it with g++ to build binary files. You keep coding in simpler PHP, then HipHop executes your source code in a semantically equivalent manner and sacrifices some rarely used features – such as eval() – in exchange for improved performance.

最近では JavaVM や .NET の CLI ではランタイム最適化でネイティブのスピードを超えてしまうこともあるらしいですが、PHP のインタプリタにそれを望むのは厳しいというわけで、C++ にしてネイティブにしてしまえ! というプロダクトです。

Facebook で使われているそうですが、すごいっすね。

sakura-hiphop

スクリーンショットに意味はない。。

さてちょうどいいことに、さくら VPS のデフォルト OS である CentOS 5 AMD64 用の rpm が Hiphot サイトで提供されています。

Installing or Building HipHop-PHP via RPM on CentOS 5 – hiphop-php – GitHub

HipHop has been developed on CentOS and Fedora, but only based on source code and some patches. You may found this way is hard.
So, I create some patched RPM’s for easy HipHop installation on CentOS 5

At the moment, RPM’s only for 64 bits systems. I work on 32bits in that moment, and you can get RPMS as soon as possible.

じゃ、じゃ、じゃー、さくらの VPS で動かしてスピードの向こう側をみてやろうじゃないか、というのがこの企画。

サイトの手順でいけるかなと思ったのですが、依存関係でなかなか手強い。。 おそらく以下の手順で依存は解消できると思われます。(ただし、後述するとおりセグるのでだめなのかもです)

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
yum install cvsps
 
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
yum install --enablerepo=remi mysql-server mysql-libs
yum install --enablerepo=remi mysql-devel-5.1.50-2.el5.remi
 
/etc/init.d/mysqld start
 
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm
rpm -ivh rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm 
yum install --enablerepo=rpmforge perl-Error.noarch
 
wget http://www.n0c.org/RPM/centos/5/x86_64/tla-1.3.5-7.x86_64.rpm
rpm -ivh tla-1.3.5-7.x86_64.rpm 
 
yum install tk gd gd-devel mcrypt libmcrypt tidy mhash freetds net-snmp httpd-mmn libtool-ltdl
yum remove subversion
yum install libc-client subversion-perl
yum install pcre pcre-devel libidn-devel expat-devel libmcrypt-devel libcap-devel
yum install binutils binutils-devel cmake gcc
 
yum update
 
yum remove libxml2-2.6.26-2.1.2.8.i386
yum remove curl-7.15.5-9.el5.i386

どーしても rpm のありかが分からなくて、なぞのリポジトリ(tla)も一部つかっていますのでご注意ください。 その他は、手順にあるリポジトリを利用しています。

でもって、提供されている .rpm をインストール。 ここで使った .rpm は以下の通りです。 sourceforge.net にあったもの全部です。

#!/bin/sh
 
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-doc-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-devel-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/tbb-2.2-1.20090809.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-xmlrpc-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-xml-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-tidy-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-soap-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-snmp-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-pgsql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-pdo-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-odbc-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-ncurses-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mysql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mssql-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mhash-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mcrypt-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-mbstring-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-imap-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-gd-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-devel-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-dba-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-common-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-cli-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-bcmath-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/php52-5.2.12-1.ius.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/perl-Git-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/oniguruma-devel-5.9.2-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/oniguruma-5.9.2-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/m4-1.4.13-4.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-static-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-python-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-devel-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libxml2-2.7.6-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-doc-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-devel-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libicu-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libevent-devel-1.4.13-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/libevent-1.4.13-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/icu-4.2.1-6.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/hiphop-php-1.0-2.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/gnupg-1.4.10-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-svn-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/gitk-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-gui-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-email-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-cvs-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-arch-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-all-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/git-1.7.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/flex-2.5.35-7.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/curl-devel-7.20.0-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/curl-7.20.0-1hiphop.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-doc-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-devel-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/boost-1.37.0-1.x86_64.rpm/download
wget http://sourceforge.net/projects/hphp/files/CentOS%205%2064bit/RPM/autoconf-2.63-3.noarch.rpm/download

でもって、以下で HipHop for PHP のインストール、環境設定はOKだと思います。

# rpm -ivh *.rpm
# cd /usr/lib64/hphp
# export HPHP_HOME=`pwd`
# export HPHP_LIB=`pwd`/bin

あとは、WordPress のディレクトリに cd して変換、コンパイルをかければ…。

# cd /opt/sakura.maple4ever.net/
# find . -name "*.php" > files.list 
# $HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50

…。

parsing inputs took 0'00" (157 ms) wall time
pre-optimizing...
pre-optimizing took 0'00" (75 ms) wall time
inferring types...
inferring types took 0'00" (142 ms) wall time
post-optimizing...
post-optimizing took 0'00" (15 ms) wall time
creating CPP files...
Core dumped: Segmentation fault
セグメンテーション違反です

[tegaki]マイガー![/tegaki]

というわけで、コンパイルに入る前にセグって落ちてしまうようです。。

ちなみにうまく C++ に変換されたソースは以下の感じです。

#include <php/wp-content/themes/twentyten/functions.h>
#include <php/wp-content/themes/twentyten/single.h>
#include <cpp/ext/ext.h>
 
namespace HPHP {
 
Variant pm_php$wp_content$themes$twentyten$single_php(bool incOnce /* = false */, LVariableTable* variables /* = NULL */) {
 
  LINE(10,invoke_failed("get_header", Array(), 0x26068646792ABCAELL));
  echo("\n\t\t<div id=\"container\">\n\t\t\t<div id=\"content\" role=\"main\">\n\n");
 
  if (toBoolean(LINE(15,invoke_failed("have_posts", Array(), 0x243E9CC8A30DB2F4LL)))) LOOP_COUNTER(1);
  {
    while (toBoolean(invoke_failed("have_posts", Array(), 0x243E9CC8A30DB2F4LL))) {
      LOOP_COUNTER_CHECK(1);
      {
        invoke_failed("the_post", Array(), 0x41F4B03CC3C890CFLL);
        echo("\n\t\t\t\t<div id=\"nav-above\" class=\"navigation\">\n\t\t\t\t\t<div class=\"nav-previous\">");

ここでは分かりやすいようにかなり抜粋していますが、PHP が C++ に変換されているのがワカリマス。 これは twentytn の single.php 部分ですがなんてことを、って感じですね(笑)

ちなみに、WordPress 以外はというと bbPress も同様に変換がおちました。 ごくごく簡単な、test.php ひとつだけだとうまくサーバ起動まで動作しました。

ランタイムでおちるのなら依存のライブラリかなとかも思うのですが、この段階で動くプロダクトが何かがよく分からなくて手詰まりとなりました。 最初さくら VPS 上でやっていたのでメモリ不足かなとおもって、ローカルの仮想マシンの CentOS 5.5 でもやってみたのですが同様の結果に。

もうちょっと時間があれば、file.list を増減させたりしてみたかったのですが、なんせ ここまでくるのに 12時間近く、、、わたしまけましたわ(笑)

まぁ小中学生のときはコンピュータうまく動かないことにハマって数ヶ月一人もんもんするくらいへーきだったので、根性なくなったな自分、などと思いつつ今日はここまでにしておきます。 😀

さくらの VPS で遊ぶ (WordPress 編)

昨日に引き続きまして、さくらさんの VPS。 今度は我らが WordPress のインストールに挑戦してみたいと思います。

WordPress なら VPS じゃなくて普通のレンサバでいいじゃないか、という声も聞こえてきそうですが、VPS の場合は レンサバでは自分で自由にいれることができない PHP アクセラレータとか memcached とか、MySQL のクエリーキャッシュとかをいじれるのがポイントになります。

まぁ面白そうだというのが一番だったりもしますです。 🙂

てなわけで さくら VPS は初期状態、本当にまっさらな感じなので、まずは Apache と PHP と MySQL のインストールから。

# yum update
# yum install httpd php php-mbstring php-mysql php-gd mysql-server

まぁこんな感じで…(SSH のログとばしてしまったので、間違っていたらすいません。。)

で、httpd.conf を設定します。 ここではこんな感じで。

   1: # cat /etc/httpd/conf/httpd.conf 
   2: <VirtualHost sakura.maple4ever.net:80>
   3:    ServerName sakura.maple4ever.net
   4:    DocumentRoot /home/apache/sakura.maple4ever.net/public_html
   5:    <Directory /home/apache/sakura.maple4ever.net/public_html>
   6:       AllowOverride all
   7:       Options -MultiViews
   8:    </Directory>
   9: </VirtualHost>

ディレクトリの権限などは chown –R apache:apache しておきます。 また、wp-config.php と .htaccess をつくらせるために public_html に書き込み権限を。 あとで落としてください。 (試験の適当設定なので本気でやるときはユーザを作成するなど注意深くやってください)

でもって、httpd と mysqld を起動して mysql にデータベースを作成。 ここではやってませんが、mysql のパスワードもちゃんと設定のこと。

# /etc/init.d/httpd start
# /etc/init.d/mysqld start
# mysql -u root -p
パスワードは初期状態なし
\ create database 'sakura' default character set utf8 collate utf8_general_ci;

あとはいつも通り、WordPress を public_html にいれて、URL にアクセスでございます。、 🙂

   1: # cd /home/apache/sakura.maple4ever.net/public_html
   2: # wget http://ja.wordpress.org/wordpress-3.0.1-ja.tar.gz
   3: # tar zxvf wordpress-3.0.1-ja.tar.gz
   4: # cp -R wordpress/* .
   5: # rm -Rf wordpress
   6: # cd ..
   7: # chown -R apache:apache public_html
   8: # chmod +w public_html

ということで、無事起動します。 データもプラグインも入っていないのでなかなかさくさく動きます。

いけるか!?。。

これだと実運用の動きが分からないので、hiromasa.another (ここ)のデータをインポートしてみました。 画像の http セッションも確認したかったので、画像も移して URL を置換しています。

いけ~。

[tegaki]きゅるるるるるる、ぼぼん![/tegaki]

ひろまさ「ずがーん、のこりメモリ 40MByte。。。。。」

ひろまさ「ちょっぱ~を寝かせてきます。」

Masayan「…」

失意のひろまさくん。

ちなみにこのブログで一番重い処理は、kougabu のサムネイル作成だったりします。 複数画像を非同期で縮小かけにいくので結構メモリをくいます。(そのため kougabu ではプログラムで一定数以上同時につくらないように動作を制限しています。 なかなかサムネイルできないときあるのはこの機能のせいです)

はたして残りメモリ 40M じゃ、PHP アクセラレータも memcached もいけんわなぁと思いつつ、せっかくだからと言うことでどうなるのか APC のインストールをしてみる。

PHP: 導入 – Manual

Alternative PHP Cache (APC) は、PHP の実行コードをキャッシュする仕組みで、 フリーかつオープンに使用できます。PHP の中間コードのキャッシュ・最適化を行うための、 フリーでオープンかつ堅牢なフレームワークを提供するということを目標としています。

# yum install php-pear php-devel 
# pecl install APC
no と答えた
# vi /etc/php.ini
extension=apc.so # 入れる
# /etc/init.d/httpd restart

うまくはいると phpinfo() にこんなんでます。

sakura21 

そして、WordPress を表示して、いろいろアタックしてみたあとに free。

ひろまさ「なんと、のこりメモリ 200M キター!」

ぼのを「…」

どうやら APC でバイトコードをつくるとメモリ使用量がずいぶん減るようです。(たぶん) しかも速度が 1.5倍くらい速くなりました。

Powered by WordPress. Built on the Thematic Theme Framework. (75 queries.1.902seconds.)

最初は 3秒以上くらいかかっていたのでだいぶいい感じです。

そして調子に乗って memcached も導入して、WordPress コアのクエリなどをキャッシュしてみます。

# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm
# yum install memcached php-pecl-memcache
# /etc/init.d/memcached start
# cd /home/apache/sakura.maple4ever.net/public_html/wp-content
# wget http://plugins.trac.wordpress.org/export/285287/memcached/trunk/object-cache.php
# chown apache:apache object-cache.php

これで、PHP から memcached がみえて WordPress が使ってくれるハズです。

sakura20 

で、キャッシュを効かせる感じで、ブラウザからぽちぽちあくせす。。 🙂

Powered by WordPress. Built on the Thematic Theme Framework. (28 queries.1.415seconds.)

1.9 秒かかっていたのが、1.4 秒になりました! (昔やったときはクエリ 4 くらいまで落ちたのですが、テーマとかプラグインなど対応していない SQL のせいかもです。 チューニングの余地あり)

で、しばらく触った後のメモリを観測。

# free
             total       used       free     shared    buffers     cached
Mem:        510532     504212       6320          0       3372     111752
-/+ buffers/cache:     389088     121444
Swap:      2048276      28984    2019292
# memcached-tool 127.0.0.1 display
  #  Item_Size  Max_age   Pages   Count   Full?  Evicted Evict_Time OOM
  1      96B       478s       1       3      no        0        0    0
  2     120B       478s       1       3      no        0        0    0
  3     152B      1068s       1       4      no        0        0    0
  4     192B       963s       1       3      no        0        0    0
  5     240B      1062s       1       3      no        0        0    0
  7     384B       574s       1      34      no        0        0    0
  8     480B       957s       1      62      no        0        0    0
  9     600B       957s       1     145      no        0        0    0
 10     752B       957s       1      32      no        0        0    0
 11     944B      1640s       1       5      no        0        0    0
 13     1.4K      1640s       1       3      no        0        0    0
 14     1.8K      1640s       1       2      no        0        0    0
 16     2.8K      1654s       1       3      no        0        0    0
 17     3.5K       958s       1       4      no        0        0    0
 18     4.4K      1655s       1       4      no        0        0    0
 19     5.5K       958s       1      10      no        0        0    0
 20     6.9K      1644s       1       4      no        0        0    0
 21     8.7K      1655s       1       2      no        0        0    0
 22    10.8K       958s       1       5      no        0        0    0
 23    13.6K       958s       1       4      no        0        0    0
 24    16.9K       958s       1       4      no        0        0    0
 25    21.2K       958s       1       6      no        0        0    0
 26    26.5K         0s       1       0      no        0        0    0

のこり 121M キター。 これならいける。 いける。

さすがに VPS なので CPU 的な部分はやはり遅いようで、ここのコアサバの表示速度には及びませんが(ちなみに最近ひどく調子がいい。 0.3秒くらいでレンダリング終了します)、必ず一定の速度で動けて、その他工夫次第でチューニングもできるので遊ぶには面白いのではないかと思います。

ちなみに今回動かしたサイトは、こんなかんじです。 (そのうち消えます)

ひろましゃ.さくらVPS :o)

というわけで、もうすこしいろいろな角度から検証は必要そうですが、APC いれるとなかなかいけそうな気がします。 もちろん使い方、サイトの規模にもよると思いますので、やられる方は2週間の試用期間で確認するといいと思います。 🙂

以上、デプロイ田中でした。

DVC00012

あ、関係ない。(笑)

さくらの VPS で遊ぶ (Redmine + Subversion 編)

さくらインターネットさんが低価格 VPS をはじめたということで、さらに2週間のお試し期間もあるということで、どういった感じか見るために早速登録してみることにしました。

VPS のポイントは何はなくてもそのメモリ。 さくらさんのは 512M ということで、まずは確実にちょっと厳しいことが予想される、Java + Serlvet + PostreSQL アプリからやってみました。 まぁ実験と言うことで。 🙂

ターゲットは最近おなじみ Redmine と Subversion サーバです。

さくらのVPS|VPS(仮想専用サーバ)はさくらインターネット

さくらのVPSは、仮想化技術を用いて1台の物理サーバ上に複数の仮想サーバを構築し、お客様だけの仮想専用サーバとしてご利用いただけるサービスです。専用サーバの自由度と共用サーバの低価格、そして仮想サーバならではの機能を合わせ持ったホスティングサービス、さくらのVPSをぜひご利用ください。

仮想化 VPS ということで、OS (標準で CentOS 5.5 64bit版)の root のパスワードがもらえます。 root があればどんなアプリ動作環境でもライブラリでも、好きに入れることができるのが最大の嬉しいところ。 ここでは、一般のいわゆるレンタルサーバではサポートされていない、Java + サーブレットの環境をつくってアプリを配置してみました。

ちなみに、コントロールパネルより root のパスワード通知のメールが少し遅れてきて、初期パスワードをどこだどこだと最初に探したのはここだけの秘密です。。

さて、さくらさん VPS で面白いなと思ったのが、コンソールログインがブラウザ上からできること。 JavaScript で実装されている?! top コマンドとかもちゃんとでてすごいですね。

redmine31

これのおかげで、まちがって SSH のサービスおとしちゃったとか、iptables ミスってネットワークログインできなくなっちゃったとかも回復することができます。 他には、OS の起動停止やリソースの閲覧が可能です。 残念ながら仮想マシンのスナップショットバックアップはとれませんが、これは低価格ゆえ仕方がないところでしょう。

では Java + Tomcat6 + PostgreSQL + mod_dav_svn(Subversionサーバ) をインストールしてみます。 まずは気になる初期状態のメモリは以下のような感じでした。 (起動して yum update しただけの状態)

# free
             total       used       free     shared    buffers     cached
Mem:        510532     433784      76748          0      53672     340188
-/+ buffers/cache:      39924     470608
Swap:      2048276          0    2048276

起動サービスはたいぶ初期状態でしぼってあり、バッファ、キャッシュを除いて 470M ほど Free な感じです。

これに mod_dav_svn をインストール。 rpmforge から yum install mod_dav_svn しています。 で、Apache とともに起動。

# free
             total       used       free     shared    buffers     cached
Mem:        510532     442624      67908          0      53804     341040
-/+ buffers/cache:      47780     462752
Swap:      2048276          0    2048276

まぁ起動させただけなので、、460M ほど Free。

次に Redmine で使う PostgreSQL をインストール。 yum install postgresql-server の感じで。

# /etc/init.d/postgresql start
Initializing database:                                     [  OK  ]
Starting postgresql service:                               [  OK  ]
[root@www1431u opt]# free
             total       used       free     shared    buffers     cached
Mem:        510532     483876      26656          0      11332     416120
-/+ buffers/cache:      56424     454108
Swap:      2048276         80    2048196

まぁこちらも起動しただけなので、450M。

で、Tomcat6 をインストール。 jsvc を使ってデーモン起動しています。

まず、jsvc (commons-daemon-1.0.2-native-src) をコンパイルするために、JDK の64bit 版を (jdk-6u21-linux-x64-rpm.bin)をインストールしています。 でもって、起動シェルを以下の感じで。

# cat /etc/rc3.d/S80tomcat6 
#!/bin/sh
#
# chkconfig: - 80 20
# description: jsvc
 
# Source function library.
. /etc/init.d/functions
 
JAVA_HOME=/usr/java/default
CATALINA_HOME=/opt/tomcat6
TOMCAT_USER=tomcat
TMP_DIR=/tmp
CATALINA_OPTS="-Xmx256M -Xms128M"
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
PIDFILE=/var/run/tomcat.pid
LOCKFILE=/var/lock/subsys/tomcat
DAEMON=$CATALINA_HOME/bin/jsvc
 
start(){
    #
    # Start Tomcat
    #
 
    echo -n "Starting tomcat6: "
    $DAEMON \
    -pidfile $PIDFILE \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Djava.io.tmpdir=$TMP_DIR \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap
 
    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        touch $LOCKFILE
    else
        echo_failure
    fi
    echo
}
 
stop(){
    #
    # Stop Tomcat
    #
    echo -n "Shutting down tomcat6: "
    $DAEMON \
    -stop \
    -pidfile $PIDFILE \
    org.apache.catalina.startup.Bootstrap
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        rm -f $PIDFILE $LOCKFILE
    else
        echo_failure
    fi
    echo
}
 
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status $DAEMON
        RETVAL=$?
        ;;
    *)
        echo $"Usage: jsvc {start|stop|restart|status}"
        exit 1
        ;;
esac

CATALINA_OPTS="-Xmx256M -Xms128M" として最大 256M を JavaVM に割り当てみました。 あと、mod_proxy_ajp で Apache を経由させています。

ではいってみましょう。

[tegaki]きゅるるるるるる…、ぼぼん![/tegaki]

redmine30

動きました!

気になるメモリは、、

[root@www1431u logs]# free
             total       used       free     shared    buffers     cached
Mem:        510532     504736       5796          0       3528      33020
-/+ buffers/cache:     468188      42344
Swap:      2048276     382568    1665708

42M。(笑)

この状態でブラウザ操作レベルで、多重アクセスの負荷をかけてみましたがさすがに5多重くらいにすると OutOfMemoru Exception で落ちてしまうようです。

Subverion へ大量ファイル(WordPress のファイル)のコミットもしてみました。 こちらはうまくいきましたが、バックで Redmine を操作するとやはり厳しい模様。 また、tag と trunk など大量の差分比較も難しそうです。(broken pipe してた)

てなわけで、やる前から厳しいなとは思っていたのですが、Java のアプリは 512M だとなかなか厳しそうです。 Redmine に関しては(未検証ですが)素直に Passenger(mod_rails) を使えばうまくいくような気もしますが、ここは実験ということで。 🙂

Tomcat に関しては標準で入っている manager アプリとかおとして、768M メモリだったらいけそうなので、実におしい。。 デプロイ田中もにっこり。

それにしても VPS は手軽面白いですね。 実践的に Linux で遊べるという部分で 1台もっていると何かと嬉しいかもしれません。

てなわけで、次は WordPress を入れてみたいと思います。 お楽しみに。 😀