先日入れたRedis(RedisをインストールしてSET/GETするにインストール方法書いてあります)ですが、
実際に運用する時に、ウン百万~ウン千万レコードのデータを扱う事になりそうっていうことで、
どんな動きするのか検証してみました。
■ 環境
とりあえず↓こんなんで。
サーバ(Ubuntu) ⇒ Redis。Masterだけ。設定もデフォルトのまま。CPUはPentiumD。メモリは2ギガ。 クライアント(Windows) ⇒ jedis。業務で使う時もJavaから呼ぶ事になると思うので。Core i5のノートPC。
jedisの使い方は簡単でした(Maven便利だなぁ)。
https://github.com/xetorthio/jedis の How do I use it? の通りです。
■ Redisへセット
KEYもVALUEも適当にcommon-langのRandomStringUtils使って。。
import java.util.Date;
import org.apache.commons.lang.RandomStringUtils;
import redis.clients.jedis.Jedis;
public class RedisSetter {
public static void main(String args[]) {
Jedis jedis = new Jedis("UbuntuのIPアドレス");
String key = null;
String value = null;
for (int i = 0; i < 10000000; i++) {
key = RandomStringUtils.randomAlphanumeric(20);
value = RandomStringUtils.randomAlphanumeric(10);
jedis.set(key, value);
if (i % 10000 == 0) {
System.out.println(new Date());
System.out.println("SET Counter : " + i);
}
}
}
}
■ Redisからゲット
import java.util.Date;
import org.apache.commons.lang.RandomStringUtils;
import redis.clients.jedis.Jedis;
public class RedisGetter {
public static void main(String args[]) {
Jedis jedis = new Jedis("UbuntuのIPアドレス");
String key = null;
String result = null;
for (int i = 0; i < 1000000; i++) {
key = RandomStringUtils.randomAlphanumeric(20);
result = jedis.get(key);
if (result != null) {
System.out.println("Matched! " + result);
}
if (i % 10000 == 0) {
System.out.println(new Date());
System.out.println("GET Counter : " + i);
}
}
}
}
■ クライアント側
GETを3多重、SETを2多重で動作させてみます。
■ サーバー側
Redisが吐いてるログみると5つのコネクション受け付けてます。

■ 結果
● サーバのリソース

#下のネットワークが上がりはじめたとこくらいか検証はじめました。
・CPU : 件数増えてもそんなに上がっていかない。
・メモリ: ひたすら右肩上がり。
定期的に取得されるダンプファイル(dump.rdb)が250メガを越えてきたくらいから怪しくなってきて、
スワップするようになったら極端にスループット落ちて検証にならなくなりました。。
● クライアント
コンスタントに4~5秒で1万回セットしていましたが、
サーバ側がスワップするようになったらSocketTimeoutで落ちました。
Exception in thread "main" redis.clients.jedis.JedisException: java.net.SocketTimeoutException: Read timed out at redis.clients.jedis.Protocol.process(Protocol.java:68) at redis.clients.jedis.Protocol.read(Protocol.java:116) at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:121) at redis.clients.jedis.Jedis.set(Jedis.java:58) at RedisSetter.main(RedisSetter.java:14)
■ ということで、、、
自分のメモリ2ギガのマシンだと750万件くらいしか突っ込めませんでした。
次はSETのループを500万回までにして、業務上想定されるGETのリクエストを
もっと多重度上げて実施してみようと思います。


コメント
[…] « Redisの負荷検証(1000万レコード突っ込んだ時の動きをみてみる) […]
[…] 以前、広告配信エンジンを作ってた時にRedisを使っていたのですが↓ ・Redisの負荷検証(1000万レコード突っ込んだ時の動きをみてみる) ・Redisに500万レコード突っ込んで複数クライアントからGETしてみる […]