我目前正在使用 Vert.x 对我的应用程序执行一些基准测试,并且我正在尝试比较使用 mongo java 同步或异步驱动程序时的结果。
令我惊讶的是,使用同步驱动程序的结果似乎要好得多,因为与异步驱动程序相比,它使用的 mongodb 连接非常少。结果,mongo 请求速度较慢,并且 mongo 总是通过与异步驱动程序崩溃来完成。
与同步驱动程序相比,异步驱动程序打开这么多连接是否正常?如果是,我们是否需要安装 mongo 作为副本集以更好地使用异步驱动程序进行扩展?
例如,这里是 wrk 的测试结果,在 30 秒内有 200 个连接,有 16 个线程。
使用同步驱动程序:
~ • wrk -t16 -c200 -d30s http://localhost:8080/f0e7a0f5/status
Running 30s test @ http://localhost:8080/f0e7a0f5/status
16 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 131.90ms 42.75ms 567.64ms 78.19%
Req/Sec 92.61 21.28 171.00 66.36%
43997 requests in 30.10s, 3.23MB read
Socket errors: connect 0, read 55, write 0, timeout 0
Requests/sec: 1461.89
Transfer/sec: 109.93KB
使用异步驱动程序(mongodb 崩溃):
~ • wrk -t16 -c200 -d30s http://localhost:8080/f0e7a0f5/status
Running 30s test @ http://localhost:8080/f0e7a0f5/status
16 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 424.87ms 205.89ms 1.38s 73.84%
Req/Sec 31.68 20.04 118.00 64.01%
13597 requests in 30.11s, 1.00MB read
Socket errors: connect 0, read 31, write 0, timeout 0
Requests/sec: 451.65
Transfer/sec: 33.96KB
- MongoDB 3.2.7 有线虎
- Mongo Java 驱动程序 3.2.2
- 顶点 3.3.1
- Mac OS X El Capitan 2.5 Ghz I7 16 Go RAM
更新 1:我通过配置文件和进程限制解决了本地机器上的 mongodb 崩溃问题:https ://unix.stackexchange.com/questions/108174/how-to-persist-ulimit-settings-in-osx-mavericks 但是,我仍然有许多与异步驱动程序打开的连接,这会减慢我的应用程序。
更新2:这是异步驱动程序的一些代码。垂直:http://pastebin.com/SygKuDhg
配置:
"mongo-platform" : {
"pool_name": "mongo-platform",
"host": "localhost",
"port": 27017,
"db_name": "mongo_platform",
"maxPoolSize": 250,
"minPoolSize": 20,
"useObjectId": true
}
更新 3:这是同步驱动程序的代码
我使用 Jongo 作为 java 同步驱动程序的包装器,并使用 vertx-hk2 将依赖项注入到我的 REST verticle 中。