2011/02/20
GAE/Jのspinupとmemcache その3
感覚的な物だけでは何なので I/O -> memcacheの効果を検証してみる為にした。
init()の中で 85bytes のリソースを5つ読み込むだけのServletで試した。
テスト用に用意した環境が撃重で凄い結果になった。
- memcache無し
たまたま凄く重い環境に当たったのだと思うが実機での検証結果なので 何もしないServletが24秒とか実際に起こり得るらしい。
むしろ貴重な情報が取れてラッキーだったかもしれない。
spinup実時間のバラツキに対しては かなり効果が見込めそうなので試してみて欲しい。
できれば結果をコメントしてもらえると情報が蓄積できるのでお願いしまふ。
テストに使ったServlet:
package org.kotemaru.test;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.google.appengine.api.memcache.*;
public class TestServlet extends HttpServlet {
private static final String NS_MEMCACHE = "Test";
private static MemcacheService memcache =
MemcacheServiceFactory.getMemcacheService(NS_MEMCACHE);
public void init(ServletConfig config) throws ServletException {
try {
System.out.println("start init.");
/*
getResource(TestServlet.class, "test1.properties");
getResource(TestServlet.class, "test2.properties");
getResource(TestServlet.class, "test3.properties");
getResource(TestServlet.class, "test4.properties");
getResource(TestServlet.class, "test5.properties");
*/
getResourceWithCache(TestServlet.class, "test1.properties");
getResourceWithCache(TestServlet.class, "test2.properties");
getResourceWithCache(TestServlet.class, "test3.properties");
getResourceWithCache(TestServlet.class, "test4.properties");
getResourceWithCache(TestServlet.class, "test5.properties");
} catch (Exception e) {
e.printStackTrace();
throw new ServletException(e);
}
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.getWriter().write("test");
return;
}
public static String getResourceWithCache(Class clazz, String name) throws IOException {
String val = (String) memcache.get(name);
if (val != null) {
val = getResource(clazz, name);
memcache.put(name, val);
}
return val;
}
public static String getResource(Class clazz, String name) throws IOException {
InputStream in = clazz.getResourceAsStream(name);
try {
return readerToString(new InputStreamReader(in, "UTF-8"));
} finally {
in.close();
}
}
public static String readerToString(Reader reader) throws IOException {
StringBuffer sbuf = new StringBuffer();
int n = 0;
char[] buff = new char[4096];
while ((n=reader.read(buff)) > 0) {
sbuf.append(buff, 0, n);
}
return sbuf.toString();
}
}
関連記事:
init()の中で 85bytes のリソースを5つ読み込むだけのServletで試した。
テスト用に用意した環境が撃重で凄い結果になった。
- memcache無し
実行時間 CPU時間 17238ms 1778cpu_ms 24499ms 1832cpu_ms 17569ms 1870cpu_ms 11694ms 1777cpu_ms- memcache有り
6167ms 2015cpu_ms 9290ms 1905cpu_ms 6573ms 1833cpu_ms 1918ms 1376cpu_msCPU時間は変わらないのに実行時間は memcache有りの場合、半分以下になっている。
たまたま凄く重い環境に当たったのだと思うが実機での検証結果なので 何もしないServletが24秒とか実際に起こり得るらしい。
むしろ貴重な情報が取れてラッキーだったかもしれない。
spinup実時間のバラツキに対しては かなり効果が見込めそうなので試してみて欲しい。
できれば結果をコメントしてもらえると情報が蓄積できるのでお願いしまふ。
テストに使ったServlet:
この投稿へのコメント

コメント・フォーム