我们正在研究迁移到Cassandra(2.0.10),我们正在测试写入和读取性能。
阅读时,我们看到的是低读取吞吐量,平均为14MB / s
我们目前的测试环境只有一个节点,Xeon E5-1620 @ 3.7GHZ,内存为32GB,Windows 7。 Cassandra堆设置为8GB,默认并发读写,密钥缓存大小设置为400mb,数据位于本地RAID10阵列上,使用64KB及更高的块大小,持续平均300MB / s的顺序读取性能。
我们使用当前型号存储每小时传感器数据:
CREATE TABLE IF NOT EXISTS sensor_data_by_day (
sensor_id int,
date text,
event_time timestamp,
load float,
PRIMARY KEY ((sensor_id,date),event_time))
读取传感器,日期和一系列事件时间。
目前的数据集是100K传感器的2年数据,磁盘上约30GB。
数据由多个线程插入(因此插入不按事件时间排序,如果重要的话)
回读一天的数据需要大约2米,吞吐量为14MB / s。 使用带有预准备语句的java-cassandara-connector完成读取:
Select event_time, load from sensor_data_by_day where sensor_id = ? and date in ('2014-02-02') and event_time >= ? and event_time < ?
我们创建一个连接并将任务(100K查询作为传感器数量)提交给具有100个线程池的执行程序服务。 当数据在缓存中时读取需要大约7秒。
这可能不是客户端问题,我们在数据位于SSD上时进行了测试,总时间从2米下降到10秒(~170MB / s),这可以理解为更好,因为它是SSD。
读取性能看起来像块读取大小问题,如果Cassandra读取4KB块,则会导致低读取。我读默认值为256,但没有找到设置在任何地方确认它或可能是一个随机的I / O问题?
这是您在使用机械磁盘时应该从Cassandra获得的读取性能吗?也许是一个建模问题?
cfhistograms的输出:
SSTables per Read
1 sstables: 844726
2 sstables: 90
Write Latency (microseconds)
No Data
Read Latency (microseconds)
5 us: 418
6 us: 15252
7 us: 12884
8 us: 15447
10 us: 34211
12 us: 48972
14 us: 48421
17 us: 56641
20 us: 12484
24 us: 8325
29 us: 6602
35 us: 4953
42 us: 5427
50 us: 3610
60 us: 1784
72 us: 2414
86 us: 11208
103 us: 38395
124 us: 82050
149 us: 64840
179 us: 40161
215 us: 30891
258 us: 17691
310 us: 8787
372 us: 4171
446 us: 2305
535 us: 1588
642 us: 1187
770 us: 913
924 us: 811
1109 us: 716
1331 us: 602
1597 us: 513
1916 us: 513
2299 us: 516
2759 us: 595
3311 us: 776
3973 us: 1086
4768 us: 1502
5722 us: 2212
6866 us: 3264
8239 us: 4852
9887 us: 7586
11864 us: 11429
14237 us: 17236
17084 us: 22285
20501 us: 26163
24601 us: 26799
29521 us: 24311
35425 us: 22101
42510 us: 19420
51012 us: 16497
61214 us: 13830
73457 us: 11356
88148 us: 8749
105778 us: 6243
126934 us: 4406
152321 us: 2751
182785 us: 1754
219342 us: 977
263210 us: 497
315852 us: 233
379022 us: 109
454826 us: 60
545791 us: 21
654949 us: 10
785939 us: 2
943127 us: 0
1131752 us: 1
Partition Size (bytes)
179 bytes: 151874
215 bytes: 0
258 bytes: 0
310 bytes: 0
372 bytes: 5071
446 bytes: 0
535 bytes: 4170
642 bytes: 3724
770 bytes: 3454
924 bytes: 3416
1109 bytes: 3489
1331 bytes: 9179
1597 bytes: 11616
1916 bytes: 12435
2299 bytes: 19038
2759 bytes: 20653
3311 bytes: 10245454
3973 bytes: 25121333
Cell Count per Partition
4 cells: 151874
5 cells: 0
6 cells: 0
7 cells: 0
8 cells: 5071
10 cells: 0
12 cells: 4170
14 cells: 0
17 cells: 3724
20 cells: 3454
24 cells: 3416
29 cells: 3489
35 cells: 3870
42 cells: 9982
50 cells: 13521
60 cells: 20108
72 cells: 16678
86 cells: 51646
103 cells: 35323903
答案 0 :(得分:0)
你使用什么样的压实?如果您从磁盘读取延迟很差,主要是因为SS表的数量。
我的建议:
使用水平压缩,您应该只获得最大读数作为水平。所以性能会好很多。
这是以增加压缩次数(如果sstable大小较低)和更高的磁盘IO为代价的。
您目前的布隆过滤器尺寸是多少?增加它会降低假阴性再次改善读数的可能性
您似乎有一个非常好的密钥缓存设置,如果您有可能经常读取的特定行,您可以打开行缓存。通常不建议这样做,因为大多数应用程序的优势很小。
如果数据始终是时间序列,可能会使用日期分层压缩吗?