Estou executando o MongoDB (v3.4 Community Edition) em uma instância do AWS EC2 m4.large. Eu o instalei de acordo com este tutorial do MongoDB . Eu não modifiquei nenhuma configuração do MongoDB. Eu não configurei nenhum conjunto de réplicas ou shard. Eu tenho uma API de Jersey que interage com o MongoDB usando org.mongodb.morphia (v1.3.2) Java Driver .
Eu criei um teste de carga usando o SoapUI, onde faço 100 chamadas para API, que por sua vez criam 100 operações de gravação (um documento é criado em uma coleção por operação de gravação) para o MongoDB. Eu corri o teste por 24 horas. No final, vejo meu servidor tentando se comunicar com o servidor Mongo, mas a conexão está expirando e a CPU do host está sendo executada em 100%. Eu concluo que o servidor do MongoDB está sufocando.
Eu então tentei este exercício de benchmarking , ainda com um banco de dados hospedado em um m4.large. 50.000.000 registros foram criados em 923.133 segundos, ou seja, 54.113 inserções por segundo. Isso é mais de 500 vezes mais rápido!
Se o MongoDB está funcionando tão bem, então por que ele está sufocando a 100 inserções por segundo ao passar pelo driver JAVA? O driver Java está lento? Meu uso do driver Java está errado? O tamanho da minha instância do EC2 está muito baixo? Ajudaria a adicionar replicação (conjuntos RAID e Replica)?
Sou novo na hospedagem do MongoDB e realmente agradeço sua ajuda para aprender.
Atualização:
Carregar configuração de teste:
Cliente: SoapUI (v5.3), servidor da Web: Tomcat 8, Java: v1.8, MongoDB: v3.4. Estou executando todos os meus servidores na região da AWS Mumbai. Estou hospedando o servidor Web Sever e MongoDB na mesma instância EC2 (m4.large) e estou executando o cliente na máquina Windows (t2.micro).
Depois de mais investigações, acho que o gargalo está no meu código. Eu usei o utilitário Mongostat para ver como o mongodb está se comportando. Eu descobri que, no começo, há duas conexões. Conexões salta para 102 assim que eu inicio meu teste de carga (Conexões nunca ultrapassam 102, mesmo com 1000 solicitações por segundo, e o MongoDB as fecha após muito tempo). A carga é de 100 solicitações por segundo. Aqui está gif que mostra esse comportamento.
Encontreialgumasperguntascomproblemassemelhantes,masasrespostasnãorevelarammuito.Eucuideidassugestões.Aquiestãoalgumasamostras,
Código Java:
Criando conexão: Estou usando uma conexão para meu aplicativo conforme recomendado pelo MongoDB. Implementando o padrão Singleton.
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;
}
}
Classe do objeto de acesso a dados de amostra:
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);
}
}
Classe do repositório de amostra: Esta classe é responsável por interagir com o banco de dados e persistir o documento
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;
}
}
}
Documento de exemplo: Eu não acho que meus documentos são maiores em tamanho para criar problemas para o MongoDB. Não houve outras consultas sendo chamadas durante o teste de carga. Apenas a operação CreateSample estava em execução.
{
"sample2Id":"593e346cfeaa9e62d1706bb5"
, "sample3Id" : "593e4159729f5d04db7b6da2"
, "actualTime":"21/06/2017 09:18:00"
, "uploadTime":"21/06/2017 09:18:00"
}
Tags performance amazon-ec2 mongodb