6

Cassandra の読み取りパフォーマンスを改善するための助けが必要です。カラムファミリーのサイズが大きくなるにつれ、読み取り性能の低下が気になります。単一ノードの Cassandra に関する次の統計があります。

オペレーティング システム: Linux - CentOS リリース 5.4 (最終)
Cassandra バージョン: apache-cassandra-1.1.0
Java バージョン: "1.6.0_14" Java(TM) SE ランタイム環境 (ビルド 1.6.0_14-b08) Java HotSpot(TM) 64 -Bit Server VM (ビルド 14.0-b16、混合モード)

カサンドラ構成: (cassandra.yaml)

  • rpc_server_type: hsha
  • disk_access_mode: mmap
  • 同時読み取り: 64
  • 同時書き込み数: 32

プラットフォーム: RAID0 の 4 つのエフェメラル ディスクを備えた Amazon-ec2/Rightscale m1.Xlarge インスタンス。(合計 15 GB のメモリ、4 つの仮想コア、2 つの ECU、合計 ECU = 8)


実験構成: GC でいくつかの実験を試みました

Cassandra 構成:
10 GB RAM が Cassandra Heap に割り当てられ、3500MB が Heap NEW サイズです。

JVM 構成:
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"



OpsCenter コミュニティ 2.0 からの結果統計:

読み取り要求 1 秒あたり 208 ~ 240
書き込み要求 1 秒あたり 18 ~ 28 OS
負荷 24.5 ~ 25.85
書き込み要求の遅延 127 ~ 160 マイクロ
読み取り要求の遅延 82202 ~ 94612
マイクロ
2 番目
の OS ディスク キュー サイズ 13 ~ 15
要求 保留中の読み取り要求 25 ~ 32

OS ディスクの待ち時間 48 ~ 56 ミリ秒
OS ディスクの読み取りスループット 4.6 Mb/秒
ディスク IOPs 読み取り 420/秒

IOWait 80 % CPU 平均

アイドル 13 % CPU 平均

行キャッシュが無効になっています。



列ファミリー 私が読んでいるだけの列ファミリーの 1 つは、CLI によって作成されます。

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

列ファミリー SSTable サイズ = 7.10 GB、SSTable カウント = 2

XColFam列ファミリーには 59499904 の番号があります。推定された行キー (ほとんどは mx4jtools を介して推定されたさまざまな長さの utf8 リテラル) と、本質的に薄いような列、値が 0 バイトである.....今.

ほとんどの行には非常に少数の列 (おそらく 1 から 10) が含まれている必要があるため、列名の最初のコンポーネントは約 20 から 30 バイトで、2 番目は 8 バイトの整数です....複合列の 2 番目のコンポーネントは動的に繰り返される可能性がありますしかし、確率は低いです.......第1成分はさまざまに繰り返されますが、行の列数は異なる場合があります。

列ファミリーを圧縮しようとSnappyCompressionしましたが、サイズに変化はありませんでした。

20 スレッドで数時間実行され、この列ファミリに対して複数のキー (現在は要求ごとに 2 つのキー) のランダム読み取り要求を行い、行全体を読み取り、列スライスなどを読み取らないスケジュールされたサービスがあります。

1分間に処理するリクエストが少なすぎるため、パフォーマンスが良くないと思います。カラムファミリーのサイズがそれほど大きくない以前は、うまく機能していました。3~4GBくらいでした。

列ファミリーのサイズが大きくなると、読み取りパフォーマンスが急速に低下するのではないかと心配しています。

また、以前は GC と CPU を大量に使用していたため、いくつかの GC とメモリを微調整しようとしました。データ サイズが小さく、波形の iowait が非常に小さい場合。


Cassandra のパフォーマンスを向上させるにはどうすればよいですか。あなたの提案は高く評価されます。

4

2 に答える 2

0

簡単な答え: 行キャッシュとキー キャッシュ。

ほとんどのシステムのように頻繁に読み取られるサブセットがデータに含まれている場合は、行キャッシュとキー キャッシュの使用を試みます。

行キャッシュはメモリ内キャッシュであり、頻繁に読み取られる行を完全にメモリに格納します。データが分散している場合、これが望ましい効果をもたらさない可能性があることに注意してください。

パーティション キーとそのオフセットのみをディスクに格納するため、キー キャッシュの方が一般的に適しています。これは通常、Cassandra によるルックアップをスキップするのに役立ちます (パーティション インデックスとパーティション サマリーを使用する必要はありません)。

キースペースとテーブルでキー キャッシュを有効にして、パフォーマンスを確認してください。

于 2015-01-18T15:38:25.337 に答える