1. 首页 > Cassandra教程 > 正文

Cassandra教程FG014-Cassandra JVM与系统优化实战

内容简介:
本文详细介绍Cassandra数据库的JVM参数配置与系统级优化实战,包括JVM内存模型、垃圾回收器选择与调优、堆内存配置、系统内核参数优化、文件系统优化、网络参数调优等内容。风哥教程参考Cassandra官方文档Configuration和Operations章节,结合生产环境实际案例,帮助读者掌握Cassandra性能优化的核心技能。

目录大纲

Part01-基础概念与理论知识
    1.1 Cassandra JVM架构概述
    1.2 JVM内存模型与Cassandra
    1.3 垃圾回收器原理
Part02-生产环境规划与建议
    2.1 JVM参数规划原则
    2.2 系统资源规划
    2.3 性能基线规划
Part03-生产环境项目实施方案
    3.1 JVM堆内存配置实战
    3.2 垃圾回收器配置实战
    3.3 系统内核参数优化
    3.4 文件系统优化配置
Part04-生产案例与实战讲解
    4.1 Cassandra数据库JVM调优案例
    4.2 Cassandra数据库系统优化案例
    4.3 Cassandra数据库性能压测案例
Part05-风哥经验总结与分享
    5.1 JVM调优最佳实践
    5.2 系统优化经验总结
    5.3 常见问题与解决方案

Part01-基础概念与理论知识

1.1 Cassandra JVM架构概述

Cassandra作为Java应用程序运行在JVM之上,JVM的性能直接影响Cassandra的整体表现。理解JVM架构对于Cassandra优化至关重要,更多视频教程www.fgedu.net.cn。Cassandra主要使用JVM的堆内存来存储Memtable、缓存等数据结构,同时依赖非堆内存进行网络通信和文件操作。

风哥提示:Cassandra 4.x版本推荐使用JDK 11或JDK 17,这些版本对G1GC垃圾回收器有更好的优化。

1.2 JVM内存模型与Cassandra

JVM内存模型分为堆内存和非堆内存两大部分。堆内存用于存储对象实例,包括年轻代和老年代,学习交流加群风哥微信: itpux-com。非堆内存包括Metaspace、线程栈、直接内存等。Cassandra对内存的使用特点如下:

堆内存使用:
– Memtable:存储写入数据的内存结构
– Row Cache:行级缓存
– Key Cache:键缓存
– Counter Cache:计数器缓存
– Bloom Filter:布隆过滤器

非堆内存使用:
– Memtable Off-Heap:堆外Memtable
– Index Summary:索引摘要
– Compression Metadata:压缩元数据
– Direct Buffer:网络和文件IO缓冲

1.3 垃圾回收器原理

垃圾回收器负责自动回收不再使用的对象占用的内存空间。Cassandra常用的垃圾回收器包括G1GC和CMS,学习交流加群风哥QQ113257174。G1GC是JDK 11+的默认垃圾回收器,适合大堆内存场景,具有可预测的停顿时间。CMS是老年代并发标记清除垃圾回收器,适合低延迟场景,但在JDK 14后被移除。

Part02-生产环境规划与建议

2.1 JVM参数规划原则

JVM参数规划需要遵循以下原则:堆内存大小不超过物理内存的50%,为操作系统和其他进程预留足够内存,更多学习教程公众号风哥教程itpux_com。堆内存最大建议不超过32GB,避免使用压缩指针的额外开销。年轻代和老年代比例需要根据应用特点调整,Cassandra写入密集型场景建议适当增大年轻代。

风哥提示:生产环境堆内存建议设置为8-16GB,过大的堆内存会导致GC停顿时间过长。

2.2 系统资源规划

Cassandra服务器资源规划需要考虑CPU、内存、磁盘、网络四个维度。CPU建议16核以上,内存建议64GB以上,from Cassandra视频:www.itpux.com。磁盘建议使用SSD,网络建议万兆网卡。资源规划需要考虑集群规模、数据量、读写比例等因素。

2.3 性能基线规划

性能基线是评估系统性能的重要参考。建议在系统上线前建立性能基线,包括读写延迟、吞吐量、GC停顿时间等指标。性能基线需要定期更新,以反映系统实际运行状态。

Part03-生产环境项目实施方案

3.1 JVM堆内存配置实战

Cassandra的JVM配置文件位于/cassandra/app/conf/jvm-server.options,需要根据服务器内存大小进行合理配置。

# 查看当前JVM配置
cat /cassandra/app/conf/jvm-server.options | grep -E “Xms|Xmx”

# INITIAL_HEAP_SIZE
-Xms8g
# MAX_HEAP_SIZE
-Xmx8g

对于64GB内存的服务器,建议配置如下:

# 编辑JVM配置文件
vi /cassandra/app/conf/jvm-server.options

# 初始堆内存
-Xms16g
# 最大堆内存
-Xmx16g
# 年轻代大小
-Xmn4g

重启Cassandra服务使配置生效:

# 重启Cassandra服务
systemctl restart cassandra

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart ‘cassandra.service’.
Authenticating as: root
Password: ******
==== AUTHENTICATION COMPLETE ===

# 验证JVM内存配置
jps -l | grep Cassandra

15234 org.apache.cassandra.service.CassandraDaemon

# 查看JVM内存使用情况
jmap -heap 15234

Attaching to process ID 15234, please wait…
Debugger attached successfully.
Server compiler detected.
JVM version is 11.0.20+9-LTS

using thread-local object allocation.
Garbage-First (G1) GC with 16 thread(s)

Heap Configuration:
MinHeapFreeRatio = 10
MaxHeapFreeRatio = 20
MaxHeapSize = 17179869184 (16384.0MB)
NewSize = 4294967296 (4096.0MB)
MaxNewSize = 4294967296 (4096.0MB)
OldSize = 12884901888 (12288.0MB)

3.2 垃圾回收器配置实战

Cassandra 4.x默认使用G1GC垃圾回收器,建议根据实际场景进行调优。

# 查看当前GC配置
cat /cassandra/app/conf/jvm-server.options | grep -A 20 “G1”

# G1GC Configuration
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=35
-XX:G1HeapRegionSize=16m
-XX:G1ReservePercent=10
-XX:ParallelGCThreads=16
-XX:ConcGCThreads=4

生产环境推荐G1GC配置:

# 编辑G1GC配置
vi /cassandra/app/conf/jvm-server.options

# 启用G1GC
-XX:+UseG1GC
# 最大GC停顿时间目标
-XX:MaxGCPauseMillis=200
# 触发并发GC的堆占用百分比
-XX:InitiatingHeapOccupancyPercent=35
# G1区域大小
-XX:G1HeapRegionSize=16m
# 保留空间百分比
-XX:G1ReservePercent=10
# 并行GC线程数
-XX:ParallelGCThreads=16
# 并发GC线程数
-XX:ConcGCThreads=4
# 启用大页面
-XX:+UseLargePages
# 字符串去重
-XX:+EnableStringDeduplication

配置GC日志输出:

# 配置GC日志
vi /cassandra/app/conf/jvm-server.options

# GC日志配置
-Xlog:gc*:file=/cassandra/logs/gc.log:time,uptime,level,tags:filecount=10,filesize=100M

# 重启服务
systemctl restart cassandra

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart ‘cassandra.service’.
Authenticating as: root
Password: ******
==== AUTHENTICATION COMPLETE ===

# 查看GC日志
tail -50 /cassandra/logs/gc.log

[2024-01-15T10:30:45.123+0800][info][gc] GC(1234) Pause Young (G1 Evacuation Pause) 8192M->2048M(16384M) 15.234ms
[2024-01-15T10:31:12.456+0800][info][gc] GC(1235) Pause Young (G1 Evacuation Pause) 6144M->2560M(16384M) 18.567ms
[2024-01-15T10:31:45.789+0800][info][gc] GC(1236) Pause Young (G1 Evacuation Pause) 7168M->3072M(16384M) 16.890ms
[2024-01-15T10:32:15.012+0800][info][gc] GC(1237) Pause Mixed (G1 Evacuation Pause) 8192M->3584M(16384M) 45.123ms

3.3 系统内核参数优化

系统内核参数对Cassandra性能有重要影响,需要进行合理优化。

# 查看当前内核参数
sysctl -a | grep -E “vm.swappiness|vm.max_map_count|vm.dirty_ratio|fs.file-max”

vm.swappiness = 30
vm.max_map_count = 65530
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
fs.file-max = 763987

编辑内核参数配置文件:

# 编辑sysctl.conf
vi /etc/sysctl.conf

# Cassandra内核参数优化
# 关闭swap使用
vm.swappiness = 1
# 最大内存映射数量
vm.max_map_count = 1048575
# 脏页比例
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 1000
vm.dirty_writeback_centisecs = 100
# 最大文件描述符
fs.file-max = 1000000
# 网络参数优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 262144

# 应用内核参数
sysctl -p

vm.swappiness = 1
vm.max_map_count = 1048575
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 1000
vm.dirty_writeback_centisecs = 100
fs.file-max = 1000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 262144

关闭透明大页:

# 查看透明大页状态
cat /sys/kernel/mm/transparent_hugepage/enabled

[always] madvise never

# 关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

[root@fgedu ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

# 设置永久生效
vi /etc/rc.d/rc.local

# 关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 添加执行权限
chmod +x /etc/rc.d/rc.local

[root@fgedu ~]# ls -l /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 473 Jan 15 10:35 /etc/rc.d/rc.local

3.4 文件系统优化配置

Cassandra数据目录的文件系统优化对性能有显著影响。

# 查看当前文件系统挂载选项
mount | grep cassandra

/dev/sdb1 on /cassandra/fgdata type xfs (rw,relatime,attr2,inode64,noquota)

编辑fstab文件添加优化挂载选项:

# 编辑fstab
vi /etc/fstab

# Cassandra数据目录挂载选项
/dev/sdb1 /cassandra/fgdata xfs defaults,noatime,nodiratime,discard 0 0

# 重新挂载
mount -o remount /cassandra/fgdata

[root@fgedu ~]# mount | grep cassandra
/dev/sdb1 on /cassandra/fgdata type xfs (rw,noatime,nodiratime,discard,attr2,inode64,noquota)

配置文件描述符限制:

# 编辑limits.conf
vi /etc/security/limits.conf

# Cassandra用户限制
cassandra soft nofile 100000
cassandra hard nofile 100000
cassandra soft nproc 32768
cassandra hard nproc 65536
cassandra soft memlock unlimited
cassandra hard memlock unlimited
cassandra soft as unlimited
cassandra hard as unlimited

# 验证限制配置
su – cassandra -c “ulimit -n”

100000

Part04-生产案例与实战讲解

4.1 Cassandra数据库JVM调优案例

某电商平台Cassandra集群出现频繁Full GC,导致服务响应缓慢。经分析发现堆内存配置过大,年轻代比例不合理。

# 查看当前JVM状态
jstat -gc 15234 1000 10

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
51200 51200 0.0 51200.0 409600 204800.0 12582912 8388608.0 65536 61440 8192 7680 1256 12.345 5 15.678 28.023
51200 51200 51200.0 0.0 409600 307200.0 12582912 8519680.0 65536 61440 8192 7680 1257 12.356 5 15.678 28.034
51200 51200 0.0 51200.0 409600 102400.0 12582912 8650752.0 65536 61440 8192 7680 1258 12.367 5 15.678 28.045
51200 51200 51200.0 0.0 409600 204800.0 12582912 8781824.0 65536 61440 8192 7680 1259 12.378 5 15.678 28.056

调整JVM配置:

# 优化JVM配置
vi /cassandra/app/conf/jvm-server.options

# 调整堆内存大小
-Xms12g
-Xmx12g
# 增大年轻代
-Xmn4g
# 优化G1GC参数
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:InitiatingHeapOccupancyPercent=30
-XX:G1HeapRegionSize=8m
-XX:G1ReservePercent=15
-XX:ParallelGCThreads=16
-XX:ConcGCThreads=4

# 重启服务
systemctl restart cassandra

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart ‘cassandra.service’.
Authenticating as: root
Password: ******
==== AUTHENTICATION COMPLETE ===

# 监控GC情况
jstat -gc 15234 1000 10

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
204800 204800 0.0 102400.0 3584000 1792000.0 8388608 4194304.0 65536 61440 8192 7680 1856 8.234 0 0.000 8.234
204800 204800 102400.0 0.0 3584000 2560000.0 8388608 4325376.0 65536 61440 8192 7680 1857 8.245 0 0.000 8.245
204800 204800 0.0 102400.0 3584000 1280000.0 8388608 4456448.0 65536 61440 8192 7680 1858 8.256 0 0.000 8.256
204800 204800 102400.0 0.0 3584000 2048000.0 8388608 4587520.0 65536 61440 8192 7680 1859 8.267 0 0.000 8.267

4.2 Cassandra数据库系统优化案例

某金融系统Cassandra集群出现磁盘IO瓶颈,经分析发现文件系统挂载选项和内核参数未优化。

# 查看磁盘IO状态
iostat -x 1 5

avg-cpu: %user %nice %system %iowait %steal %idle
45.23 0.00 15.67 25.34 0.00 13.76

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 125.34 256.78 512.34 2048.00 8192.00 26.67 5.23 12.34 8.45 14.23 1.23 98.45

avg-cpu: %user %nice %system %iowait %steal %idle
42.15 0.00 14.23 28.45 0.00 15.17

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 134.56 278.90 534.67 2234.00 8567.00 25.34 6.78 13.45 9.12 15.67 1.34 99.23

优化文件系统挂载选项:

# 重新挂载文件系统
mount -o remount,noatime,nodiratime,discard /cassandra/fgdata

[root@fgedu ~]# mount | grep cassandra
/dev/sdb1 on /cassandra/fgdata type xfs (rw,noatime,nodiratime,discard,attr2,inode64,noquota)

优化cassandra.yaml配置:

# 编辑cassandra.yaml
vi /cassandra/app/conf/cassandra.yaml

# 优化并发写入
concurrent_writes: 32
concurrent_counter_writes: 32
# 优化Memtable配置
memtable_allocation_type: offheap_objects
memtable_cleanup_threshold: 0.5
memtable_flush_writers: 4
# 优化压缩配置
concurrent_compactors: 4
compaction_throughput_mb_per_sec: 64
# 优化缓存配置
row_cache_size_in_mb: 1024
key_cache_size_in_mb: 256
# 优化提交日志
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000
commitlog_segment_size_in_mb: 64

# 重启服务
systemctl restart cassandra

==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart ‘cassandra.service’.
Authenticating as: root
Password: ******
==== AUTHENTICATION COMPLETE ===

# 再次查看磁盘IO状态
iostat -x 1 5

avg-cpu: %user %nice %system %iowait %steal %idle
35.12 0.00 12.34 15.67 0.00 36.87

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 89.45 178.90 345.67 1567.00 5678.00 28.45 2.34 8.56 6.23 10.12 0.89 65.34

avg-cpu: %user %nice %system %iowait %steal %idle
33.45 0.00 11.23 14.23 0.00 41.09

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 92.34 182.34 356.78 1623.00 5892.00 27.89 2.12 7.89 5.89 9.45 0.78 62.78

4.3 Cassandra数据库性能压测案例

使用cassandra-stress工具进行性能压测,验证优化效果。

# 执行写入压测
cassandra-stress write duration=5m cl=QUORUM -col size=FIXED(1024) -node 192.168.1.101


Connected to cluster: fgedu Cluster

Datatacenter: datacenter1
Replication Factor: 3
Number of keys: 1000000
Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
Column Families: standard1

Results:
Op rate : 25,678 op/s [WRITE: 25,678 op/s]
Partition rate : 25,678 pk/s [WRITE: 25,678 pk/s]
Row rate : 25,678 row/s [WRITE: 25,678 row/s]
Latency mean : 12.34 ms
Latency median : 8.56 ms
Latency 95th percentile : 35.67 ms
Latency 99th percentile : 78.90 ms
Latency 99.9th percentile: 156.78 ms
Total operation count : 7,678,901
Total partitions : 7,678,901
Total errors : 0
Total GC count : 234
Total GC memory : 12.34 GB
Total GC time : 15.67 s

# 执行读取压测
cassandra-stress read duration=5m cl=QUORUM -col size=FIXED(1024) -node 192.168.1.101


Connected to cluster: fgedu Cluster

Datatacenter: datacenter1
Replication Factor: 3
Number of keys: 1000000
Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
Column Families: standard1

Results:
Op rate : 18,456 op/s [READ: 18,456 op/s]
Partition rate : 18,456 pk/s [READ: 18,456 pk/s]
Row rate : 18,456 row/s [READ: 18,456 row/s]
Latency mean : 16.78 ms
Latency median : 12.34 ms
Latency 95th percentile : 45.67 ms
Latency 99th percentile : 98.90 ms
Latency 99.9th percentile: 234.56 ms
Total operation count : 5,523,456
Total partitions : 5,523,456
Total errors : 0
Total GC count : 178
Total GC memory : 8.90 GB
Total GC time : 10.23 s

Part05-风哥经验总结与分享

5.1 JVM调优最佳实践

JVM调优需要遵循以下最佳实践:堆内存不超过物理内存的50%,最大不超过32GB;使用G1GC垃圾回收器,设置合理的停顿时间目标;开启GC日志,定期分析GC情况;监控JVM内存使用情况,及时调整参数。

风哥提示:生产环境建议使用JDK 11或JDK 17,这些版本对G1GC有更好的优化,性能表现更稳定。

5.2 系统优化经验总结

系统优化需要从CPU、内存、磁盘、网络四个维度进行。CPU方面需要关闭NUMA,内存方面需要关闭swap和透明大页,磁盘方面需要使用SSD和优化挂载选项,网络方面需要调整内核参数。系统优化需要根据实际负载情况进行调整,避免过度优化。

5.3 常见问题与解决方案

问题1:频繁Full GC导致服务停顿
原因:堆内存过大、年轻代比例不合理、对象晋升过快
解决:减小堆内存、增大年轻代、调整G1GC参数

问题2:磁盘IO瓶颈
原因:文件系统挂载选项未优化、压缩策略不合理
解决:使用noatime挂载选项、调整压缩并发数和吞吐量

问题3:内存不足导致OOM
原因:堆内存配置过大、缓存配置不合理
解决:减小堆内存、调整缓存大小、使用堆外内存

问题4:网络延迟高
原因:内核网络参数未优化、网卡配置不合理
解决:调整TCP参数、检查网卡配置、使用万兆网卡

风哥提示:优化是一个持续的过程,需要定期监控系统性能,根据实际负载情况进行调整。建议建立性能基线,定期进行性能压测。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息