随着国产化服务器操作系统推广普及,越来越多的企业使用了麒麟操作系统,其上可能运行常用中间件(如东方通、nginx、tomcat等)、国产化数据库(如GaussDB、goldendb、TiDB、达梦等),有无相关的内核优化实践案例?
麒麟os性能优化主要在如下方面:
1. 整体优化
主要是针对硬件和操作系统通用属性调整。
* 硬件部分
鲲鹏平台,在不进行虚拟化场景下,bios中设置关闭smmu;
* 系统部分
关闭irqbalance、numa绑定
2. 分场景优化
* 关系型数据库场景
设置tcp_fin_timeout、tcp_tw_reuse等避免大量close_wait并导致无法新创建连接问题
* es场景
修改dirty ratio和dirty background ratio降低io wait和全局hang发生
* 大数据场景
关闭swap、使用系统自带的jvm、调整磁盘io参数nr_requests等
* 容器云虚拟化场景
关闭swap、设置ip_forward 、tcp_fin_timeout、bridge-nf-call-iptables等
3. 其他未知需优化
* 通过log分析,查阅资料,借助bcc定位等手段动态需求方案
在GaussDB的部署过程中,针对性的对操作系统层面进行如下调优设置,提升系统性能。
1、关闭SELinux,/etc/selinux/config文件中的“SELINUX”值为“disabled”。关闭SELinux可能会解决兼容性问题、简化配置和提高性能。
2、关闭swap交换内存,避免数据库使用交换分区而引起的数据库性能下降。
3、关闭RemoveIPC。当RemoveIPC参数设置为yes时,操作系统会在对应用户退出时删除IPC资源(共享内存和信号量),从而使得数据库服务器使用的IPC资源被清理,引发数据库宕机。
4、升级audit版本,audit进程默认开启,默认版本长期运行后会自动占用大量内存,影响系统使用。
5、系统内核参数调优。GaussDB安装过程中,针对系统内核参数做如下调优设置:
参数名称 | 参数说明 | 推荐取值 |
net.ipv4.tcp_max_tw_buckets | 表示同时保持TIME_WAIT状态的TCP/IP连接最大数量。 | 10000 |
net.ipv4.tcp_tw_reuse | 允许将TIME-WAIT状态的sockets重新用于新的TCP连接。 | 1 |
net.ipv4.tcp_tw_recycle | 表示开启TCP连接中TIME-WAIT状态sockets的快速回收。 | 1 |
net.ipv4.tcp_keepalive_time | 表示当keepalive启用的时候,TCP发送keepalive消息的频度。 | 30 |
net.ipv4.tcp_keepalive_probes | 在认定连接失效之前,发送TCP的keepalive探测包数量。 | 9 |
net.ipv4.tcp_keepalive_intvl | 当探测没有确认时,重新发送探测的频度。 | 30 |
net.ipv4.tcp_retries1 | 在连接建立过程中TCP协议最大重试次数。 | 5 |
net.ipv4.tcp_syn_retries | TCP协议SYN报文最大重试次数。 | 5 |
net.ipv4.tcp_synack_retries | TCP协议SYN应答报文最大重试次数。 | 5 |
net.ipv4.tcp_retries2 | 控制内核向已经建立连接的远程主机重新发送数据的次数。 | 12 |
vm.overcommit_memory | 控制在做内存分配的时候,内核的检查方式。 | 0 |
net.ipv4.tcp_rmem | TCP协议接收端缓冲区的可用内存大小。 | 8192 250000 16777216 |
net.ipv4.tcp_wmem | TCP协议发送端缓冲区的可用内存大小。 | 8192 250000 16777216 |
net.core.wmem_max | socket发送端缓冲区大小的最大值。 | 21299200 |
net.core.rmem_max | socket接收端缓冲区大小的最大值。 | 21299200 |
net.core.wmem_default | socket发送端缓冲区大小的默认值。 | 21299200 |
net.core.rmem_default | socket接收端缓冲区大小的默认值。 | 21299200 |
net.ipv4.ip_local_port_range | 物理机可用临时端口范围。 | 26000-65535 |
kernel.sem | 内核信号量参数设置大小。 | 250 6400000 1000 25600 |
vm.min_free_kbytes | 保证物理内存有足够空闲空间,防止突发性换页。 | 系统总内存的5% |
net.core.somaxconn | 定义了系统中每一个端口最大的监听队列的长度。 | 65535 |
net.ipv4.tcp_syncookies | 启用cookies来处理,可防范少量SYN攻击。 | 1 |
net.core.netdev_max_backlog | 在每个网络接口接收队列的数据包的最大数目。 | 65535 |
net.ipv4.tcp_max_syn_backlog | 记录的那些尚未收到客户端确认信息的连接请求的最大值。 | 65535 |
net.ipv4.tcp_fin_timeout | 系统默认的超时时间。 | 60 |
kernel.shmall | 内核可用的共享内存总量。 | 1152921504606840000 |
kernel.shmmax | 内核参数定义单个共享内存段的最大值。 | 18446744073709500000 |
net.ipv4.tcp_sack | 启用有选择的应答。 | 1 |
net.ipv4.tcp_timestamps | TCP时间戳。 | 1 |
vm.extfrag_threshold | 系统在内存碎片的处理倾向。 | 500 |
MTU | 节点网卡最大传输单元。调整为8192可以提升数据收发的性能。 | 8192 |
尽量保证服务器的用途独立,比如业务服务、中间件和数据库的优化方面是有差异的。
其实一些大厂,针对各个操作系统,会在使用中,不断总结并形成自己的配置规范(又有称基线、母袋),主要解决:
1)统一的部署规范,确保同一版本下配置一致,便于后续的管理、维护;
2)解决生产安全问题,规范涵盖安全要求,如密码强度、漏洞修复等方面的需求;
3)厂内要求的个性化配置,如配合监控等做一些特定的调整等;
提问中提到的常用中间件或国产化数据库,其实在其官网都会有软件部署环境的要求,其中就包括了操作系统参数调优。
目前了解到,GaussDB在调优时,推荐使用4K页块大小(PAGESIZE),在OLTP场景下,读写性能更优,所以如果默认是64K需重新编译4K'内核后,再对内核升级,同时调整页大小会导致swap失效,需重新格式化后挂载。
收起针对麒麟操作系统的内核优化实践案例,以下是一些可能有用的建议:
总之,针对不同的应用场景和硬件平台,需要进行不同的内核优化和中间件优化。企业应该根据自身的需求和实际情况,选择合适的优化方案和工具。