Erick Ramirez Asked: 2024-06-26 11:48:51 +0800 CST2024-06-26 11:48:51 +0800 CST 2024-06-26 11:48:51 +0800 CST 为什么升级 Cassandra 后节点的内存使用量会增加? 772 节点似乎比运行 Cassandra 2.1 时使用了更多的内存。 当节点升级到较新版本的 Cassandra 时,服务器上的内存利用率突然飙升,一些节点报告内存不足错误。是什么导致了这种现象? cassandra 1 个回答 Voted Best Answer Erick Ramirez 2024-06-26T11:48:51+08:002024-06-26T11:48:51+08:00 症状 用户报告了在使用 Cassandra 2.1 运行时集群未观察到的性能问题。升级到 Cassandra 2.2 或 3.x 后不久,尽管应用程序负载、集群流量、访问模式、一天/一周/一个月的时间以及硬件/网络资源等因素相同,节点仍会遇到问题。 症状包括: 堆外内存使用量显著增加(例如,使用 或 等 Linux 实用程序进行监控时top)sar。 增加了 P99 和/或最大读取延迟(例如从nodetool tablehistograms输出)。 极端情况下的间歇性读取请求超时。 在极少数情况下,节点上启动的 Cassandra 无法完成启动序列,因为大部分内存被很快消耗并最终耗尽,因此 Linuxoom-killer会终止 Cassandra 进程。 原因 mmap()Apache Cassandra 通过 Unix 系统调用(或mmap简称)使用内存映射文件 I/O。mmap系统调用允许 Cassandra 使用操作系统的虚拟内存来保存数据文件的副本,因此读取 SSTables 的速度很快。cassandra.yaml名为 的隐藏属性disk_access_mode决定了如何访问数据文件。有效选项包括: auto(默认)- SSTable 数据和索引文件都映射到 64 位系统上;仅索引文件映射到 32 位系统上 mmap- 数据和索引文件都映射到内存 mmap_index_only- 只有索引文件映射到内存 standard- Cassandra 使用标准 IO,没有文件映射到内存 在 Cassandra 2.1 或更早版本中,读取压缩的 SSTables 涉及将数据复制到堆上,然后发送到堆缓冲区进行解压缩,并且表现得好像磁盘访问模式设置为,mmap_index_only尽管默认模式是auto。 随着 Cassandra 2.2 ( CASSANDRA-8464 )中增加了对直接缓冲区解压缩的支持,磁盘访问模式的行为发生了变化,变为了设计时的方式,即auto64 位系统上的默认模式现在mmap()同时包含 SSTable 数据和索引文件。 如果存在大量随机读取,并且读取量很大的 SSTable 集大于可用内存,则受影响的节点将出现大量页面错误。在某些情况下,受影响的服务器会耗尽内存,Linux 会oom-killer终止 Cassandra。 解决方案 由于 CASSANDRA-8464 允许直接映射压缩数据,因此仅映射索引文件效率更高。 在启动期间的默认设置下disk_access_mode: auto,Cassandra 会记录类似如下的条目: INFO [main] 2019-05-02 12:33:21,572 DatabaseDescriptor.java:350 - \ DiskAccessMode 'auto' determined to be mmap, indexAccessMode is mmap 设置disk_access_mode为:mmap_index_onlycassandra.yaml disk_access_mode: mmap_index_only 重新启动 Cassandra 后,日志中的条目将类似于以下内容: INFO [main] 2019-05-02 17:53:50,437 DatabaseDescriptor.java:356 - \ DiskAccessMode is standard, indexAccessMode is mmap 该日志条目表明 SSTable 数据文件使用标准磁盘 IO,但索引文件将映射到内存。 致谢 布拉尼米尔·兰波夫 杰克·卢西亚尼 马克·柯蒂斯 迈克尔·基尼 斯蒂芬妮·阿尔博盖蒂 清陈 邓炜 该帖子转载自DataStax 支持知识库文章《升级到 DSE 5.0 或 DSE 5.1和DataStax 社区(已退役,优先用于 Stack Exchange 网络)》
症状
用户报告了在使用 Cassandra 2.1 运行时集群未观察到的性能问题。升级到 Cassandra 2.2 或 3.x 后不久,尽管应用程序负载、集群流量、访问模式、一天/一周/一个月的时间以及硬件/网络资源等因素相同,节点仍会遇到问题。
症状包括:
top
)sar
。nodetool tablehistograms
输出)。在极少数情况下,节点上启动的 Cassandra 无法完成启动序列,因为大部分内存被很快消耗并最终耗尽,因此 Linux
oom-killer
会终止 Cassandra 进程。原因
mmap()
Apache Cassandra 通过 Unix 系统调用(或mmap
简称)使用内存映射文件 I/O。mmap系统调用允许 Cassandra 使用操作系统的虚拟内存来保存数据文件的副本,因此读取 SSTables 的速度很快。cassandra.yaml
名为 的隐藏属性disk_access_mode
决定了如何访问数据文件。有效选项包括:auto
(默认)- SSTable 数据和索引文件都映射到 64 位系统上;仅索引文件映射到 32 位系统上mmap
- 数据和索引文件都映射到内存mmap_index_only
- 只有索引文件映射到内存standard
- Cassandra 使用标准 IO,没有文件映射到内存在 Cassandra 2.1 或更早版本中,读取压缩的 SSTables 涉及将数据复制到堆上,然后发送到堆缓冲区进行解压缩,并且表现得好像磁盘访问模式设置为,
mmap_index_only
尽管默认模式是auto
。随着 Cassandra 2.2 ( CASSANDRA-8464 )中增加了对直接缓冲区解压缩的支持,磁盘访问模式的行为发生了变化,变为了设计时的方式,即
auto
64 位系统上的默认模式现在mmap()
同时包含 SSTable 数据和索引文件。如果存在大量随机读取,并且读取量很大的 SSTable 集大于可用内存,则受影响的节点将出现大量页面错误。在某些情况下,受影响的服务器会耗尽内存,Linux 会
oom-killer
终止 Cassandra。解决方案
由于 CASSANDRA-8464 允许直接映射压缩数据,因此仅映射索引文件效率更高。
在启动期间的默认设置下
disk_access_mode: auto
,Cassandra 会记录类似如下的条目:设置
disk_access_mode
为:mmap_index_only
cassandra.yaml
重新启动 Cassandra 后,日志中的条目将类似于以下内容:
该日志条目表明 SSTable 数据文件使用标准磁盘 IO,但索引文件将映射到内存。
致谢
该帖子转载自DataStax 支持知识库文章《升级到 DSE 5.0 或 DSE 5.1和DataStax 社区(已退役,优先用于 Stack Exchange 网络)》