提问人:Dinesh Chandra 提问时间:11/7/2023 最后编辑:trincotDinesh Chandra 更新时间:11/17/2023 访问量:61
在 cassandra 中设置堆大小和其他相关参数
Setting Heap size and other related parameters in cassandra
问:
我有一个具有 256GB 内存的 cassandra 5 节点集群。 我在读取操作中遇到了一些性能问题,所以我决定增加我的堆大小,因为它正在使用 defualt。 我用 MAX_HEAP_SIZE=“128G” & HEAP_NEWSIZE=“32G” 更新了 cassandra-env 文件。
我发现读取查询的性能更好一些,但我在日志中看到了一些消息,例如“某些操作很慢”和垃圾回收事件。似乎增加堆大小可能会导致垃圾回收活动增加。
您能否协助我调整有关MAX_HEAP_SIZE=“128G”的其他参数。
答:
首先,我不会更改 cassandra-env.sh 中的参数。请改用 jvm.options 文件。
其次,我可能不会移动到 128G 堆大小,这可能太大了。
第三,newsize 和 max 堆大小应该相同,否则,您将获得扩展,这可能会导致性能问题。
第四,在增加堆大小之前,您必须了解发生了什么。为什么要增加堆大小?您是否因为堆已用尽而看到分配错误?您是否看到老一代 GC 停顿了很长时间?
在 jvm.options 中,设置 -Xmx 和 -Xms,而不是使用 cassandra-env.sh。
我真的不认为堆设置是这里的问题。史蒂夫是对的,因为你绝对不想去128GB。事实上,我不建议在 Java 8 上使用 32GB 以上。他也是正确的,因为 Cassandra 4 的堆配置更改应该在文件中进行,而不是 .jvm.options
cassandra-env.sh
问题是这样的:
select col1,col2,col3..col75 FROM keyuspace.table
WHERE "ID" in (65893388252433)
AND "EndTime" >= 1688511600000 AND "EndTime" <= 1688597999999
LIMIT 20000 ;
我们在表中总共有 200 列,制作 45k 条记录大约需要 20 秒。如果我们在 “in 子句” 中选择多个 ID,则需要花费大量时间,有时还会挂起。
从上面的 SELECT 语句来看,我猜 PRIMARY KEY 定义如下所示: .
在我看来,您只是想一次提取太多数据。我建议以下几点:PRIMARY KEY (("ID"),"EndTime)
- 一次只查询一个。
"ID"
- 对 SELECT 中指定的列数要谨慎。
- 缩短时间窗口。看起来这个查询是 24 小时;看看你能不能降低它。
- 将表改造为使用“hour”作为分区桶;前任:。这将导致分区变小,这看起来也有一些问题。
PRIMARY KEY (("ID","hour_bucket"),"EndTime")
- 使用固态硬盘。不确定这个集群背后的磁盘硬件,但我敢打赌磁盘 IO 延迟太高了。如果集群没有固态硬盘的支持,那么这里就是最大的物有所值的地方。如果群集位于云中,请查看迁移到下一个磁盘层。如果集群磁盘是由 NetApp 或其他磁盘阵列设备抽象的,请检查以确保集群中节点的磁盘未放置在同一硬件阵列中。查询很可能遇到了不受 Cassandra 配置影响的磁盘瓶颈。
评论