ページ

2009年3月26日

2009年3月19日

フェールオーバーサーバだけど、サービスとしては継続できないシステム

知り合いはフェールオーバーサーバって、意味ないんじゃね?(理由はいろいろある)と漏らしていました。でもね、基本的にはサービスをノンストップで継続させるためや安心感のためには、やっぱり必要かもしれません。少なくとも、高いお金を出してシステムをくむのであれば、なるべくサービスを継続できるように、すくなくとも理論上は組むべきです。
いろいろなベンダーさんやISの人たちとお話をしていると、信じられないような構成、というか、何がしたいのかわからない構成のシステムがあります。

そのシステムはWebアプリケーションで、フロントエンドにアプリケーションサーバがいて、バックエンドにデータベースがいます。データベースのデータはSAN上に保存されます。ここまでは至って平凡です。さて、アプリケーションサーバは簡単に増やせますがデータベースは増やせないし、データベースが落ちたらすべてのアプリケーションサーバが止まってしまいます。そこで、データベースはフェールオーバーサーバにおいて、アクティブ/スタンバイの構成になりました。ここまでは普通です。アクティブのサーバでデータベースは動きます。
次にアプリケーションサーバの出番です。アプリケーションサーバは増やせますが、当初は一台から始めたそうです。ちなみに、アプリケーションサーバは一台で十分な見積もりなんですが・・・。で、そのアプリケーションサーバはフェールオーバーサーバのスタンバイの方に配置されてアクティブな方にあるデータベースと接続します。データベースサーバに障害が発生したらスタンバイのデータベースが使われます。アプリケーションサーバはスタンバイの方にいるので、データベースに障害が発生しても接続するデータベースをスタンバイの方に勝手に切り替えてはくれません。また、スタンバイが落ちたら、アプリケーションサーバは死にます。
そして見事に、データベースはフェールオーバーされますが、サービスとしては継続できないシステムができたそうです。

フェールオーバーなんか考えずに、アプリケーションサーバとデータベースサーバ一台ずつの安価な構成にすればいいと思うのは僕だけでしょうか?

2009年3月18日

今日のランチ

USBメモリの中に入れたCygwinがときどき欲しくなる

例のWindowsの中になんちゃってUNIX環境を作るCygwinですが、僕は昔から使っている割には嫌いです。Windowsとしっくりなじまないので。さらに、WindowsのDOS窓がださださでvim使っているとまともに使えなかったり(昔の話で今は知らない)です。ちなみにXを動かせば?というのはなしです。まあ、それでもTera Termを使えば、まともなターミナル環境に変身したりします。

さて、ずっと使っていたわりには、僕のCygwinのイメージは2004,5年のころのまま止まっていました。そのあと、UTF-8 Cygwinなるものが日本語をそこそこ扱えるようになっていました。Cygwin 1.7という人も、そこそこマルチバイトをハンドリングできるそうです。まあ、自分で日本語のファイル名をつけることはほとんどないんですけどね。

Cygwinを一番使いたいと思う瞬間は自分以外のPC(特に開発者以外のPC)を使うとCygwinが入っていないことが多く、何か調査しようとするときにとてもいらだちます。ほとんどの操作はtailとgrepで事足りますが、それ以外のコマンドも使いたいものです。で、Live USB LinuxがあるからUSBメモリに入れたCygwinがあるかなー?と調べてみるとありました。まあ、簡単に言っちゃえば、普通にインストール先をUSBメモリにすればいいだけです。そのうち作ります。

2009年3月13日

これに乗る

大阪に行く。
飛行機、ドキドキ。

2009年3月6日

ubuntuでjavaのバージョンの切り替え

ubuntuは複数のJavaをインストールできて使い分けられるので便利です。でも、デフォルトのvmの指定の仕方をすぐに忘れるのでメモ。まず、java5と6は

$ sudo aptitude install sun-java5-jdk sun-java6-jdk


として複数バージョンをインストールできます。さて、デフォルトのVMは次のようにして切り替えます。

$ sudo update-alternatives --config java

`java' を提供する 5 個の alternatives があります。

選択肢 alternative
-----------------------------------------------
1 /usr/lib/jvm/java-1.5.0-sun/jre/bin/java
+ 2 /usr/lib/jvm/java-6-openjdk/jre/bin/java
* 3 /usr/lib/jvm/java-6-sun/jre/bin/java
4 /usr/bin/gij-4.2
5 /usr/bin/gij-4.3

デフォルト[*] のままにするには Enter、さもなければ選択肢の番号のキーを押してください:
まあ、デフォルトがgijになっていたりするときに、別のものに変えるためにも必要です。そうしないとJAVA_HOMEとかいろいろ設定しないといけなくなります。まあ、社内では、使わないんだからgijを削除すると言うのがチップスになっているようです。

Windowsの時計の精度

上のグラフ(WindowsXPでのロックのコストのグラフ)で段々畑になっているのが不思議に思っている人がいるようなので、ちょっとだけ補足。段々になっているのは、スケジューラーのせいとかそういうことじゃなくって、Windowsの時計の精度が15m secぐらいだからです。なので、そのあたりに丸められるので段々畑になります。

2009年3月5日

Web SphereのサーブレットをEclipseでデバッグ

IBMのWebSphereはいろいろ困ったちゃんですが、お友達が売ったりもしているので無下にはできません。さて、WebSphereで動いているWebアプリケーションをデバッグしたいのは人の世のツネです。なので、チップス。

WASの設定
まずは、WASの設定です。管理コンソールを開いて、[サーバー]-[アプリケーションサーバー]からデバッグしたいサーバを選択します。次に[デバッグ・サービス]をクリックします。[サーバー始動時にサービスを使用可能にする]にチェックを入れて保存します。各項目はデフォルトのままで。

Eclipseの設定
メニュー[Run]の[Debug Configuration]を開きます。左のペインの[Remote Java Application]をダブルクリックします。新しい項目にConnection Proptertiesでサーバのホスト名とポート番号(7777)を指定して[debug]ボタンを押せば、リモートのWebアプリケーションをデバッグできます。でも、リモートでデバッグするとやはり、ちと重い



JavaのロックWindows変

昨日の続きをちょっとだけ。「JavaのロックのOSごとの計測」で使ったWindowsはMacBookのParallelsで動いているWindowsです。CPUの数は一個だけを割り振っています。CPUを2個割り振ると、こんな感じになります。桁が違います。秒単位の値になります。数百倍遅いです。これ以上計測する気がしません。

スレッド数時間
12
2390
523484
1058094

もくもくもく

今日のランチ

アルカサール

うっし〜

2009年3月4日

JavaのロックのDual Coreのwindowsでの計測

JavaのロックのOSごとの比較の続きです。Windows XPでAthron x2 2GのDual Coreなマシンでの計測です。まずは、グラフから(計測とグラフ作成は会社の中山さんがやってくれました。Excelでグラフの作り方は僕が教えました)。



えー、オーダーが違います。それから、遅すぎて100スレッドまで計測するのは諦めました。Dual Coreだと変なのか、AMDだからか、よく分かりません。

下は前回のエントリのWindowsの結果を縦のスケールを変えてもう少し見やすくしたものです。だんだん畑になっている。


このロックの回数はとあるプロジェクトでJSPがグローバルな変数をロックしている回数とほぼ同じぐらいなんです。かなりおもしろい結果でした。

JavaのロックのOSごとの計測

先ほどのエントリの続きです。
この際なので、いろいろなOSで調べてみました。まずは、僕のまくぶくたんからです。Linuxにくらべてばらつきがありますが、それでもきれいな線が引けます。スピードはLinuxに比べて100スレッドで1秒ぐらい速いです。


次がMacのParallelsで動作しているWindows XPでの計測結果です。間違ってはいません。速いのです。100スレッドで200ミリ秒ぐらいです。一桁違います。



次がもう一度Linuxですが、今度はserverオプションを付けて実行しています。serverオプションを付けると綺麗な直線で、断絶はありません。clientモードだとスレッド数によってロック戦略を買えているでしょう。


社内の素のWindowsマシンで、シングルコアのCPUだと僕のWindowsと同じ結果がでています。で、nakayamaさんのAthron x2のWindowsで同様の計測をしようとしたら、めちゃくちゃ遅いらしいです。結果は後で…。

javaのロックのコスト かも

とある理由からJavaのロックってどれくらいコストがかかるのか調べてみました。使ったJavaのコードは下の奴です。

import java.util.*;

public class test implements Runnable {
public static void main(String[] argv) {
int threadNum = Integer.parseInt(argv[0]);

test t = new test();
t.doIt(threadNum);
}
long total = 0;
public void doIt(int numThread) {
List<Thread> threads = new ArrayList<Thread>();
for (int i=0; i<numThread; i++) {
Thread thread = new Thread(this);
threads.add(thread);
}
long start = System.currentTimeMillis();
for (Thread t: threads) {
t.start();
}
for (Thread t: threads) {
try {
t.join();
} catch(Exception e) {
e.printStackTrace();
}
}
long end = System.currentTimeMillis();
System.out.println("" + numThread + "," + (end - start));
}

public void run() {
for (int j=0; j<100; j++) {
for (int i=0; i<1000; i++) {
synchronized(this) {
total += 1;
}
}
}
}
}
このプログラムをスレッド数を1から100までループでごりごり回します。テストした環境はMacじゃなくってLinuxでAthron x2 5000/memory 2Gです。今回はメモリは関係ないですが・・・。
結果をプロットしたものがこれ。横軸がスレッド数。縦軸が実行時間(ミリ秒)です。

基本的には線形に伸びています。何回か計測しましたが、40から50スレッドのところに溝があります。謎です。溝の前後は比較的安定した線形ですが、スレッド数が大きい方がなだらかなのは強豪の結果でしょう。でもこのグラフ、不思議過ぎます。