JVM/OS 配置
本节主要介绍系统(JVM/OS)相关配置。
1. JVM 选项
推荐使用最新版本的 JDK 1.8。为了获得更好的性能,通过设置相同的 Xms 和 Xmx 值来防止 JVM 调整堆大小。生产环境的 JVM 配置如下:
-server -Xms8g -Xmx8g -Xmn4g
当 JVM 默认 8 字节对齐时,建议最大堆内存不要超过 32G,否则会影响 JVM 的指针压缩技术,造成内存浪费。
如果您不关心 RocketMQ Broker 的启动时间,一个更好的选择是“预触”(pre-touch)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 会使用较小的年轻代来达到此目标,这将导致非常频繁的 Minor GC,因此建议滚动 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 deadline 调度器,它试图为请求提供有保证的延迟。