Software development of explosion! −夢の破片(カケラ)たちの日々 別館− このページをアンテナに追加 RSSフィード Twitter

2012年07月28日

JMeterを使ってRedisの性能テストをする方法(JMeter TCP SamplerからCRLFで終わるリクエストを送る

Redisが使えるか(うちのシステム的にって意味で)検証するため、JMeter使って性能を検証しましょうってことで環境構築しました。

まぁ、仕事でやってることなので、検証結果とかは公開できませんが、

とりあえず、JMeter TCP Samplerを使って、Redisと通信するための方法を自分の備忘録も兼ねて残しておきます。

JMeterを使ってRedisと通信するには、JMeter TCP Smplerを使います。

JMeter 2.7 r1342401には標準でTCP Samplerが付属しているので、Apache JMeter - Download Apache JMeter落としてきて、適当なところに展開するだけで使えます。

このTCP Sampler日本語での解説サイトが少ないので、ちょっとだけ細かく記述します。

スレッドグループやコントローラー配下に、追加→サンプラーTCPサンプラーを選択して追加します。

すると、名前以外の欄が空の状態のTCPサンプラーの画面が表示されます。

f:id:poad1010:20120728221330p:image

TCPClient classnameには、org.apache.jmeter.protocol.tcp.sampler.AbstractTCPClientを実装したクラスを指定します。

JMeter 2.7 r1342401には標準でorg.apache.jmeter.protocol.tcp.sampler.TCPClientImplorg.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImplなどが付属しており、TCPClient classnameに何も入力しないと、jmeter.propertiesのtcp.handlerで指定されているクラスが使われるようです。

コメントアウトされているが、TCPClientImplが使われるようです)

他の欄は。。。まぁ、そのままの内容なので説明は割愛します。

Redisの場合、標準設定ではポート6379を使うので、ポート番号には「6379」を入力します。

今回は解説ということもあって、Windows版のRedisをno titleから落として来て使いますので、サーバ名またはIPには、「localhost」を指定しています。

f:id:poad1010:20120728215543p:image

先ずはTCPClientImplを使ってみます。

Redisのプロトコルプロトコル仕様 — redis 2.0.3 documentationにあるように、UTF-8のテキストをコマンドとして送受信しますので、

送信するテキストには「PING」コマンドを送信するように「PING<改行>」を入力します。

これでRedisサーバーを起動すればテスト実施準備が終わります。

テストを実行してみると分るのですが、このままだとテストが終わりません。(タイムアウトを指定している場合はReadExceptionでタイムアウトします)

ログを見てみると、デフォルトでキャラクターセットは「Windows-31j」となっています。

が、コマンド自体はASCII文字だけなので、SETコマンドやLPUSHコマンドのキー名やデータ部分に非ASCII文字を送らない限りは問題はないでしょうから、

とりあえずこのままでいきます。

そもそも、PuttyからRaw接続で繋いでmonitorコマンドを入力して監視しても、Redis側には何も送られていないように見えます。

設定ファイルを弄っても変わらないので、Redisサーバーを終了して、Scalaで試しにポート6379に送られてくる内容を標準出力にダンプしてみました。

DummyServer.scala

/**
 *
 */
package tv.dyndns.poad
import java.nio.channels.ServerSocketChannel
import java.net.InetSocketAddress
import scala.actors.Actor
import java.nio.channels.SocketChannel
import java.nio.ByteBuffer
import java.nio.charset.Charset

/**
 * @author Ken
 *
 */
class DummyServer(host : String, port : Int) extends Actor {
	private val channel = ServerSocketChannel.open();
	def act : Unit = {
		try {
			channel.socket().bind(new InetSocketAddress(host, port))
			println("start server " + host + ":" + port)
			while (true) {
				new Acceptor(channel.accept()).start()
			}
		} finally {
			channel.close()
		}
	}
	def close() : Unit = {
		if (channel.isOpen()) {
			channel.close()
		}
	}
}

class Acceptor(channel : SocketChannel) extends Actor {
	def act : Unit = {
		val buf = ByteBuffer.allocate(4096 * 2)
		loop {
			if (channel.read(buf) < 0) {
				exit
			}
			buf.flip()
			val decoded = Charset.forName("UTF-8").decode(buf).toString()
			println(decoded)
			decoded.getBytes().foreach { e => print("0x%02X ".format(e)) }
			println()

			buf.clear()
			buf.put("+OK".getBytes())
			channel.close()
			exit
		}
	}
}

DummyServerMain.scala

package tv.dyndns.poad
import scala.io.Source

object DummyServerMain extends App {
	val server = new DummyServer("localhost", 6379)
	try {
		server.start()
		while(true) {
			val line = readLine()
			if (line == "exit") {
				exit
			}
		}
	} finally {
		server.close()
	}
}

出力結果はこんな感じ。

start server localhost:6379

PING

0x50 0x49 0x4E 0x47 0x0A

JMeterが送っている内容を見てみると、改行文字として<LF>しか送ってません。

Redisは>CRLF<なので、正しいコマンドとして認識しておらず応答してくれなかったようです。

そこで、BinaryTCPClientImplを使ってデータを送ってみます。

BinaryTCPClientImplでは、送信データにはHEX文字列を入力する必要があるそうです。

f:id:poad1010:20120728231911p:image

これでテストを流してみると、Redis側はちゃんと応答するようになります。

ですが、テストが通りません。応答は返ってきているのですが、タイムアウトとなります。

原因は、JMeter側での応答データ終了の検出設定にあります。

jmeter.propertiesにtcp.BinaryTCPClient.eomByte=10を追記します。

※ データ終了を表す値(1byte)を10進数表記で記述します。

すると、見事にテストが通りました。

まとめ

  • TCPClientImplは終了文字としてLFしか送らない
  • バイナリーデータを送るにはBinaryTCPClientImplを使う
  • BinaryTCPClientで送るデータはHEX文字列を設定する
  • BinaryTCPClientの応答データの終了検出はjmeter.propertiesにtcp.BinaryTCPClient.eomByteとして10進数表記で応答データの最終1byteの値を設定する

2012年07月09日

HornetQ…

HornetQを検証で使っているのだけども、Consumerが居るQueueにQueueBrowserでアクセスしても、キューイングされてるメッセージが拾えない。

推測だけど、マルチスレッドで動いたときに、QueueBrowserの結果が保証出来なくなるのだろう。

なので、java.util.Queue#peek()みたいなことをやるのであれば、createQueueSession(true, Session.TRANSACTED)にしておいて、consumerで一旦receiveしたら、rollbackするくらいしか手がない。

ActiveMQならこんなことないんだけどね。

そもそも、何をやりたいかというと、複数のproducerがQueueにメッセージを送ると、ルーティングして、複数のconsumerが居るQueueに送られる。

そして、その複数のconsumerは、それぞれが別々のメッセージをQueueから受信(このときはQueueからは削除されない)して、別のQueue(ワーキング)に投げ込んでおく。

ワーキングに投げ込めたら、元のQueueからは捨てる(本来のMQ的な受信)。

そんなことがしたいわけです。

ルーティングがHornetQだと簡単に使えるってことなので、HornetQで行こうと思ったんだけど、上述したQueueから削除せずに受信ってのが出来ないわけですよ。

交互にQueueBrowserを開いて閉じてConsumerを開いて閉じてをやって、シングルスレッドなら出来る確認はしてはいるけど、そもそもがそんな使い方すべきじゃないしね。

JMSは使い辛いです。

Kestrelというのを試そうかとも思うけど、ルーティング出来るのかねぇ?ルーティングルールも問題だけど、落ちたときに永続化されてる必要があるのもまた厄介なところ。

まぁ、最悪、Cassandraという最終手段が...本当に最終手段だけど

ってことで、色々と検証してはいるものの、なかなかもって、いい手だてがない。

頑張りますか…

iPhoneから送信

2012年06月21日 もしも、新卒女子SEがアジャイルをマスターしたら このエントリーを含むブックマーク このエントリーのブックマークコメント

もしも、新卒女子SEアジャイルをマスターしたら…

もしドラではありません。もしアジャです。

何のネタかというと、

Software Design 2012/07号の特集です。

Software Design (ソフトウェア デザイン) 2012年 07月号 [雑誌]

Software Design (ソフトウェア デザイン) 2012年 07月号 [雑誌]

内容は、「これからはアジャイルだよね〜。ところで、アジャイルって具体的にどんなことをするの?」っていう人向けの内容で、

ちょっとした物語風な解説記事となっています。

読んでみて自分なりに理解したことは、アジャイルってバズワーズであって、

「旧来型のウォーターフォール開発では開発スピードが追いつかない上に、

開発者のモチベーションも下が一方。

これを改善するにはどうしたらいいのだろう?」という問題点を改善していこう!という取り組みそのものがアジャイルなのかな?と。

XPやScrum、リーン開発を取り入れたからといって、それがアジャイルだとは言えないだろうし、

逆に、旧来型のウォーターフォールでも、迅速に開発出来るように工夫をしていくだけでもアジャイルかも知れない。

アジャイルっていうのは、上で書いたような具体的なようで極めて抽象的なものなのかも知れません。

イノベーションを起こそうという取り組みこそがアジャイルであり、手法ではない。

考え方であって、手段でもない。

そんな大事なことを説いているように感じる記事でした。

すでにアジャイルを実践している方ではなく、アジャイルってどんなものなのだろう?とか、

アジャイルを取り入れたいんだけど!って人にはお勧めです。

2012年06月18日

ほたるって…

蛍って、死ぬと光続けるんですかねぇ。

うちのというか、俺の部屋の窓の前で何か光ってるなぁと思ったら、蛍の死骸でした。



フラッシュ炊いたら、虫が苦手な人にはキツい写真になっちゃったので、暗闇に光続けてる写真を載せました。


iPhoneから送信


f:id:poad1010:20120618231344j:image

2012年06月10日

平原綾香 Concer Tour 2012 〜ドキッ〜

はい!今月もライブに行って来ましたo(^▽^)o

7年ぶりの平原綾香のライブです。

そう、1st Tour以来の参戦!

まぁ、あの頃はFCに入ってたんですけどねぇ…

場所は、写真参照!!なんだけども…4年前にCHEMISTRYFace to Faceってアルバム引っさげてライブやったときの会場です。

懐かしい思い出の会場なんですよ。

カルビーかっぱえびせんの唄とか、徹子の部屋とか、チェルシーとか、角瓶とか…要っちの車のETCカード切れてて、料金所で止められたとか、嘉さん(堂珍さん)が公演前にランニングしてたら、ファンに追いかけられて、汗だくになったので、会場前にあるダイエーで下着買ったとかなどなど…

っと、ついついCHEMISTRYネタで熱くなってしまいましたf^_^;)

話を戻して、内容は…古い曲も数曲あったのですが、最近の曲が多くて、一応は予習して行ったのだけども、わからなかった(笑)

まぁ、どっかで聴いた曲だなぁとか、予習した曲だなぁって感じではあったので、楽しめはしたけど…(単に、予習した曲の曲名と歌詞を覚えてなかっただけというのは秘密)

まぁ、雰囲気としてはしっとり系メインにノリのいい曲が数曲混ざった感じで、基本的には座って聴く感じでした。

1曲、「みんなにも丸々歌ってもらうからね〜」といって一緒に歌う(でも、みんな歌詞知らなくて、最後のほうで歌詞教えながら歌ってた)とか、「手首、今のうちに回しておいてね。次の曲は簡単そうに見えて意外と難しいから」とか言って観客にも振り付け教えて一緒にやらせたりとか、1stの頃から比べると随分変わりました。

歌自体は流石に上手かったです。



終わってから思うと、MCもグダグダしてなく、一生懸命、ファンと向き合おうとしている感じでした。

特に、最後にはけるときなんかは、みんなに手を振って、お辞儀して、一番最後に「ありがとうございましたーっ!」って言ってはけて行ったのが印象的でした。

ケミだと、手を振りながら、颯爽とはけて行く感じなので(まぁ、要っちが「ありがとう!」って軽い感じでお礼を言うだろうけど」)とても印象に残りました。

あとは、衣装着替える(ドレス1枚脱いだり、シューズ履き替えたり)っていうのを、ステージ上でやる演出もびっくりでした。(完全に衣装替えるときは流石に下がってましたが)

そんなこんなで、最初思っていたよりは、何倍も楽しめてよかったですo(^▽^)o


CHEMISTRYのライブ行きたいなぁ…(ここは変わらず)

iPhoneから送信


f:id:poad1010:20120610213041j:image

Connection: close