OS内核参数的调整
1.vm.overcommit_memory
“vm.overcommit_memory” 这个参数有三个值可以选择: 0、1、2。
如果值为0,中间件系统申请内存的时候,os内核会检查可用内存是否足够,如果足够的话就分配内存;如果剩余内存不够,就会拒绝申请,导致申请内存失败,进而导致中间件系统异常出错。
一般该参数设置成1,意思是把所有可用的物理内存都允许分配给你,只要有内存就给你用,这样可以避免申请内存失败的问题。
修改指令是: echo ‘vm.overcommit_memory=1’ >> /etc/sysctl.conf
2.vm.max_map_count
这个参数的值会影响中间件系统可以开启的线程数量,比较重要。
如果参数值过小,可能导致会中间件无法开启足够的线程,进而导致报错,甚至中间件启动失败。
默认值是65536,但有时候会不够,在大数据场景中会有更多的要求(如Kafka在生产中的大量集群部署时)。
一般建议是该参数调大10倍,即 655360,保证中间件开启足够多的线程。
修改指令是: echo ‘vm.max_map_count=655360’ >> /etc/sysctl.conf
3.vm.swappiness
这个参数是用来控制进程的swap行为的,简单来说就是os会把一部分的磁盘空间作为swap区域,如果有的进程不太活跃,就会被操作系统把该进程的状态调整为睡眠状态,把进程中的数据放入磁盘的swap区域,然后让这个进程把原来占用的内存空间腾出来,给其他活跃运行的进程使用。
如果这个参数设置为0,意思是尽量别把任何一个进程放到磁盘的swap区域中,尽量都使用物理内存。
如果这个参数设置为0,意思是尽量把一些进程给放到磁盘的swap区域中,内存腾出来给活跃的进程使用。
该参数默认是60,一般来说有点偏高,可能会导致中间件运行不活跃的时候被迫腾出内存空间,然后放到磁盘的swap区域中。因此通常在生产环境会把该参数调小一些,比如设置成10,尽量使用物理内存,别放到磁盘swap区域中。
修改指令是: echo ‘vm.swappiness=10’ >> /etc/sysctl.conf
4.ulimt
该参数是用来控制linux上最大文件链接数的,默认值可能是1024,通常是不够的,在进行大量的频繁读写磁盘文件的时候,或者是在进行网络通信的时候,都会跟这个参数有关。(压测时不修改该参数经常会遇到问题)
该参数引起的常见的错误是: error:too many open files。
修改指令是: echo ‘ulimit -n 1024000’ >> /etc/profile
5.优化思路
一般优化的调整的方向都是与磁盘文件IO、网络通信、内存管理、线程数量有关。
中间件系统需要开启大量的线程 (跟vm.max_map_count有关)
进行大量的网络通信和磁盘IO(跟ulimit有关)
大量使用内存(跟vm.swappiness和vm.overcommit_memory有关)。
所以对于OS内核参数的调整,往往是调整与系统运行最相关的部分。