先日入れた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してみる […]