使用cassandra的低读取吞吐量(时间序列数据)

时间:2014-11-13 16:46:05

标签: cassandra cassandra-2.0

我们正在研究迁移到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

1 个答案:

答案 0 :(得分:0)

你使用什么样的压实?如果您从磁盘读取延迟很差,主要是因为SS表的数量。

我的建议:

  1. 如果您正在寻找更好的读取延迟,我建议使用Leveled压缩。配置SS表大小以避免压缩太多。
  2. 使用水平压缩,您应该只获得最大读数作为水平。所以性能会好很多。

    这是以增加压缩次数(如果sstable大小较低)和更高的磁盘IO为代价的。

    1. 您目前的布隆过滤器尺寸是多少?增加它会降低假阴性再次改善读数的可能性

    2. 您似乎有一个非常好的密钥缓存设置,如果您有可能经常读取的特定行,您可以打开行缓存。通常不建议这样做,因为大多数应用程序的优势很小。

    3. 如果数据始终是时间序列,可能会使用日期分层压缩吗?