6

我需要一些帮助来提高 Cassandra 的读取性能。我担心随着列族大小的增加读取性能会下降。我们在单节点 Cassandra 上有以下统计数据。

操作系统: Linux - CentOS release 5.4 (Final)
Cassandra 版本: apache-cassandra-1.1.0
Java 版本: “1.6.0_14” Java(TM) SE Runtime Environment (build 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

平台: Amazon-ec2/Rightscale m1.Xlarge 实例,带有 4 个带有 raid0 的临时磁盘。(15 GB 总内存,4 个虚拟内核,2 个 ECU,总 ECU = 8)


实验配置: 我曾尝试用 GC 做一些实验

Cassandra 配置:
10 GB RAM 分配给 Cassandra 堆,3500MB 是堆新大小。

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 的结果统计信息:

每秒读取请求 208 到 240 次
写入请求 每秒 18 到 28 次
操作系统负载 24.5 到 25.85
写入请求延迟 127 到 160
微秒 读取请求延迟 82202 到 94612 微秒
操作系统发送的网络流量 44646 KB 平均每秒
OS 接收的网络流量 4338 KB 平均每第二个
OS 磁盘队列大小 13 到 15 个请求
读取请求待处理 25 到 32

操作系统磁盘延迟 48 到 56 毫秒
操作系统磁盘读取吞吐量 4.6 Mb/秒
磁盘 IOP 读取 420/秒

IOWait 80 % CPU 平均

空闲 13 % CPU 平均

行缓存被禁用。



列族 我仅从中读取的列族之一是通过 CLI 创建的

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

列族 SSTable 大小 = 7.10 GB,SSTable 计数 = 2

XColFam列族有59499904号。估计的行键(大多数是具有不同长度的 utf8 文字,通过 mx4jtools 估计),其列本质上很薄,值为 0 字节......现在。

大多数行应该有非常少的列数,可能是 1 到 10,因此列名的第一个组件大约有 20 到 30 个字节,第二个是 8 个字节的整数....复合列的第二个组件是动态的可以重复但概率很低.......第一个组件在品种中重复,但行中的列数可能不同。

我试图SnappyCompression压缩列族,但大小没有变化。

我有一个计划的服务,它使用 20 个线程运行几个小时,并对这个列族的多个键(现在每个请求有 2 个键)发出随机读取请求,并读取整行,没有列切片等。

我认为它现在表现不佳,因为它每分钟处理的请求太少。当列族大小不是那么大时,它之前工作得更好。它大约是 3 到 4 GB。

我担心随着列族大小的增加,读取性能下降得太快。

我还尝试调整一些 GC 和内存的东西,因为在那之前我有很多 GC 和 CPU 使用率。当数据量较小且波形中的iowait非常小时。


如何提高 Cassandra 的性能。您的建议将不胜感激。

4

2 回答 2

0

简短的回答:行缓存和键缓存。

如果您的数据包含像大多数系统一样经常读取的子集,请尝试使用行缓存和键缓存。

行缓存是内存中的缓存,它将经常读取的行完全存储在内存中。请记住,如果您的数据分散,这可能不会产生预期的效果。

键缓存通常更适合,因为它仅将分区键及其偏移量存储在磁盘上。这通常有助于跳过 Cassandra 的查找(无需使用分区索引和分区摘要)。

尝试使用键空间和表启用键缓存并检查您的性能。

于 2015-01-18T15:38:25.337 回答
0

看 cassandra 是相对 I/O 依赖的。EC 实例在设计上具有“不足”的 I/O(Xen 虚拟化)我的第一个建议是在您可以控制的真实硬件上使用 Cassandra。例如,您可以将 SSD 磁盘用于 CommitLog。查看Cassandra 硬件建议

但是,切换到自己的硬件有点激进。留在亚马逊试试EBS

Amazon Elastic Block Store (EBS) 提供用于 Amazon EC2 实例的块级存储卷。Amazon EBS 卷是网络连接的,并且独立于实例的生命周期而存在。Amazon EBS 提供高度可用、高度可靠、可预测的存储卷,可以附加到正在运行的 Amazon EC2 实例并作为实例中的设备公开。Amazon EBS 特别适合需要数据库、文件系统或访问原始块级存储的应用程序。

Amazon EBS 允许您创建 1 GB 到 1 TB 的存储卷,这些存储卷可由 Amazon EC2 实例安装为设备。可以将多个卷安装到同一个实例。如果需要,Amazon EBS 使您可以通过选择预置 IOPS 卷预置特定级别的 I/O 性能。这使您能够以可预测的方式扩展到每个 Amazon EC2 实例的数千 IOPS。

另请查看EC2 上的 Cassandra 性能测试

于 2013-10-31T10:32:24.070 回答