2011-10-28 2 views
1

Je suis débutant dans NoSQL et Cassandara en particulier. En ce moment, faire un benchmarking avec Cassandra et expérimenter un débit d'écriture très lent. Comme il est dit, Cassandra peut effectuer des centaines de milliers d'insertions par seconde, mais je n'observe pas ceci: 1) quand j'envoie 100 000 insertions simultanément via 8 clients CQL, alors le débit est de ~ 14470 insertions par secondes. 2) lorsque je fais la même chose avec 8 clients Thrift, le débit est d'environ 16 300 insertions par seconde.Très lent écrit en Cassandra

Je pense que les performances de Cassandra peuvent être améliorées, mais je ne sais pas quoi accorder. S'il vous plaît jeter un oeil aux conditions d'essai ci-dessous et conseiller quelque chose. Je vous remercie.

Conditions d'essai:

1. groupe Cassandra est déployé sur trois machines, chaque machine a 8 cœurs Intel (R) Xeon (R) CPU E5420 @ 2.50GHz, RAM est de 16 Go, réseau la vitesse est de 1000Mb/s.

2. L'échantillon de données est *

set MM[utf8('1:exc_source_algo:20100105000000.000000:ENTER:0')]['order_id'] = '1.0'; 
set MM[utf8('1:exc_source_algo:20100105000000.000000:ENTER:0')]['security'] = 'AA1'; 
set MM[utf8('1:exc_source_algo:20100105000000.000000:ENTER:0')]['price'] = '47.1'; 
set MM[utf8('1:exc_source_algo:20100105000000.000000:ENTER:0')]['volume'] = '300.0'; 
set MM[utf8('1:exc_source_algo:20100105000000.000000:ENTER:0')]['se'] = '1'; 
set MM[utf8('2:exc_source_algo:20100105000000.000000:ENTER:0')]['order_id'] = '2.0'; 
set MM[utf8('2:exc_source_algo:20100105000000.000000:ENTER:0')]['security'] = 'AA1'; 
set MM[utf8('2:exc_source_algo:20100105000000.000000:ENTER:0')]['price'] = '44.89'; 
set MM[utf8('2:exc_source_algo:20100105000000.000000:ENTER:0')]['volume'] = '310.0'; 
set MM[utf8('2:exc_source_algo:20100105000000.000000:ENTER:0')]['se'] = '1'; 
set MM[utf8('3:exc_source_algo:20100105000000.000000:ENTER:0')]['order_id'] = '3.0'; 
set MM[utf8('3:exc_source_algo:20100105000000.000000:ENTER:0')]['security'] = 'AA2'; 
set MM[utf8('3:exc_source_algo:20100105000000.000000:ENTER:0')]['price'] = '0.35'; 

3. est écrit journal de livraison le sur le disque dur local, les données sont écrites sur Luster.

4. Keyspace Description

Keyspace: MD: 
    Replication Strategy: org.apache.cassandra.locator.NetworkTopologyStrategy 
    Durable Writes: true 
    Options: [datacenter1:1] 
    Column Families: 
    ColumnFamily: MM 
     Key Validation Class: org.apache.cassandra.db.marshal.BytesType 
     Default column value validator: org.apache.cassandra.db.marshal.BytesType 
     Columns sorted by: org.apache.cassandra.db.marshal.BytesType 
     Row cache size/save period in seconds: 0.0/0 
     Key cache size/save period in seconds: 200000.0/14400 
     Memtable thresholds: 2.3249999999999997/1440/496 (millions of ops/minutes/MB) 
     GC grace seconds: 864000 
     Compaction min/max thresholds: 4/32 
     Read repair chance: 1.0 
     Replicate on write: true 
     Built indexes: [] 

Répondre

2

Utilisez-vous 8 threads/processus pour effectuer des écritures? Si chaque écriture prend 0,5 ms, alors 8 threads/processus ne peuvent faire que 16 000 écritures par seconde.

+0

Oui, j'utilise trois scripts Python simultanés pour écrire. Vous voulez dire la limitation? Ou je fais quelque chose de mal? – Evgeny

+1

Si vous aviez 1 thread/processus faisant des actions séquentiellement, et que chaque action prenait 100 ms, vous ne pouviez faire que 10 opérations par seconde, et 2 threads pouvaient faire 20 opérations par seconde. En utilisant 3 threads, si vous voulez obtenir 100k opérations par seconde, chaque opération devrait se terminer en 0.03 ms. Ce manque de parallélisme côté client peut être votre limite. D'autres choses à vérifier sont la charge sur le serveur (à la fois disque et cpu). – sbridges

2

Surtout avec les clients python, vous pouvez voir de meilleures performances en exécutant chaque client en tant que processus séparé plutôt qu'en tant que thread, en raison du verrou global de l'interpréteur. Ensuite, essayez de scinder les clients sur plusieurs machines si possible. De plus, assurez-vous que vos clients contactent les trois nœuds afin que la charge de travail soit répartie uniformément.

L'écriture de données sur Lustre, plutôt que sur le disque local, peut être un facteur mais je n'ai pas d'expérience avec Lustre à dire.

+0

D'accord, le gros problème ici est Lustre (comme Adrian mentionné quand Evgeny a posé la même question sur la liste de diffusion Cassandra - http://www.mail-archive.com/[email protected]/msg18328.html) , et vous pourriez avoir besoin de plusieurs machines pour atteindre un cluster Cassandra à 3 nœuds à partir de Python. – jbellis