我在三台服务器(一个局域网)搭建了一个sequoia集群,写了java程序跑各种批量操作,发现性能指标没有我期望的那么高,一个插入操作就需要6ms左右
但是系统的cpu和磁盘io使用很低,是我安装或使用哪里出问题,还是什么原因,请教下。
1万个记录的批量操作:
testSeqCleanAll :272(ms)
testSeqInsert :62498(ms)
testSeqUpsert :57246(ms)
testSeqQuery :74582(ms)
testSeqCleanAll :300(ms)
testSeqUpsert :68488(ms)
testSeqRemove :54682(ms)
10万个记录的批量操作:
testSeqCleanAll :260(ms)
testSeqInsert :601149(ms)
testSeqUpsert :619936(ms)
testSeqQuery :743080(ms)
testSeqCleanAll :1646(ms)
testSeqUpsert :669208(ms)
环境说明:
1. 三台linux服务器,操作系统centOS 2.6.39-200.24.1.el6uek.x86_64 ,三台机器都是一样的型号。
cpu 4核,Intel(R) Xeon(R) CPU E5606 @ 2.13GHz
内存 4G,free1.8G
2. 三个节点ip分别是71, 70, 72,其中71是主节点
分配了三个数据组,每个数据组一个节点,这样配置的目的是为了组建成高性能模式,利用分片提高读写性能,我们是要在阿里云上搭建数据,所以节点的数据安全性和稳定性有阿里云提供保证,综合性价比而采用这种方式。
| 组名 | 角色 | 主节点 |
| group1 | data | 172.16.10.71 : 11840 |
| 组名 | 角色 | 主节点 |
| group2 | data | 172.16.10.70 : 11840 |
| 组名 | 角色 | 主节点 |
| group3 | data | 172.16.10.72 : 11850 |
4. 客户端是java写的,客户端在71节点上运行,用jdk7编译并在jre7上执行
5. 域、集合空间、表的初始化:
> db.createDomain("pushDomain", ['group1', 'group2', 'group3'], {AutoSplit:true} )
> db.createCS('pushCS', {Domain:"pushDomain"})
> db.pushCS.createCL("test_cmmobi_push_userinfo", {ShardingKey: {"PRODUCTID":-1, "USERID":-1, "DEVID":-1}, ShardingType:"hash"})
> db.pushCS.test_cmmobi_push_userinfo.createIndex("KEY", {"PRODUCTID":-1, "USERID":-1, "DEVID":-1}, true, true)
测试流程:
1)循环插入批量数据
2)循环upsert
3)循环query
4)条件删除清理,只匹配PRODUCTID
5)循环upsert
6)循环条件删除清理,匹配PRODUCTID,USERID,DEVID
代码片段如下:
SeqDBDao.java:
public void upsertUserInfo(Sequoiadb sdb, int productId, String userId, String devId, long longinTs, String data) {
// TODO Auto-generated method stub
try{
DBCollection cl_user_info = SeqDBManage.getInstance().getCL_USER_INFO(sdb);
BasicBSONObject matcher = new BasicBSONObject();
BasicBSONObject modifier = new BasicBSONObject();
matcher.put("PRODUCTID", productId);
matcher.put("USERID", userId);
matcher.put("DEVID", devId);
modifier.put("PRODUCTID", productId);
modifier.put("USERID", userId);
modifier.put("DEVID", devId);
modifier.put("LOGINTS", longinTs);
modifier.put("DATA", data);
cl_user_info.upsert(matcher, new BasicBSONObject("$set", modifier), null);
}catch(Exception e){
e.printStackTrace();
}
}
DBLoadClient.java:
public void testSeqUpsert(int ProductId, int userid_max, int devid_max, String data){
long loginTs = System.currentTimeMillis();
Sequoiadb sdb = SeqDBManage.getInstance().getNewConnection();
for(int userid_index=0; userid_index
for(int devid_index=0; devid_index
String Userid = String.valueOf(userid_index);
String DevId = String.valueOf(devid_index);
SeqDBDao.getInstance().upsertUserInfo(sdb, ProductId, Userid, DevId, loginTs, data);
}
}
SeqDBManage.getInstance().releaseConnection(sdb);
long endTs = System.currentTimeMillis();
System.out.println("testSeqUpsert :" + (endTs-loginTs) + "(ms)");
}
SeqDBManage.java:
/**
* 每次取出新的连接
* */
public Sequoiadb getNewConnection(){
Sequoiadb sdb = null;
try {
sdb = ds.getConnection();
} catch (BaseException | InterruptedException e) {
// TODO Auto-generated catch block
sdb = null;
e.printStackTrace();
}
return sdb;
}
/**
* 用完后还回连接
* */
public void releaseConnection(Sequoiadb sdb){
if(sdb!=null){
ds.close(sdb);
}
}
public DBCollection getCL_USER_INFO(Sequoiadb sdb){
CollectionSpace cs = getPushCS(sdb);
DBCollection cl_userinfo;
if (stat_push_user_info_cl_exist || cs.isCollectionExist(CL_TEST_USER_INFO)){
cl_userinfo = cs.getCollection(CL_TEST_USER_INFO);
} else {
BasicBSONObject options = new BasicBSONObject();
BasicBSONObject sharedObj = new BasicBSONObject();
sharedObj.put("PRODUCTID", -1);
sharedObj.put("USERID", -1);
sharedObj.put("DEVID", -1);
options.put("ShardingKey", sharedObj);
options.put("ShardingType", "hash");
BasicBSONObject createTsObj = new BasicBSONObject();
createTsObj.put("CREATETS", -1);
cl_userinfo = cs.createCollection(CL_TEST_USER_INFO, options);
cl_userinfo.createIndex("KEY", sharedObj, true, true);
cl_userinfo.createIndex("CREATETS", createTsObj, false, false);
}
stat_push_user_info_cl_exist = true;
return cl_userinfo;
}
完整的代码工程及脚本:
########################
#!/bin/bash
java -jar db_test.jar 2 111 50 2 data1 > run.log 2>&1 &
########################
参数说明:
java -jar db_test.jar 2(type,2是测sequoiadb) 111(ProductID,不需改) 50(user最大值) 2(dev最大值) data1(字符串,不需改) > run.log 2>&1 &
user最大值乘以dev最大值就是每次循环的总次数
mongodb的环境还在弄,我明天测后再发出对比的结果。