MongoDB以100次/秒的速度停顿,但是基准testing则表示54000次写入/秒

我正在AWS EC2 m4.large实例上运行MongoDB(v3.4 Community Edition)。 我根据这个MongoDB教程安装它。 我没有修改任何MongoDBconfiguration。 我没有configuration任何副本集或碎片。 我有一个Jersey API,它使用org.mongodb.morphia(v1.3.2)Java Driver与MongoDB进行交互。

我已经使用SoapUI创build了一个负载testing,其中我调用了100个API,然后为MongoDB创build了100个写操作(每个写操作创build一个集合中的一个文档)。 我跑了24小时的testing。 最后,我看到我的networking服务器试图与Mongo服务器通信,但连接超时,主机CPU运行在100%。 我得出结论,MongoDB服务器窒息。

然后我尝试了这个基准testing ,仍然使用m4.large上的数据库。 在923.133秒内创build了50,000,000条logging,即每秒54,113条插入。 那快500多倍!

如果MongoDBperformance的如此出色,那么为什么在通过JAVA驱动程序时每秒插入100次呢? Java驱动程序很慢? 我的Java驱动程序使用错了吗? 我的EC2实例大小是否太低? 它会有助于添加复制(RAID和副本集)?

我是MongoDB主机新手,非常感谢您的帮助。

更新:

负载testingconfiguration:

客户端:SoapUI(v5.3),Web服务器:Tomcat 8,Java:v1.8,MongoDB:v3.4。 我在AWS Mumbai地区运行我所有的服务器。 我在相同的EC2实例(m4.large)上托pipeWeb Sever和MongoDB服务器,并且在Windows计算机上运行客户端(t2.micro)。

经过进一步调查,我认为瓶颈在我的代码中。 我使用Mongostat实用程序来查看mongodb的行为。 我发现,在一开始有两个连接。 一旦我开始我的负载testing,连接就跳转到102(连接数不会超过102,即使在每秒1000个请求的情况下,MongoDB也会在很长一段时间后closures它们)。 负载是每秒100个请求。 这是显示这种行为的gif。

在这里输入图像说明

我发现了一些类似的问题,但答案没有透露太多。 我已经考虑到了这些build议。 这里有一些样品,

https://stackoverflow.com/questions/21580147/mongo-connection-leak-with-morphia

https://stackoverflow.com/questions/31469656/spring-data-mongodb-not-closing-mongodb-connections

Java代码:

创build连接:我使用MongoDBbuild议的应用程序使用一个连接。 实现单例模式。

public class DatabaseConnection { private static volatile MongoClient instance; private static String cloudhost="localhost"; private DatabaseConnection() { } public synchronized static MongoClient getMongoClient() { if (instance == null ) { synchronized (DatabaseConnection.class) { if (instance == null) { ServerAddress addr = new ServerAddress(cloudhost, 27017); List<MongoCredential> credentialsList = new ArrayList<MongoCredential>(); MongoCredential credentia = MongoCredential.createCredential( "test", "test", "test".toCharArray()); credentialsList.add(credentia); instance = new MongoClient(addr, credentialsList); } } } return instance; } } 

示例数据访问对象类:

 import org.mongodb.morphia.Datastore; import org.mongodb.morphia.dao.BasicDAO; import Sample; public class SampleDao extends BasicDAO<Sample, String>{ public SampleDao(Class<Sample> entityClass, Datastore ds) { super(entityClass, ds); } } 

样本库类:该类负责与数据库进行交互并保存文档

 public class SampleRepository { private SampleDao sampleDao; public SampleRepository () { try { MongoClient mongoClient = DatabaseConnection.getMongoClient(); Datastore ds = new Morphia().map(Pour.class) .createDatastore(mongoClient, "test"); sampleDao = new SampleDao(Sample.class,ds); } catch (Exception e) { logger.error("Error while creating SampleDao", e); } } public String createSample (Sample sample) { try { Sample2Repository repo = new Sample2Repository (); Sample2 sample2 = repo.getSample2(sample.getSampleId()); Sample.setSample2Id(sample2.getId()); retur sampleDao.save(sample).getId().toString(); } catch (Exception e) { logger.error("Error while creating sample.", e); return null; } } } 

示例文档:我不认为我的文档尺寸较大,为MongoDB创build问题。 负载testing期间没有其他查询被调用。 只有CreateSample操作正在运行。

 { "sample2Id":"593e346cfeaa9e62d1706bb5" , "sample3Id" : "593e4159729f5d04db7b6da2" , "actualTime":"21/06/2017 09:18:00" , "uploadTime":"21/06/2017 09:18:00" }