JVM/OS 配置
本节重点介绍与系统(JVM/OS)相关的配置。
1.JVM 选项
建议使用 JDK 1.8 的最新版本。通过设置相同的 Xms 和 Xmx 值,防止 JVM 调整堆大小以获得更好的性能。生产环境 JVM 配置如下
-server -Xms8g -Xmx8g -Xmn4g
当 JVM 默认情况下为 8 字节对齐时,建议最大堆内存不要超过 32G。否则,JVM 的指针压缩技术将受到影响,并且会浪费内存。
如果您不关心 RocketMQ Broker 的启动时间,更好的选择是“预先接触”Java 堆,以确保在 JVM 初始化期间分配每个页面。那些不关心启动时间的人可以启用它
-XX:+AlwaysPreTouch
禁用偏向锁定可能会减少 JVM 暂停
-XX:-UseBiasedLocking
垃圾收集,我们建议使用 JDK 1.8 附带的 G1 收集器
-XX:+UseG1GC
-XX:G1HeapRegionSize=16m
-XX:G1ReservePercent=25
-XX:InitiatingHeapOccupancyPercent=30
这些 GC 选项可能看起来很激进,但它们在我们的生产环境中表现良好。
此外,不要将 -XX:MaxGCPauseMillis 的值设置得太小,否则 JVM 将使用较小的年轻代来实现此目标,这将导致非常频繁的次要 GCS,因此建议滚动 GC 日志文件
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=30m
如果写入 GC 文件会增加代理的延迟,请考虑将 GC 日志文件重定向到内存文件系统
-Xloggc:/dev/shm/mq_gc_%p.log123
2.Linux 内核参数
bin 文件夹中的 os.sh 脚本列出了许多内核参数,可以稍微更改,然后用于生产目的。注意以下参数,更多详细信息,请参阅 文档 在 /proc/sys/vm/*
- vm.extra_free_kbytes VM 被告知在后台回收(kswapd)开始的阈值和直接回收(通过分配进程)的阈值之间保持额外的可用内存。RocketMQ 使用此参数来避免内存分配中的长时间延迟。(取决于内核版本)
- vm.min_free_kbytes 如果将其设置为低于 1024 KB,它会微妙地破坏系统,并且系统在高负载下容易死锁。
- vm.max_map_count 限制进程可以拥有的内存映射区域的最大数量。RocketMQ 将使用 MMAP 加载 CommitLog 和 ConsumeQueue,因此建议将此参数设置为较大的值。
- vm.swappiness 定义内核交换内存页面的积极程度。较高的值会增加积极性,较低的值会减少交换量。建议值为 10,以避免交换延迟。
- 文件描述符限制 RocketMQ 需要为文件(CommitLog 和 ConsumeQueue)和网络连接打开文件描述符。我们建议将文件描述符值设置为 655350。
- 磁盘调度程序 RocketMQ 建议使用 I/O 截止时间调度程序,该调度程序尝试为请求提供保证的延迟。