mongoDB官方網站下載:
1、mongodb-linux-i686-2.2.1.tgz
2、java驅動
mongo-2.2.jar
測試服務器爲Dell E5410 的Debian linux 2.6,配置爲:
1、4核,2.33GHz
2、內存3G
3、SATA硬盤2T
web服務器:tomcat5.5
打壓工具:Apache Bench
監控工具:mongostat
測試思路:
1、因爲MongoDB內置了連接池,所以客戶端程序相對簡單,只需從一個Mongo的單例獲取連接即可;
2、每個請求做1000次插入;
測試代碼MongoDBManager:
public class MongoDBManager {
static private MongoDBManager instance; // 唯一實例
// public static final String DB_NAME = "lab";
// public static final String MESSAGE_COLLECTION = "email";
static synchronized public MongoDBManager getInstance(final String ip, int port, int poolSize) throws UnknownHostException {
if (instance == null) {
instance = new MongoDBManager(ip,port,poolSize);
}
return instance;
}
private MongoDBManager() {
}
private MongoDBManager(final String ip, int port, int poolSize) throws UnknownHostException {
init(ip,port,poolSize);
}
public DB getDB(String dbname) {
return mongo.getDB(dbname);
}
private Mongo mongo;
public void init(final String ip, int port, int poolSize)
throws java.net.UnknownHostException {
System.setProperty("MONGO.POOLSIZE", String.valueOf(poolSize));
if (mongo == null) {
MongoOptions options = new MongoOptions();
options.autoConnectRetry = true;
options.connectionsPerHost = poolSize;
ServerAddress serverAddress = new ServerAddress(ip, port);
mongo = new Mongo(serverAddress, options);
}
}
}
測試代碼InsertMongodbServlet:
public class InsertMongodbServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Integer insertNum = Integer.valueOf(req.getParameter("insertNum")
.toString());
resp.setContentType("text/html;charset=UTF-8");
resp.setHeader("Cache-Control", "no-cache");
DB db = MongoDBManager.getInstance("127.0.0.1", 27017, 500)
.getDB("lab");
DBCollection tests = db.getCollection("tests");
for (int i = 0; i < insertNum; i++) {
DBObject test = new BasicDBObject();
test.put("id", 10000);
test.put("name", "This is for mongodb insert.");
tests.insert(test);
}
resp.getWriter().write(" Insert mongodb successed!");
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}
開始壓力測試,開1000個線程,共插入100萬條記錄:
/usr/sbin/ab -n 1000 -c 400 http://192.168.175.130:8080/labWeb/insertMongodb.do?insertNum=1000
監控:bin/mongostat
可以看到在400個併發情況下,插入100萬記錄,QPS在28000左右。