Gostaria de saber se alguém pode ajudar com um problema de MongoDB/arquivo de página que parecemos ter à medida que nosso banco de dados aumenta de tamanho com o tempo. De vez em quando, o MongoDB falhará em um nó específico em nosso conjunto de réplicas e não será iniciado novamente até que aumentemos significativamente (o dobro é seguro) nosso tamanho de arquivo de página. Atualmente, o arquivo de paginação é de 42 GB. Estamos executando o MongoDB como um conjunto de réplicas de 3 nós e cada nó está sendo executado em uma máquina virtual do Windows Server 2012 R2 no Azure. Cada servidor tem 3,5 GB de memória. MongoDB é a versão 2.6.5.
Eu vi as postagens abaixo, que estão relacionadas, e entendo que o MongoDB usa arquivos mapeados pela memória e, presumivelmente, a memória virtual ajuda nisso quando não temos muita RAM. O que não entendo é:
Por que o MongoDB requer tanta memória na inicialização (arquivo de paginação > 32 GB para um banco de dados de 131 GB) e com um conjunto de trabalho relativamente pequeno (~ 100 MB)? Presumivelmente, ele pode trocar os arquivos conforme necessário, especialmente com um arquivo de página tão grande, então por que o MongoDB está travando?
Aqui estão os posts que encontrei até agora:
o uso de memória mongodb está alto, mesmo que apenas inserções sejam feitas
e este
SERVER-10044, que explica por que o Mongo trava e sugere que as VMs são piores
Agradecemos antecipadamente por qualquer ajuda.
Para fornecer mais contexto, estamos usando o MongoDB para registrar dados, portanto, a maioria das coleções é gravada, mas raramente lida, com exceção de algumas pequenas coleções (total de 100 MB) que estão sujeitas a leituras e gravações constantes. Os dados são armazenados em um único banco de dados Mongo DB, cujas estatísticas são mostradas abaixo (db e nomes de coleção modificados):
"db" : "MyDatabase",
"collections" : 854,
"objects" : 243025868,
"avgObjSize" : 541.2304596809423,
"dataSize" : 131533002252,
"storageSize" : 172592721920,
"numExtents" : 7268,
"indexes" : 1934,
"indexSize" : 27824138048,
"fileSize" : 210284576768,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"extentFreeList" : {
"num" : 3,
"totalSize" : 110592
},
"ok" : 1
O conjunto de trabalho parece estar em torno da marca de 100 MB, conforme ilustrado abaixo:
"workingSet" : {
"note" : "thisIsAnEstimate",
"pagesInMemory" : 20874,
"computationTimeMicros" : 26236,
"overSeconds" : 876
},
A saída do arquivo de log no secundário que falhou mais recentemente é a seguinte (isso ocorreu durante a inicialização, embora a primeira vez que falhou tenha sido durante a operação normal):
2014-11-25T09:25:17.833+0000 [rsBackgroundSync] replSet syncing to: 10.1.6.71:27017 2014-11-25T09:25:17.833+0000 [rsBackgroundSync] replset setting syncSourceFeedback to 10.1.6.71:27017 1-2014 25T09:25:17.849+0000 [rsSync] replSet ainda sincronizando, ainda não para minValid optime 54744561:c 2014-11-25T09:25:18.286+0000 [rsSync] replSet SECONDARY 2014-11-25T09:26:01.590+0000 [ conn21] serverStatus estava muito lento: { após basic: 0, após asserts: 0, após backgroundFlushing: 0, após conexões: 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters : 0, após bloqueios: 0, após rede: 0, após opcounters: 0, após opcountersRepl: 0, após oplog: 10451, após recordStats: 10451, após repl: 10451, no final: 10451 } 2014-11-25T09:26 :01.590+0000 [conn21] comando admin.$cmd comando:serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] liberando mmaps levou 15022ms para 115 arquivos 2014- 11-25T09:26:47.501+0000 [conn5] serverStatus estava muito lento: { após basic: 0, após asserts: 0, após backgroundFlushing: 0, após conexões: 0, após cursores: 0, após dur: 0, após extra_info : 0, após globalLock: 0, após indexCounters: 0, após bloqueios: 0, após rede: 0, após opcounters: 0, após opcountersRepl: 0, após oplog: 4791, após recordStats: 4791, após repl: 4791, no final : 4791 } 2014-11-25T09:26:47.501+0000 [conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer worker 6]1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] os mmaps de descarga levaram 15022ms para 115 arquivos 2014-11-25T09: 26:47.501+0000 [conn5] serverStatus estava muito lento: { após basic: 0, após asserts: 0, após backgroundFlushing: 0, após conexões: 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters: 0, após bloqueios: 0, após rede: 0, após opcounters: 0, após opcountersRepl: 0, após oplog: 4791, após recordStats: 4791, após repl: 4791, no final: 4791 } 2014 -11-25T09:26:47.501+0000 [conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11 -25T09:27:06.350+0000 [repl escritor trabalhador 6]1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] os mmaps de descarga levaram 15022ms para 115 arquivos 2014-11-25T09: 26:47.501+0000 [conn5] serverStatus estava muito lento: { após basic: 0, após asserts: 0, após backgroundFlushing: 0, após conexões: 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters: 0, após bloqueios: 0, após rede: 0, após opcounters: 0, após opcountersRepl: 0, após oplog: 4791, após recordStats: 4791, após repl: 4791, no final: 4791 } 2014 -11-25T09:26:47.501+0000 [conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11 -25T09:27:06.350+0000 [repl escritor trabalhador 6]0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] a descarga de mmaps levou 15022ms para 115 arquivos 2014-11-25T09:26:47.501+0000 [conn5] serverStatus era muito slow: { após basic: 0, após asserts: 0, após backgroundFlushing: 0, após conexões: 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters: 0, após bloqueios : 0, após rede: 0, após opcounters: 0, após opcountersRepl: 0, após oplog: 4791, após recordStats: 4791, após repl: 4791, no final: 4791 } 2014-11-25T09:26:47.501+0000 [ conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer trabalhador 6]0 locks(micros) r:65 reslen:4028 16764ms 2014-11-25T09:26:31.155+0000 [DataFileSync] a descarga de mmaps levou 15022ms para 115 arquivos 2014-11-25T09:26:47.501+0000 [conn5] serverStatus era muito slow: { após basic: 0, após asserts: 0, após backgroundFlushing: 0, após conexões: 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters: 0, após bloqueios : 0, após rede: 0, após opcounters: 0, após opcountersRepl: 0, após oplog: 4791, após recordStats: 4791, após repl: 4791, no final: 4791 } 2014-11-25T09:26:47.501+0000 [ conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer trabalhador 6]155+0000 [DataFileSync] limpeza de mmaps levou 15022ms para 115 arquivos 2014-11-25T09:26:47.501+0000 [conn5] serverStatus estava muito lento: { depois de básico: 0, depois de asserts: 0, depois de backgroundFlushing: 0, depois de conexões : 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters: 0, após bloqueios: 0, após rede: 0, após opcounters: 0, após opcountersRepl: 0, após oplog : 4791, após recordStats: 4791, após repl: 4791, no final: 4791 } 2014-11-25T09:26:47.501+0000 [conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates :0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer worker 6]155+0000 [DataFileSync] limpeza de mmaps levou 15022ms para 115 arquivos 2014-11-25T09:26:47.501+0000 [conn5] serverStatus estava muito lento: { depois de básico: 0, depois de asserts: 0, depois de backgroundFlushing: 0, depois de conexões : 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters: 0, após bloqueios: 0, após rede: 0, após opcounters: 0, após opcountersRepl: 0, após oplog : 4791, após recordStats: 4791, após repl: 4791, no final: 4791 } 2014-11-25T09:26:47.501+0000 [conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates :0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer worker 6]após asserts: 0, após backgroundFlushing: 0, após conexões: 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters: 0, após bloqueios: 0, após rede: 0, after opcounters: 0, after opcountersRepl: 0, after oplog: 4791, after recordStats: 4791, after repl: 4791, at end: 4791 } 2014-11-25T09:26:47.501+0000 [conn5] command admin.$cmd command : serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer worker 6]após asserts: 0, após backgroundFlushing: 0, após conexões: 0, após cursores: 0, após dur: 0, após extra_info: 0, após globalLock: 0, após indexCounters: 0, após bloqueios: 0, após rede: 0, after opcounters: 0, after opcountersRepl: 0, after oplog: 4791, after recordStats: 4791, after repl: 4791, at end: 4791 } 2014-11-25T09:26:47.501+0000 [conn5] command admin.$cmd command : serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer worker 6]após repl: 4791, no final: 4791 } 2014-11-25T09:26:47.501+0000 [conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros ) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer worker 6]após repl: 4791, no final: 4791 } 2014-11-25T09:26:47.501+0000 [conn5] comando admin.$cmd comando: serverStatus { serverStatus: 1, oplog: 1 } keyUpdates:0 numYields:0 locks(micros ) r:88 reslen:4028 7674ms 2014-11-25T09:27:06.350+0000 [repl writer worker 6]VirtualProtect para m:/mongodb/data/MyDatabase.72 chunk 21220 falhou com errno:1455 O arquivo de paginação é muito pequeno para esta operação ser concluída. (tamanho do bloco é 67108864, endereço é 14b90000000) em mongo::makeChunkWritable, terminando 2014-11-25T09:27:06.350+0000 [repl writer worker 6] MyDatabase.RC_PUR_11_456754 Fatal Assertion 16362 2014-11-275:09. 0000 [repl writer worker 6] Falha no rastreamento de pilha, SymInitialize falhou com o erro 3765269347 2014-11-25T09:27:06.615+0000 [repl writer worker 6] MyDatabase.RC_PUR_11_456754 2014-11-25T09:27:06.615+0000 [repl writer trabalhador 6]
*** abortando após falha fassert ()
No Windows, na pior das hipóteses, o tamanho do arquivo de paginação pode ter que ser definido como o tamanho dos arquivos de dados + tamanho da memória física. Portanto, se seus arquivos de dados ocupam 50 GB em disco, a orientação aproximada, no seu caso, é definir o tamanho do arquivo de paginação para 53,5 GB. Isso melhorará com o lançamento do MongoDB 2.8, pois o novo mecanismo de armazenamento não depende de serviços de memória virtual fornecidos pelo sistema operacional. Em um assunto relacionado, seu tamanho de memória de 3,5 GB parece muito baixo. Dê uma olhada nas Hard Page Faults por segundo no Resource Monitor - se o número estiver em centenas, você precisa aumentar drasticamente o tamanho da memória