6 votes

Cassandra Amazon EC2, expériences sur les performances de lecture

J'ai besoin d'aide pour améliorer les performances de lecture de Cassandra. Je suis préoccupé par la dégradation des performances de lecture lorsque la taille de la famille de colonnes augmente. Nous avons les statistiques suivantes sur Cassandra à un seul nœud.

Système d'exploitation : Linux - CentOS version 5.4 (Final)
Version de Cassandra : apache-cassandra-1.1.0
Version Java : "1.6.0_14" Environnement d'exécution Java(TM) SE (build 1.6.0_14-b08) Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mode mixte)

Configuration de Cassandra : (cassandra.yaml)

  • rpc_server_type : hsha
  • disk_access_mode : mmap
  • lectures simultanées : 64
  • écritures simultanées : 32

Plate-forme : Instance Amazon-ec2/Rightscale m1.Xlarge avec 4 disques éphémères en raid0 (15 Go de mémoire totale, 4 cœurs virtuels, 2 UCE, UCE totale = 8).


Configuration des expériences : J'ai essayé de faire quelques expériences avec GC

Configuration de Cassandra :
10 GB de RAM sont alloués au Heap de Cassandra, 3500MB est la taille du Heap NEW.

JVM Config :
JVM_OPTS="$JVM_OPTS -XX:+UseParNewGC"
JVM_OPTS="$JVM_OPTS -XX:+UseConcMarkSweepGC"
JVM_OPTS="$JVM_OPTS -XX:+CMSParallelRemarkEnabled"
JVM_OPTS="$JVM_OPTS -XX:SurvivorRatio=1000"
JVM_OPTS="$JVM_OPTS -XX:MaxTenuringThreshold=0"
JVM_OPTS="$JVM_OPTS -XX:CMSInitiatingOccupancyFraction=40"
JVM_OPTS="$JVM_OPTS -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCompressedOops"


Statistiques de résultats de la communauté OpsCenter 2.0 :

Demandes de lecture 208 à 240 par seconde
Demandes d'écriture 18 à 28 par seconde
Charge OS 24.5 à 25.85
Latence des requêtes d'écriture 127 à 160 micros
Latence des requêtes de lecture 82202 à 94612 micros
Trafic réseau envoyé par l'OS 44646 KB en moyenne par seconde
Trafic réseau reçu par le système d'exploitation 4338 Ko en moyenne par seconde
Taille de la file d'attente des disques d'OS 13 à 15 demandes
Demandes de lecture en attente 25 à 32

Latence des disques d'OS 48 à 56 ms
Débit de lecture des disques du système d'exploitation 4,6 Mo par seconde
IOPs du disque Lectures 420 par seconde

IOWait 80 % CPU avg

Idle 13 % CPU avg

Rowcache est désactivé.


La famille Column
L'une des familles de colonnes que je ne fais que lire est créée par CLI.

create column family XColFam 
with column_type='Standard'  
and  comparator = CompositeType(BytesType,IntegerType)';"

Famille de colonnes SSTable Taille = 7,10 Go, Nombre de SSTable = 2

XColFam La famille de colonnes a 59499904 nº de clés de ligne estimées (la plupart sont des littéraux utf8 de longueur variable, estimés par mx4jtools) avec des colonnes de nature fine, avec la valeur 0 bytes.....now.

La plupart des lignes devraient avoir un très petit nombre de colonnes, peut-être de 1 à 10, donc avec environ 20 à 30 octets du premier composant du nom de la colonne et le second est un entier de 8 octets....2e composant de la colonne composite est dynamique pourrait se répéter mais la probabilité est faible.......1e composant se répète dans les variétés mais le nombre de colonnes dans les lignes pourrait être différent.

J'ai essayé SnappyCompression pour compresser la famille de colonnes, mais la taille n'a pas changé.

J'ai un service planifié qui fonctionne pendant des heures avec 20 threads et qui fait des demandes de lecture aléatoires pour des clés multiples (pour l'instant, il s'agit de 2 clés par demande) pour cette famille de colonnes et lit des lignes complètes, sans tranche de colonne ou autre.

Je pense qu'il ne fonctionne pas bien maintenant parce qu'il traite trop peu de demandes par minute. Il fonctionnait mieux auparavant lorsque la taille de la famille de colonnes n'était pas si importante. Elle était d'environ 3 à 4 Go.

Je crains que les performances de lecture ne se dégradent trop rapidement avec l'augmentation de la taille de la famille de colonnes.

J'ai également essayé de modifier certains paramètres de GC et de mémoire, car avant cela, j'utilisais beaucoup de GC et de CPU. Lorsque la taille des données était plus petite et qu'il y avait un très petit iowait dans la forme d'onde.


Comment puis-je augmenter les performances de Cassandra ? Vos suggestions seront appréciées.

0voto

shuron Points 31

Cassandra est relativement dépendant des E/S. Les instances de la CE ont des E/S "insuffisantes" par conception (virtualisation Xen). Ma première recommandation est d'utiliser Cassandra sur du matériel réel, sur lequel vous avez un contrôle. Par exemple, vous pouvez utiliser un disque SSD pour CommitLog. Regardez Propositions de matériel Cassandra .

Cependant, le passage à un matériel propre est une option un peu radicale. Pour rester avec Amazon, essayez EBS

Amazon Elastic Block Store (EBS) fournit des volumes de stockage au niveau des blocs. à utiliser avec les instances Amazon EC2. Les volumes Amazon EBS sont attachés au réseau et persistent indépendamment de la vie d'une instance. instance. Amazon EBS offre une haute disponibilité, une haute fiabilité, prévisibles qui peuvent être attachés à une instance Amazon EC2 en cours d'exécution EC2 en cours d'exécution et exposés en tant que dispositif au sein de l'instance. Amazon EBS est particulièrement adapté aux applications qui nécessitent une base de données, un fichier ou un accès à un stockage brut au niveau des blocs.

Amazon EBS vous permet de créer des volumes de stockage de 1 Go à 1 To qui peuvent être montés en tant que périphériques par les instances Amazon EC2. Plusieurs volumes peuvent être montés sur la même instance. Amazon EBS vous permet de provisionner un niveau spécifique de performance I/O si vous le souhaitez, en choisissant un volume Provisioned IOPS. Cela vous permet de passer de manière prévisible à des milliers d'IOPS par instance Amazon EC2.

Consultez également Test de performance de Cassandra sur EC2

0voto

Desert Ice Points 1092

Réponse courte : Row Cache et Key Caches.

Si vos données contiennent des sous-ensembles qui seront fréquemment lus, comme la plupart des systèmes, essayez d'utiliser des caches de lignes et des caches de clés.

Les caches de rangées sont des caches en mémoire, qui stockent les rangées fréquemment lues entièrement en mémoire. Gardez à l'esprit que cela peut ne pas avoir l'effet désiré si vos données sont dispersées.

Les caches de clés sont généralement plus adaptés car ils ne stockent que les clés de partition et leurs offsets sur le disque. Cela permet généralement d'éviter une recherche par Cassandra (pas besoin d'utiliser les index de partition et les résumés de partition).

Essayez d'activer le cache des clés avec l'espace clé et la table et vérifiez vos performances.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X