cassandra自带测试工具cassandra-stress。
nodetool proxyhistograms可以在多个节点运行,发现最慢的协调节点。
nodetool tablehistograms可以查看特定表的性能。

利用tracing去跟踪某个特定表和相关查询。可以知道每个查询涉及的客户端和节点之间的通信和每一步的时间。设置tracing,可以使用cqlsh设置 TRACING ON,然后查询,再TRACING OFF。也可以通过驱动去查询tracing的结果。
nodetool setraceprobability:可以用来配置单个节点跟踪一些或者全部查询,默认是0.0。
0.0表示禁止tracing。1.0表示完全tracing。一般建议0.01或者0.001。
tracing结果存在system_traces中,2.2开始,还用来跟踪修复操作。cassandra会限制这些表的TTL,可以通过cassandra.yaml的tracetype_query_ttl和tracetype_repair_ttl。

调优:建议一次改一个配置参数,然后测试结果。调优建议:cassandra.yaml和cassandra-env.sh节点配置属性,在表结构上的各种参数,进行调整测试。

缓存
键缓存,行缓存,计数器缓存。
行缓存会为每个分区缓存一定数量的行,这个数量可配置。如果在给定的表使用行缓存,不需要同时使用键缓存。
考虑查询,考虑堆和缓存大小比值,考虑行大小与键大小的比值。
键缓存:
存储分区键和行索引之间的一个映射,以便快速找到SSTable。可以对每个表分别使用键缓存。默认开启键缓存。AND caching={‘key’:‘ALL’, ‘rows_per_partition’:'NONE'} ALL或者NONE
key_cache_size_in_mb表示键缓存大小,默认为min(JVM堆的5%,100MB)
行缓存:
小心使用,使用不当,容易带来的问题比优化多。小数据集还好,大数据集,如果必须从磁盘都,性能会下降。读多写少比较适合。可以利用操作系统支持的文件缓存特性来代替行缓存。
‘rows_per_partition’:'NONE'或者‘ALL’或者‘一个正整数’。行缓存可自定义实现,通过row_cache_class_name属性设置,默认由org.apache.cassandra.OHCProvider类实现的堆外缓存。之前是SerializingCacheProvider
计数器缓存:
通过减少对最常访问的计数器的锁竞争来提供性能。没有提供为每个表单独配置的选项。counter_cache_size_in_mb设置,所有表共享。默认是min(JVM堆2.5%,50MB)
cassandra支持定期将缓存保存到磁盘,可以在启动时读取来快速预热缓存。缓存文件保存在saved_caches属性指定的目录下。会按key_cache_save_period、row_cache_save_period和counter_cache_save_period属性指定的间隔(单位为秒)写文件,这些值的默认是14000(3个多小时)、0(禁用)、7200(2小时)。
缓存按键值索引。文件中保存的键个数由key_cache_keys_to_save、row_cache_keys_to_save和counter_cache_keys_to_save属性指示。
nodetool管理缓存,使用invalidatekeycache、invalidaterowcache和invalidatecountercache命令清除缓存。使用setacchecapacity覆盖键缓存和行缓存的容量。setcachekeytosave覆盖一个文件中保存多少个行缓存和键缓存。重启之后会恢复为cassandra.yaml。

memtable
每个表维护一个memtable,达到commitlog阈值,或者memtable阈值,会把memtable刷新输出为SSTable。memtable存在java堆或堆外内存中。堆和堆外限制为:memtable_heap_space_in_mb和memtable_offheap_space_in_mb设置。默认这两个值都设置在cassandra-env.sh为1/4堆大小。为memtable分配内存会减少缓存以及其他可用内存,要增量调优。
memtable_allocation_type,可插拔,默认是org.apache.cassandra.utils.memory.MemtablePool实现,没经验不建议自己实现。默认headp_buffers会让cassandra使用java New I/O(NIO)API在堆上分配memtable。offheap_buffers会让cassandra用NIO在堆上和堆外都分配每个memtable的一部分。
memtable_flush_writers,默认是2。写memtable的线程数,如果使用SSD,应该改为内核数,但不能能超过8,如果有很大的堆,可以设置更大,提高性能。
memtable_flush_period_in_ms,可以设置定期刷新。默认0表示禁用。带来可预测的写IO,但是会导致更多的SSTable和频繁的合并,影响读性能。

commitlog
commitlog_segment_size_in_mb,默认值为32MB,commitlog达到多大,开始写新文件。
commitlog_total_space_in_mb,如果设置比较大,可以不需要太频繁输出到磁盘。
commitlog_compression,启用日志压缩,LZ4、Snappy、Deflate。压缩需要额外CPU时间。
commitlog_sync,默认periodic,按时间间隔flush,由commitlog_sync_period_in_ms指定,默认10秒。batch会同步写磁盘,会阻塞。

SSTable
最好使用SSD,commitlog和数据文件使用不同的磁盘。
file_cache_size_in_mb:从磁盘读取SSTable时,cassadnra使用了一种缓冲缓存,即缓存池,来减少数据文件IO。缓存使用堆外内存,默认是min(512MB,Java堆的1/4)。
buffer_pool_use_heap_if_exhausted设置为true,允许cassandra使用堆外缓存满时使用java堆作为缓冲区。
index_summary_capacity_in_mb:cassandra可以覆盖默认java堆的5%。会在内存中维护SSTable索引摘要来加快对SSTable文件的访问。默认使用java堆的5%分配给这些索引。
为了保持索引摘要不超过限制,cassandra会缩减不需要表的相关索引。按时间频率重建索引,index_summary_resize_interval_in_minutes,默认60分钟。
min_index_inerval和max_index_inerval设置每个表的SSTable存储的最大和最小索引条数目。

hint handoff
hinted_handoff_throttle_in_kb:控制传输时使用的带宽,默认1024KB/秒。也可以通过nodetool sethintedhandoffthrottlekb。这是一个总的值,表示接受hint的节点的限制,如果有2个节点发hint,那么每个节点各分1/2的带宽。建议所有节点都设置一样,避免混淆。
3.0之前,hint存储在表中。3.0之后hint存在hints_directory属性指定的目录。通过max_hints_file_size_in_mb指定存储hint的磁盘大小。
nodetool truncatehints + IP/主机名/或者对应列表,可以清除向一个或者多个节点发送的hint。
max_hint_window_in_ms:只保存节点下线多久之内的hint。
还可以禁用和启用hint。

compact
SizeTieredCompactionStrategy(STCS),默认压缩策略。将SSTable分组为tier(层),按大小排列。如果一层有足够数量的SSTableI(默认为4个or更多),就会合并,组合成更大的SSTable。随着数据量的增长,会创建越来越多的层。适合写密集的表,不适合读密集。
LeveledCompactionStrategy(LCS),创建固定大小的SSTable,默认5MB,分组为leve(级),每一级包含前一级10倍的SSTable。LCS在IO上面开销更大,尽可能减少包含某一行的SSTable个数,给定的一个行平均在1.11个SSTable中。读远大于都,可以使用这个策略。如果IO很密集效果也不好。level的策略是L0层会在合并SSTable时,会同时选择L0和L1的有相同交集的rowkey的SSTabl一起合并。所以只有L0和L1之间会重复,其他都不会。L1之间也不会。
DateTieredCompactionStrategy(DTCS),2.0.11和2.1.1引入,为了提高时间序列数据的读性能,特别是访问模式涉及要访问最近写入的数据。做法是将时间窗SSTable分组,由数据的写入时间组织。合并只能在这些时间窗内完成。
compactionthreshold可以在每个表设置最大,最少多少个SSTable合并。也可以使用nodetool getcompactionthreshold 和 setcompactionthreshold获取和设置。
nodetool compactionstats查看合并状态
nodetool getcompactionthroughput和setcompactionthroughput获取和设置compact限流。
也可以在cassandra.yaml去设置compaction_throughput_mb_per_sec。设置为0表示禁用,默认16MB/s。
concurrent_compactors属性增加合并线程数。默认为min(磁盘数,内核数),最小2,最大8。
nodetool stop停止一个节点所有正在执行的合并,还可以按ID指定停止哪个compact。
nodetool compact命令可以强制完成一个主合并。合并开销很大。
nodetool compactionhistory可以看到已完成合并的统计。

JVM
适当调整-XX:SurvivorRatio,Eden区和Survivor区的比值,Eden放新对象,Survivor放GC之后还幸存的对象。设置-Xms和-Xmx一样,可以避免JVM花费大量时间扩展堆。使用CMS不建议设置超过8G的堆,因为堆太大,往往带来更长的GC耗时。
G1GC通常不需要太多调优,设置最大最小堆即可。G1GC在小于8G的场景不如CMS。
gc_warn_threshold_in_ms如果超过这个阈值,就打印告警日志。

可以使用cassandra-stress去测试性能
DataStax有个开源性能测试平台,cstar_perf。

可以在JVM参数加 -Dcassandra.write_survey=true和-Djoin_ring=false去测试节点的写。

cassandra权威指南读书笔记--性能调优的更多相关文章

  1. cassandra权威指南读书笔记--客户端

    DataStax驱动最成熟.默认,驱动程序会使用第一个连接的节点作为支持的版本协议.如果集群存在高低版本的节点(比如升级场景),如果驱动先连接不同不同版本的节点,可能会出现不兼容.驱动支持压缩客户端和 ...

  2. cassandra权威指南读书笔记--Cassandra架构(3)

    分阶段事件驱动架构 SEDASEDA(Staged Event-Driven Architecture)的核心思想是把一个请求处理过程分成几个Stage,不同资源消耗的Stage使用不同数量的线程来处 ...

  3. cassandra权威指南读书笔记--数据建模

    没有join操作.有轻量级事务和批处理,但是没有外键等.反规范化.3.0支持物化视图,允许在一个表上创建数据的多个物化视图.使用cassandra要从查询入手,而不是先从数据模型开始.先对查询建模,然 ...

  4. cassandra权威指南读书笔记--监控&维护

    cassandra SLF4J API记录日志,具体采用Logback实现.在终端启动cassandra时,可以向程序输入-f,就能在终端看到这个输出.Java Mangement Extension ...

  5. cassandra权威指南读书笔记--读写数据

    写cassandra除了轻量级事务,不支持别的事务.cassandra是追加写,写的速度非常快.cassandra还有hint日志,这个数据库总是可写的,而且单个列的写操作是原子的.hint并不是一定 ...

  6. cassandra权威指南读书笔记--配置cassadnra

    配置集群时,要求所有节点的集群名,分区器,snitch必须相同.种子节点最好相同. 种子节点:最好每个DC,配置2个,这样即使一个DC中一个种子节点挂了,仍然有一个中子节点可用.种子节点被认为是最先加 ...

  7. cassandra权威指南读书笔记--Cassandra架构(2)

    环和令牌cassandra的数据管理是用一个环来表示.为环中的每个节点分配一or多个数据范围,用token描述.token由64位整数ID表示,范围-2^(63)~2^(63)-1.使用对分区键进行一 ...

  8. cassandra权威指南读书笔记--Cassandra架构(1)

    结构 集群-->数据中心-->机架-->节点. cassandra尽可能将数据副本存在多个数据中心,然后读取(查询路由到)尽可能在本地数据中心. 为了去中心化和分区容错性,使用gos ...

  9. cassandra权威指南读书笔记--cassandra概述

    cassandra是一个开源的.分布式.去中心化.弹性可扩展.高可用.容错.可调一致性.面向行数据库,分布式设计基于Amazon Dynamo,数据模型基于Google BigTable.cassan ...

随机推荐

  1. Docker-MsSqlServer和安装版本异同

    创建SqlServer容器 docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=<YourStrong@Passw0rd&g ...

  2. i5 11300H和i5 10300H 的区别

    i5-11300H 为 4 核 8 线程,主频 3.1GHz,睿频 4.4GHz,三级缓存 8MB 选 i5-11300H还是i5 10300h 这些点很重要!看完你就知道了https://list. ...

  3. day122:MoFang:OSSRS流媒体直播服务器&基于APICloud的acLive直播推流模块实现RTMP直播推流

    目录 1.docker安装OSSRS流媒体直播服务器 2.基于APICloud的acLive直播推流模块实现RTMP直播推流 3.直播流管理 1.docker安装OSSRS流媒体直播服务器 1.OSS ...

  4. LeetCode485 最大连续1的个数

    给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组 ...

  5. 【C++】《C++ Primer 》第十九章

    第十九章 特殊工具与技术 一.控制内存分配 1. 重载new和delete new表达式的工作机理: string *sp = new string("a value"); //分 ...

  6. c++ 参数传递与返回值详解(reference)

    pass by value or pass by reference? 我们知道,当函数在传递值的时候,会新建一个变量(没有名字)储存这个值 然后传递.降低程序运行的效率. 如果使用引用(refere ...

  7. MySQL常用的数据类型和字段属性

    数据类型 数值 tinyint 十分小的数据 1个字节 smallint 较小的数据 2个字节 mediumint 中等大小的数据 3个字节 int 标准的整数 4个字节 常用 bigint 较大的数 ...

  8. 洛谷P1972 [SDOI2009]HH的项链(树状数组)

    题目链接: https://www.luogu.org/problemnew/show/P1972 题目描述: HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后 ...

  9. library cache pin解决方法

    library cache pin大部分都是因为编译存储过程造成的 查找造成问题的数据库对象(一般为存储过程) SELECT * FROM v$session_wait WHERE event = ' ...

  10. 入门OJ:八中生成树2

    题目描述 八中里面有N个建设物,M条边.对于这种要建最小生成树的问题,你应该很熟练了.现在老大决定降低某条边的费用,然后这条边必须要被选中,因为这条路他每天都要走,自然......问选了这条边后是否可 ...