我需要一些帮助来提高 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 的性能。您的建议将不胜感激。