我们有一个跨2个不同数据中心的12节点cassandra集群。我们正在通过网络应用程序将数据从sql DB迁移到cassandra,还有另一个.net应用程序可以从cassandra读取数据。最近关闭,我们看到一个或另一个节点发生故障(nodetool状态显示DN,并且该服务已停止)。以下是nodetool状态的输出。我们必须启动该服务才能再次使它运行,但它又会停止。
https://ibb.co/4P1T453
答案 0 :(得分:1)
因此,在浏览您的粘贴框时,我看到一些可以调整的东西。
首先,我有把握确保这是您的主要问题:
Unable to lock JVM memory (ENOMEM). This can result in part of the JVM being swapped out,
especially with mmapped I/O enabled. Increase RLIMIT_MEMLOCK or run Cassandra as root.
宏:int ENOMEM
“无法分配内存。”系统无法分配更多虚拟内存 内存,因为它的容量已满。
-Xms12G, -Xmx12G, -Xmn3000M,
您的实例上有多少RAM?从我看到的情况来看,您的节点因OOM(内存不足错误)而垂死。我的猜测是您为堆分配了太多的RAM,而OS /页面缓存不足。实际上,我不会为堆指定超过50%-60%的RAM。
例如,我主要在16GB的RAM上构建实例,并且我发现最大10GB的堆大约与您想要的一样大。
-XX:+UseParNewGC, -XX:+UseConcMarkSweepGC
实际上,当您使用CMS GC时,最大堆大小不会超过8GB。
Maximum number of memory map areas per process (vm.max_map_count) 65530 is too low,
recommended value: 1048575, you can change it with sysctl.
这表示您尚未调整limits.conf
或sysctl.conf
。查看指南(DSE 6.0 - Recommended Production Settings),但通常最好将以下内容添加到这些文件中:
/etc/limits.conf
* - memlock unlimited
* - nofile 100000
* - nproc 32768
* - as unlimited
/etc/sysctl.conf
vm.max_map_count = 1048575
注意:调整sysctl.conf后,您将需要运行sudo sysctl -p
或重新启动。
Is swap disabled? : false,
您将要禁用交换。如果Cassandra开始将RAM的内容交换到磁盘,事情将会变得很慢。运行swapoff -a
,然后编辑/etc/fstab
并删除所有交换条目。
tl; dr;摘要
limits.conf
和sysctl.conf
文件。希望这会有所帮助!