RocketMQ 集群进行OS参数的调整

1、vm.overcommit_memory

  • 填写值:
  • 0:表示内核将检查是否有足够的可用内存供应用进程使用;
  • 如果内存足够的话就分配内存给你
  • 如果感觉剩余内存不足,就拒绝你的申请,导致你申请内存失败,进而导致中间件系统异常出错。
  • 1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
  • 把所有可用的物理内存都允许分配给你,只要有内存就给你来用,这样可以避免申请内 存失败的问题。
  • 2:表示内核允许分配超过所有物理内存和交换空间总和的内存
  • 设置指令
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf

2、vm.max_map_count(系统可以开启的线程数量)

  • 参数过小,有的时候可能会导致有些中间件无法开启足够的线程,进而导致报错,甚至中间件系统挂掉
  • 默认值是65536,建议可以把这个参数调大10倍,比如655360这样的值,保证中间件可以开启足够多的线程。
  • 设置指令
echo 'vm.max_map_count=655360' >> /etc/sysctl.conf

3、vm.swappiness

  • 控制进程的swap行为

swap区域: 理解为睡眠区,在这里不会占用内存

就是os会把一部分磁盘空间作为swap区域,然后如果有的进程现在可能不是太活跃,就会被操作系统把进程调整为睡眠状态,把进程中的数据放入磁盘上的swap区域,然后让这个进程把原来占用的内存空间腾出来,交给其他活跃运行的进程来使用。

  • 如果这个参数的值设置为 0,就是尽量不把任何一个进程放到磁盘swap区域去,尽量都使用物理内存。
  • 如果这个参数的值是 100,那么意思就是尽量放到磁盘swap区域去,内存腾出来给活跃的进程使用。
  • 默认这个参数的值是 60,有点偏高,可能会导致我们的中间件运行不活跃的时候被迫腾出内存空间然后放磁盘swap区域去。

因此通常在生产环境建议把这个参数调整小一些,比如设置为10,尽量用物理内存,别放磁盘swap区域去。

  • 设置指令
echo 'vm.swappiness=10' >> /etc/sysctl.conf

4、ulimit
控制linux上最大文件连接数,默认为1024,但这对于我们来说这肯定是不够的(这时会报错:error: too many open files)。因为我们在大量频繁的读写磁盘文件的时候,或者是进行网络通信的时候多和这参数有关。

  • 设置指令
echo 'ulimit -n 1000000' >> /etc/profile

5、总结
其实大家综合思考一下这几个参数,会发现到最后要调整的东西,无非都是跟磁盘文件IO、网络通信、内存管理、线程数量有关系的 ,因为我们的中间件系统在运行的时候无非就是跟这些打交道。

  • 中间件系统肯定要开启大量的线程(跟vm.max_map_count有关)
  • 而且要进行大量的网络通信和磁盘IO(跟ulimit有关)
  • 然后大量的使用内存(跟vm.swappiness和vm.overcommit_memory有关) RocketMQ 集群进行JVM参数的调整