我使用地理空间查询创建了一个小型Java应用程序(使用Spring Data)来测试MongoDB性能。
public class MongoThread {
public static void main(String[] args) throws Exception {
if(args.length != 1) {
System.out.println("Usage: MongoThread <nb_thread>");
System.exit(0);
}
int nbThread = Integer.parseInt(args[0]);
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfigStandalone.class);
MongoOperations db = (MongoOperations) ctx.getBean("mongoTemplate");
for (int x=0; x<nbThread; x++) {
double lat = Math.random() * 60;
double lng = Math.random() * 60;
double radius = 3000 + 50 * Math.random();
MyThread t = new MyThread("Thread #" + x, db, lat, lng, radius);
t.start();
}
//create1MEntries(db);
}
private static void create1MEntries(MongoOperations db) {
if (!db.getCollectionNames().contains("Item")) {
db.createCollection("Item");
}
db.indexOps(Item.class).ensureIndex(new GeospatialIndex("loc"));
for(int i=0; i<1000000; i++) {
Item item = new Item();
item.setName("item" + i);
item.setLoc(new double[]{Math.random() * 180, Math.random() * 180});
db.save(item, "Item");
}
}
}
class MyThread extends Thread {
String name;
MongoOperations db;
double lat, lng, radius;
public MonThread (String name, MongoOperations db, double lat, double lng, double radius) {
this.name = name;
this.db = db;
this.lat = lat;
this.lng = lng;
this.radius = radius;
}
public void run() {
long t1 = Calendar.getInstance().getTimeInMillis();
List<Item> items = db.find(new Query(Criteria.where("loc")
.near(new Point(lat,lng)).maxDistance(radius/111.12)).limit(100), Item.class, "Item");
System.out.println(name + " - " + items.size() + " results found around " + radius + " of (" + lat + "," + lng + ")");
long t2 = Calendar.getInstance().getTimeInMillis();
System.out.println(name + " - " + (t2-t1) + "ms");
}
}
public class Item {
@Id
private String id;
private String name;
private double[] loc;
}
多次运行测试以在内存中加载数据后,我得到的结果如下:
在我的开发计算机上(Win7 64位,i7 860 @ 2.8 Ghz,RAM 8GB 1066Mhz):对于100个线程,我得到大约500毫秒(450毫秒到550毫秒之间)的所有响应
在我的服务器上(由OVH托管:Debian 6.0 64位,i3 2130 2x2(HT)3.4GHz,RAM 16GB 1333Mhz):对于100个线程,我在大约1700毫秒(1600毫秒到16毫秒之间)得到所有响应1900 ms)
我不是硬件,也不是Linux专家,但我期望这台服务器比我的Windows电脑做得更好(或者至少同样好)。 我在几个论坛上看到,MongoDB在Linux上真的更快,并且重要的硬件功能(按顺序):RAM,CPU(但Mongo不使用多核)和硬盘。
我增加了最大打开文件(使用ulimit -n 99999),因为我读到它可以减慢MongoDB的速度,但它对结果没有影响。
你知道瓶颈的来源吗?
答案 0 :(得分:4)
我不认为这是一个linux vs windows问题。我的意思是,与i7在你的Windows机器上的野兽相比,i3处理器相当低端。
如果您真的想要比较两个操作系统之间的性能,我建议让您的设置在相同的硬件上运行..