2013-04-25 14 views
8

Nel mio database mongo, ho una collezione limitata a 5 GB, una a 10 MB e poche non limitate. Nessuno di quelli senza limite contiene più di 20 documenti di piccole dimensioni.Il database Mongo occupa molto più spazio su disco di

Dopo un lungo (4h) test di stress, che scrive solo su una raccolta con limite di 5 GB, il mio database utilizza 18 GB.

Questo è quello che dice il mio db.stats (valori in MB):

data-db:PRIMARY> db.stats(1024*1024) 
{ 
    "db" : "data", 
    "collections" : 9, 
    "objects" : 8723395, 
    "avgObjSize" : 208.8405255064112, 
    "dataSize" : 1737, 
    "storageSize" : 5130, 
    "numExtents" : 12, 
    "indexes" : 19, 
    "indexSize" : 2534, 
    "fileSize" : 18423, 
    "nsSizeMB" : 16, 
    "ok" : 1 
} 

e questo è 5GB statistiche di raccolta (valori in MB):

data-db:PRIMARY> db.sms_message_event.stats(1024*1024) 
{ 
    "ns" : "data.sms_message_event", 
    "count" : 8723300, 
    "size" : 1737, 
    "avgObjSize" : 0.00019912189194456226, 
    "storageSize" : 5120, 
    "numExtents" : 3, 
    "nindexes" : 6, 
    "lastExtentSize" : 1026, 
    "paddingFactor" : 1, 
    "systemFlags" : 1, 
    "userFlags" : 0, 
    "totalIndexSize" : 2534, 
    "indexSizes" : { 
     "_id_" : 395, 
     "t_1_when_-1" : 475, 
     "smsc_message_id_1" : 185, 
     "user_id_1_t_1_when_1" : 481, 
     "message_id_1" : 318, 
     "virtual_number_recipient_when_index" : 678 
    }, 
    "capped" : true, 
    "max" : 2147483647, 
    "ok" : 1 
} 

Allora perché è così tanto fileSize più grande di storageSize? Non riesco nemmeno a eseguire repairDatabase() ora, ma ho provato compact() su ogni raccolta non limitata, senza risultati. In realtà, era previsto che db fosse pulito prima dello stress test. Voglio dire che i file sono stati cancellati, non solo le collezioni sono state eliminate.

Da registri È possibile visualizzare file di dati aggiuntivi creati durante lo stress test, in intervalli di ~ 1 ora.

Alcuni tronchi: http://pastie.org/private/t8u9caxstafbjdybgwtsfw

UPDATE: Dopo un'altra notte, e un altro passaggio di stress test 4h, è 28GBs :(

data-db:PRIMARY> db.stats(1024*1024) 
{ 
    "db" : "data", 
    "collections" : 9, 
    "objects" : 8724995, 
    "avgObjSize" : 208.840894006243, 
    "dataSize" : 1737, 
    "storageSize" : 5130, 
    "numExtents" : 12, 
    "indexes" : 19, 
    "indexSize" : 2590, 
    "fileSize" : 28658, 
    "nsSizeMB" : 16, 
    "ok" : 1 
} 
+0

Ecco come funziona mongoDB ... prealloca i file di dati in una dimensione particolare. Puoi leggere maggiori informazioni qui: http://docs.mongodb.org/manual/faq/storage/ – c0deNinja

+0

Se si tratta di un piccolo database potresti voler usare 'smallfiles' che usa una dimensione di file di dati di default molto più piccola. .. http://docs.mongodb.org/manual/reference/configuration-options/#smallfiles – c0deNinja

+0

Beh, ma ho capito che prealloca un file in anticipo. La dimensione massima del file allocata è 2 GB. I nostri dati hanno 5 GB - vedi 'storageSize' (solo inserimenti, niente rimozioni, poiché questa è una collezione limitata). Come mai il totale è andato a 18 GB? – adamw

risposta

2

Questo sta accadendo a causa di un bug in MongoDB quando riutilizzo spazio assegnato per le serie limitate È stato archiviato come SERVER-9489 e verrà risolto e, se possibile, risolto presto

Il modo in cui è possibile continuare a eseguire gli stress test senza esaurire lo spazio su disco è eliminando il testare la directory DB al termine del test e quindi crearne una nuova quando si esegue il nuovo test (ciò presuppone che non sia necessario riutilizzare gli stessi dati). Se hai bisogno degli stessi dati puoi usare mongodump per preservarlo dall'esecuzione, anche se potrebbero esserci altre opzioni più semplici che dipendono dal tuo esatto utilizzo.

+0

In alternativa, si può mettere la vostra collezione innevate in un DB separato e dropDatabase e ricrearlo tra le esecuzioni - che rilascerà tutto lo spazio. –

+0

Grazie. Un'altra opzione è quella di fermare mongod sui nodi secondari, eliminare i file e quindi riavviarlo. È in replSet, quindi è un modo per andare quando ci colpisce in produzione. Spero comunque che verrà risolto in precedenza. – amorfis

Problemi correlati