目的
CoherenceのEntryProcessorによる並行処理の検証を行う。注:個人的な検証の結果です。
検証環境
Intel Core i7 S860(2.53GHz)DDR3 16GB
Windows7 Ultimate
Java 6.0 update 18
Oracle Coherence 3.6.1
検証
CoherenceのEntryProcessorを使い、QuadCore+HyperThreadingのCPUで並行処理のスケールアウトを確認してみます。横軸の数値は起動したCoherenceの数、縦軸は処理秒になります。
グラフ上の数字は処理秒を表します。
グラフを見るとCoherenceの起動数が4つまでは処理時間が1/2、1/3、1/4と減っていきました。しかし、5つ以降は4つの場合とほぼ変わりませんでした。検証を行ったCPUの実コアは4つでありその数まではスケールアウトしますが、HyperThreadingによる効果は低いようです。
また、検証を行っての感想として実装が非常に簡単でした。これまでに研究などでマルチスレッドやMPIを用いたプログラミングを行ってきましたが、一部制約はありますがそれを考慮するのみでプログラム上に他のノードを気にするようなコードを記述する必要もなくCoherenceを追加起動するだけで処理可能量を増やせるのには驚きでした。
検証方法
今回はこれといった計算は行っておりません。処理時間を稼ぐためのforループを大量に回しているのみです。本ソースからjarファイルを作成しcache-server.batでクラスパスを指定することにより起動時に取り込まれます。cache-server.bat(:launchのみ抜粋)
:launchオプションとクラスパスを適宜変更して下さい。
set java_opts="-Xms%memory% -Xmx%memory% -Dtangosol.coherence.localhost=127.0.0.1 -Dtangosol.coherence.ttl=0"
"%java_exec%" -server -showversion "%java_opts%" -cp "%coherence_home%\lib\coherence.jar;%coherence_home%\lib\faceted.jar" com.tangosol.net.DefaultCacheServer %1
goto exit
EntryProcessorFunc.java
package com.chirokings;EntryProcessorRun.java
import java.io.IOException;
import com.tangosol.io.pof.PofReader;
import com.tangosol.io.pof.PofWriter;
import com.tangosol.io.pof.PortableObject;
import com.tangosol.util.InvocableMap.Entry;
import com.tangosol.util.processor.AbstractProcessor;
public class EntryProcessorFunc extends AbstractProcessor implements
PortableObject {
@Override
public Object process(Entry entry) {
double ret = 0;
for(long i = 0 ; i< 500000000L; i++){
ret=5;
}
return ret;
}
@Override
public void readExternal(PofReader arg0) throws IOException {
}
@Override
public void writeExternal(PofWriter arg0) throws IOException {
}
}
package com.chirokings;
import java.util.Map;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
import com.tangosol.util.filter.AlwaysFilter;
public class EntryProcessorRun {
public static void main(String[] args) {
NamedCache cache = CacheFactory.getCache("VirtualCache");
for(int i = 0 ; i<128 ; i++){
cache.put(i, i);
}
System.out.println(System.currentTimeMillis());
Map