Cassandra:避免全局禁用交换分区的当前可行替代方案咨询
我之前在开发环境里也碰到过一模一样的问题,当时因为设备限制没法禁用swap,试了几个方案后效果都不错,分享给你:
1. 合理调整Cassandra堆内存配置
Cassandra的内存使用分为堆内和堆外,16GB内存的机器别把堆内存设得太满,不然系统很容易被迫调用swap。建议在$CASSANDRA_HOME/conf/cassandra-env.sh里修改这两个核心参数:
MAX_HEAP_SIZE="6G" # 堆内存总大小,推荐设为物理内存的1/4到1/2 HEAP_NEWSIZE="1.5G" # 新生代内存,一般是堆内存的1/4左右
留足内存给操作系统和Cassandra的堆外使用,能大幅降低swap被触发的概率。
2. 启用JNA(并未过时,当前版本依然推荐)
你之前了解的JNA方案其实现在依然有效,而且新版Cassandra默认已经自带JNA包了。先检查$CASSANDRA_HOME/lib目录下有没有jna-*.jar,如果没有就下载对应版本的JNA包放进去,然后在cassandra.yaml里确认配置:
jna_enabled: true
JNA能让Cassandra直接调用系统级内存管理,减少对swap的依赖,还能提升整体内存使用效率。
3. 降低系统Swappiness优先级
Ubuntu默认的swappiness值是60,系统会比较容易触发swap。把它调低到10,让系统优先使用物理内存,迫不得已才动用swap:
- 临时生效:
sudo sysctl vm.swappiness=10
- 永久生效:编辑
/etc/sysctl.conf,添加一行:
vm.swappiness=10
执行sudo sysctl -p让配置立即生效。
4. 锁定JVM内存到物理内存
通过JVM参数让Cassandra的内存直接锁定在物理内存里,完全避免被交换到swap。在cassandra-env.sh的JVM_OPTS部分添加:
JVM_OPTS="$JVM_OPTS -XX:+AlwaysPreTouch" JVM_OPTS="$JVM_OPTS -XX:+UseTransparentHugePages" JVM_OPTS="$JVM_OPTS -XX:+UseLargePages" JVM_OPTS="$JVM_OPTS -XX:+LockAllMemory"
还要给Cassandra用户添加内存锁定权限,编辑/etc/security/limits.conf:
cassandra soft memlock unlimited cassandra hard memlock unlimited
之后重启Cassandra服务即可,这个方案能彻底解决swap触发的问题,但要确保你给Cassandra分配的堆内存+堆外内存不超过物理内存的可用空间。
这些方案可以组合使用,我在开发环境里这么配置后,那个降级模式警告就消失了,性能也没受影响。
内容的提问来源于stack exchange,提问作者Jake

