2012年7月4日水曜日

Node.jsで手動GCをかける

どうも、オレ@残業中です。

今日はNodeアプリケーションで任意のタイミングでGCをかける方法をめもめも。
nodejs_jpグループ内で、メモリリークに質問してたら@shigekiさんに教わりました。
※その時の質問はコチラ(https://groups.google.com/forum/#!topic/nodejs_jp/WcbaEZndexE)
※@shigekiさんのサンプルソースはコチラ(https://gist.github.com/2840165)

Nodeを起動するときに

$ node --nouse_idle_notification and --expose_gc app.jp
のようにして起動させます。


GCをかける時は、プログラム内に

global.gc();
を追加します。


参考サイトはこちら
MANUALLY RUN GC IN NODE.JS - DEV JAR
V8エンジンのGCはこれからも改良されていき、またV8がNodeに反映されるまでも少しタイムラグがあるみたいですが、
これから少しずつ改良されていくことに期待です。


以上でぇえぇぇぇす。

2012年7月3日火曜日

Node.jsをv0.8.1にしたらexpressがv3.0.0 beta4になって動かなくなった

どうも、オレ@お昼休みです。
Nodeが一気にv0.6.19からv0.8.1になったという知らせを受けて早速バージョンアップしました。

$ nave install stable

何かが動かなくなるだろうな、と思いながらテスト用に作ってあるexpress+socket.io製app.jsを起動しようとすると案の定動きませんでした。
「動きません」というか起動はするのですが、socket.ioを使ったwebsocket接続ができませんでした。
接続してもうんともすんとも言わない状況です。

expressのhello-worldサンプルのがるGitを見ると、どうもexpressの使い方が以前と変わってるみたい。
→createServer()が必要なくなったぽい。

なので、サンプルに習ってこう書き換えます。(部分抜粋)

$ vim app.js

---------------------------------
var express = require('express');
// これはもう使わない
// var app = module.exports = express.createServer();
var app = express();

var io = require('socket.io');

// 使わない
// app.listen(3000, function() {
//    console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
//});

var socket = io.listen(app.listen(3000));
これでバッチリ



以上でぇぇえぇぇす。

2012年6月7日木曜日

mroongaをインストール

どうも、俺@残業中です。
今日はMySQLの全文検索エンジンmroonga(v2.03)をインストールする方法をメモメモ。
超簡単です。
公式サイトはこちら

MySQL(v5.5.25)はインストール済みとします。(今度こっちのインストール方法もメモメモしとかな)

まずはgroongaインストール。(yumインストール)
# rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-0.noarch.rpm
# yum install groonga-devel

ちなみにgroongaをソースからインストールする場合は
# yum install mecab-devel
しておいて

# wget http://packages.groonga.org/source/groonga/groonga-2.0.3.tar.gz
# tar zxvf groonga-2.0.3.tar.gz
# cd groonga-2.0.3
# ./configure
# make -j$(grep '^processor' /proc/cpuinfo | wc -l)
# mak install
とします。
※未検証です。ここを参考にしてみてください。



次に辞書をインストール。(MeCabの辞書)ソースインストールした場合はmecab-develの中に入ってるかも?

# yum install mecab-ipadic

ここまででとりあえずgroongaはインストールされました。
/usr/lib以下にgroongaというディレクトリが出来てると思います。




いよいよmroongaインストール。

# wget 'https://github.com/downloads/mroonga/mroonga/mroonga-2.03.ta.gz'
# tar zxvf mroonga-2.03.ta.gz
# cd mroonga-2.03



configureしてmakeしてmake installします。

# ./configure --with-mysql-source=/path/to/mysql --with-mysql-config=/path/to/mysql/bin/mysql_config --with-default-parser=TokenMecab
# make
# make install
これでMySQLのプラグインディレクトリ以下にha_mroonga.soが生成されます。
例)/usr/local/mysql-5.5.25/lib/plugin/ha_groonga.so



mysqldを起動または再起動してmysqlにログインします。

# /path/to/mysql/bin/mysql
mysql> INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';
mysql> SHOW ENGINES;

+--------------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                    | Transactions | XA   | Savepoints |
+--------------------+---------+------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                         | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                      | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
| mroonga            | YES     | CJK-ready fulltext search, column store                    | NO           | NO   | NO         |
+--------------------+---------+------------------------------------------------------------+--------------+------+------------+
7 rows in set (0.02 sec)
Yes!インストールでけた!


あとはCREATE TABLEする時に

 ENGINE=mroonga;
をつけてね!






以上でぇぇぇえぇす。

2012年6月3日日曜日

log4jsを使う

どうも、俺@自主勉中です。

今日はjavasscript(今回はNode.js利用)でシステム構築するときにとても便利なlog4jsの紹介です。

インストールはnpmで

$ npm -g install log4js

使い方は
var log4js = require(‘log4js’);
// 設定
log4js.configure({
  appenders: [
    { type: ‘console’, category: ‘console’ },
    { type: ‘file’, filename: ‘logs/access_log’, category: ‘access_log’, backups: 30, maxLogSize: 1024 * 1024 }
  ]
});

var consoleLog = log4js.getLogger(‘console’)
  ,accessLog = log4js.getLogger(‘access_log’);
consoleLog.info(’Server Start.');
accessLog.info(‘This is test(access_log)’);
こんな感じです。
configure()で指定した
backupsはファイルの世代数、maxLogSizeはファイルをローテートする時の最大ファイルサイズ(単位:byte)です。

ログの出力は
  1. trace()
  2. debug()
  3. info()
  4. warn()
  5. error()
  6. fatal()
とあります。
ログレベルは

var logger = log4js.getLogger(‘access_log’).setLevel(‘ERROR’);
のように指定することも可能です。

ちなみにNode.jsが標準出力するログは、上記の

{ type: ‘console’, category: ‘console’ }
で指定してあり、Node起動時に

$ node app.js >> logs/node.log
とかすれば良いです。
、、こうしないとNode.jsが吐き出すログをファイルに書き出せないです。

誰かその原因知っている人いたら教えて欲しいです。



以上でぇぇぇぇぇす。

2012年5月26日土曜日

特定のプロセスが使用しているメモリ量を監視する

どうも、俺@土曜の昼下がりです。 部屋に無理やり書斎(みたいなもの)を作ったのでとても快適です^^ さて、Linuxサーバにおいて特定のプロセスが使ってるメモリ量を調べる方法メモです。
#!/bin/sh

mem=0 #メモリ量
bef=0 #beforeの略のつもり
res=0 #結果
# 仮にapache(httpd)のメモリ量を取得する場合
while [ 1 ]
do  
    for n in `/bin/ps aux | awk '/httpd/ { print $6 }'`
    do
        mem=`expr $mem + $n`
    done
    res=`expr ${mem} - ${bef}`

    # メモリ量($mem)と前回との差分($res)を表示
    echo `date "+%F %T (${mem}) -> ${res}"`
    
    bef=$mem
    mem=0

    # 1秒ごとに処理
    sleep 1;
done
これを、apache_memorycheck.shとか名前をつけて
$ chmod +x apache_memorycheck.sh
して実行すれば 1秒ごとにapacheが使っているメモリ量と、1秒前との差分を表示できます!


$ ps axu
した結果の「RSS」の部分がプロセスが確保している物理メモリ量なので、それをawkを使って加算して計算しています。
ちなみに「VSZ」は仮想メモリ量です。(プロセス起動時にとりあえず確保される)

 以上でぇぇえぇえす。