中间件机器操作系统内核优化
1、内核分配策略:参数overcommit_memory
echo "1" > /proc/sys/vm/overcommit_memory
vm.overcommit_memory
|
含义
|
---|---|
0 | 表示内核将检查是否有足够的可用内存。如果有足够的可用内存,内存申请通过,否则内存申请失败,并把错误返回给应用进程 |
1 | 表示内核允许超量使用内存直到用完为止 |
2 | 表示内核决不过量的(“never overcommit”)使用内存,即系统整个内存地址空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数同样支持修改 |
2、swap分配策略swappiness,强制关闭系统swap
swapniess
|
策略
|
---|---|
0 | Linux3.5以及以上:宁愿OOM killer也不用swap Linux3.4以及更早:宁愿swap也不要OOM killer |
1 | Linux3.5以及以上:宁愿swap也不要OOM killer |
60 | 默认值 |
100 | 操作系统会主动地使用swap |
3、Transparent Huge Pages
echo never > /sys/kernel/mm/transparent_hugepage/enabled
Redis建议修改Transparent Huge Pages (THP)的相关配置,Linux kernel在2.6.38内核增加了Transparent Huge Pages (THP)特性 ,支持大内存页(2MB)分配,默认开启。当开启时可以降低fork子进程的速度,
但fork之后,每个内存页从原来4KB变为2MB,会大幅增加重写期间父进程内存消耗。同时每次写命令引起的复制内存页单位放大了512倍,会拖慢写操作的执行时间,导致大量写操作慢查询。例如简单的
incr命令也会出现在慢查询中。因此Redis日志中建议将此特性进行禁用,禁用方法如下:
Elasticsearch:
1、swap分配策略swappiness,强制关闭系统swap
swapniess
|
策略
|
---|---|
0 | Linux3.5以及以上:宁愿OOM killer也不用swap Linux3.4以及更早:宁愿swap也不要OOM killer |
1 | Linux3.5以及以上:宁愿swap也不要OOM killer |
60 | 默认值 |
100 | 操作系统会主动地使用swap |
2、定义了每个端口最大的监听队列的长度 vm.max_map_count = 65535
3、限制一个进程可以拥有的VMA(虚拟内存区域)的数量 vm.max_map_count=262144
4、设置 Linux 内核分配的文件句柄的最大数量 fs.file-max=518144
5、设置具体用户可用的文件描述符数量
6、设置锁定内存,拒绝swapping
vim /etc/sysctl.conf
vim /etc/security/limits.conf
7、VM锁住内存,不让JVM写入swapping,避免降低ES的性能 bootstrap.mlockall: true
8、设置各部分所占用的缓存比例,默认是没有限制的,很可能会撑爆 JVM 堆空间(设置 fielddata 会影响搜索性
indices.fielddata.cache.size: 40%
indices.cache.filter.size: 30%
indices.cache.filter.terms.size: 1024mb
9、线程池的设置, size 默认是 处理器核数的 5 倍
threadpool.search.type: cached
threadpool.search.size: 100
threadpool.search.queue_size: 2000
RocketMQ:
1、swap分配策略swappiness,强制关闭系统swap
swapniess
|
策略
|
---|---|
swapniess
|
策略
|
0 | Linux3.5以及以上:宁愿OOM killer也不用swap Linux3.4以及更早:宁愿swap也不要OOM killer |
1 | Linux3.5以及以上:宁愿swap也不要OOM killer |
60 | 默认值 |
100 | 操作系统会主动地使用swap |
2、设置系统预留最小内存
sudo sysctl -w vm.min_free_kbytes=1000000
设置系统需要保留的最小内存大小。当系统内存小于该数值时,则不再进行内存分配。这个命令默认被注释掉,根据文档看,如果设置了不恰当的值,比如比实际内存大,则系统可能直接就会崩溃掉。实际数值应该根据RocketMQ部署机器的内存进行计算,经验数值大概是机器内存的5% - 10%。
这个数值设置的过高,则内存浪费。若设置的过低,那么在内存消耗将近时,RocketMQ的Page Cache写入操作可能会很慢,导致服务不可用。
3、设置 Linux 内核分配的文件句柄的最大数量 fs.file-max=518144
4、设置具体用户可用的文件描述符数量