今のところ、いろんなアプリケーションが混在するサーバーに mongoDB を置いているのだが、そうすると、各種パラメータ等の設定が面倒(こっちを立てるとあっちが立たない、みたいな感じになりがち)なので、mongoDB をリモートのサーバーに置いて、そこにデータを登録するようにしてみた。
システム構成
(mongoDBサーバー)
- CPU Intel(R) Core(TM) i7-4771 CPU @ 3.50GHz HyperThread OFF
- MEMORY 20 GB
- LAN 100Mbps
- DISK WDC WD5000BPVT-00HXZT1 500GB
- クライアントとはスイッチングハブを介して接続
mongoDB バージョン
3.0.4
データ登録
mongo shell から insert コマンドでデータを登録する。
insert ドキュメントを配列としてバルクサイズを変えて、ネットワーク転送量をメインに確認した。
サンプルDML
(hoge.sql)
for(i=0;i<100000;i++){
db.test.insert([{"header":{"time":1,"offset":9,"host":"host0001","item":"item0001"},"data":[{"parameter":"parameter0001","value":1.1},{"parameter":"parameter0002","value":2.2},{"parameter":"parameter0003","value":3.3}]},{"header":{"time":1,"offset":9,"host":"host0001","item":"item0001"},"data":[{"parameter":"parameter0001","value":1.1},{"parameter":"parameter0002","value":2.2},{"parameter":"parameter0003","value":3.3}]}...])}
(mongo shell)
\> mongo 192.168.1.1:27017 < hoge.sql
ドキュメントサイズ
> db.test.stats()
{
"ns" : "test.test",
"count" : 10000,
"size" : 2700000,
"avgObjSize" : 270,
"storageSize" : 356352,
"capped" : false,
...
コマンド実行ホストからmongoDBホストへのping
-
ドキュメントサイズに TCP のヘッダ分(20bytes)を加えて 290 bytes を設定
ping -s 290 -c 100 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 290(318) bytes of data.
298 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.836 ms
...
--- 192.168.1.1 ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 99001ms
rtt min/avg/max/mdev = 0.374/0.533/0.836/0.056 ms
結果
バルクサイズ | ネットワーク転送率 | 関連情報 |
---|---|---|
1 | 313.6Kバイト/sec | |
2 | 462.0Kバイト/sec | |
4 | 547.9Kバイト/sec | |
8 | 965.5Kバイト/sec | |
16 | 1.1Mバイト/sec | |
32 | 1.3Mバイト/sec | |
64 | 1.8Mバイト/sec | このあたりから vmstat で block I/O 待ちが起こった |
128 | 2.3Mバイト/sec | |
256 | 2.7Mバイト/sec |
- CPU, MEMORY, I/O についてはパフォーマンス的に特に問題はなかった
気付き
*リモートサーバーへのアクセス、それも、シングルでのインサートを考える
時は、ネットワーク性能がそれなりによくないときつい。
バルクインサートで極力パケットを詰め込んでネットワーク性能を引き出すのがベターなのはわかったのだが、それにしても ping 結果と比べて 1 insert 時のパフォーマンスがあまりに悪すぎる、ような気がする。
もう少し踏み込んで確認してみようと思う。