#navi_header|Java| Apache MINA で Echo Server/Client を作ってみた。 - http://coderepos.org/share/browser/lang/java/echo_samples/act8 通常、習作のechoサーバ/クライアントと言えばせいぜいが数文字のテキストデータをやりとりする程度。 今回の "act8" は可変長パケットっぽいデータ形式にラップして、1MBのランダムデータを複数クライアントから延々と送受信し続ける状況を想定している。 目的としては、実際に1MBを越えるデータを送受信するアプリケーションをMINAで組んだ場合、ByteBufferを使うことでヒープオーバーフローやOutOfMemoryが発生するか検証すること。 ---- 実際にServer側で -server -Xms200m -Xmx200m -Xloggc:gc.log でgcログを出力し、gcviewerで確認した結果が以下のスクリーンショット。クライアント側は10個の接続、1MBのパケットを100ms間隔で送受信している。 青い線がヒープ消費量、灰色の縦線がGC発生とGCにかかった時間を示す。 &image(798, width=600) なんとかオーバーフローやOutOfMemoryが発生せずに動き続けているが、10秒強の間隔でフルGCが発生している。 &image(799, width=600) ---- 但し上記例だと、クライアント側が1秒間に送信するデータの合計は 1MB * 10(1000/100ms) * 10 = 100MB で、800Mbpsになる。実験はloopbackデバイスを使っているとはいえ、現実的には100Mbpsのネットワークカードを使う事になるので、明らかに送信過剰といえる。 そこで、実際の100Mbpsに即したパケットサイズに調整してみる。間隔もクライアント側でビジネスロジックを処理する事を考慮し、200ms位を目安にしてみる。 10クライアント x 200ms(interval) x 262144bytes = 104,857,600 bits/s (100Mbps) 実際はこれにTCP/IPのヘッダーが付く為、100Mbpsを少し上回る計算になる。 クライアント側を上記セッティングで、サーバー側のヒープMAXを200MB、上記と同じ条件にして実行したのが下記gcviewerになる。 &image(801, width=600) フルGCは発動せず、かなり安定したヒープ使用量とGC状況になった。 ---- 検証環境 Windows XP SP3 Pentium4 2.8GHz (HT) 2GB RAM Java 1.6.12 Apache MINA 1.1.7 #navi_footer|Java|