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、缓存等数据结构,同时依赖非堆内存进行网络通信和文件操作。
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写入密集型场景建议适当增大年轻代。
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,需要根据服务器内存大小进行合理配置。
cat /cassandra/app/conf/jvm-server.options | grep -E “Xms|Xmx”
-Xms8g
# MAX_HEAP_SIZE
-Xmx8g
对于64GB内存的服务器,建议配置如下:
vi /cassandra/app/conf/jvm-server.options
-Xms16g
# 最大堆内存
-Xmx16g
# 年轻代大小
-Xmn4g
重启Cassandra服务使配置生效:
systemctl restart cassandra
Authentication is required to restart ‘cassandra.service’.
Authenticating as: root
Password: ******
==== AUTHENTICATION COMPLETE ===
jps -l | grep Cassandra
jmap -heap 15234
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垃圾回收器,建议根据实际场景进行调优。
cat /cassandra/app/conf/jvm-server.options | grep -A 20 “G1”
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=35
-XX:G1HeapRegionSize=16m
-XX:G1ReservePercent=10
-XX:ParallelGCThreads=16
-XX:ConcGCThreads=4
生产环境推荐G1GC配置:
vi /cassandra/app/conf/jvm-server.options
-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日志输出:
vi /cassandra/app/conf/jvm-server.options
-Xlog:gc*:file=/cassandra/logs/gc.log:time,uptime,level,tags:filecount=10,filesize=100M
systemctl restart cassandra
Authentication is required to restart ‘cassandra.service’.
Authenticating as: root
Password: ******
==== AUTHENTICATION COMPLETE ===
tail -50 /cassandra/logs/gc.log
[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.max_map_count = 65530
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
fs.file-max = 763987
编辑内核参数配置文件:
vi /etc/sysctl.conf
# 关闭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.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
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
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
-rwxr-xr-x. 1 root root 473 Jan 15 10:35 /etc/rc.d/rc.local
3.4 文件系统优化配置
Cassandra数据目录的文件系统优化对性能有显著影响。
mount | grep cassandra
编辑fstab文件添加优化挂载选项:
vi /etc/fstab
/dev/sdb1 /cassandra/fgdata xfs defaults,noatime,nodiratime,discard 0 0
mount -o remount /cassandra/fgdata
/dev/sdb1 on /cassandra/fgdata type xfs (rw,noatime,nodiratime,discard,attr2,inode64,noquota)
配置文件描述符限制:
vi /etc/security/limits.conf
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”
Part04-生产案例与实战讲解
4.1 Cassandra数据库JVM调优案例
某电商平台Cassandra集群出现频繁Full GC,导致服务响应缓慢。经分析发现堆内存配置过大,年轻代比例不合理。
jstat -gc 15234 1000 10
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配置:
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
Authentication is required to restart ‘cassandra.service’.
Authenticating as: root
Password: ******
==== AUTHENTICATION COMPLETE ===
jstat -gc 15234 1000 10
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瓶颈,经分析发现文件系统挂载选项和内核参数未优化。
iostat -x 1 5
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
/dev/sdb1 on /cassandra/fgdata type xfs (rw,noatime,nodiratime,discard,attr2,inode64,noquota)
优化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
Authentication is required to restart ‘cassandra.service’.
Authenticating as: root
Password: ******
==== AUTHENTICATION COMPLETE ===
iostat -x 1 5
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内存使用情况,及时调整参数。
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
