Linux系统内核参数优化
程序员文章站
2023-02-07 08:10:27
Linux系统内核参数优化 在工作中,平常我们使用官方镜像安装的Linux系统(非自定制化的)系统内核考虑的是最通用的场景,通常设定都偏向稳定保守,比较典型的代表如红帽系列的RHEL、CentOS等。而在正式的生成环境使用中,服务器的CPU、内存等硬件配置都比较高,而安装系统时默认的系统内核参数设定 ......
linux系统内核参数优化
在工作中,平常我们使用官方镜像安装的linux系统(非自定制化的)系统内核考虑的是最通用的场景,通常设定都偏向稳定保守,比较典型的代表如红帽系列的rhel、centos等。而在正式的生成环境使用中,服务器的cpu、内存等硬件配置都比较高,而安装系统时默认的系统内核参数设定并不符合用于支持高并发访问的业务服务器,因此我们需要根据实际的业务特性来对系统的默认内核参数设定加以优化,以便能充分发挥服务器的硬件计算处理能力,提高资源利用率的同时也给企业节省it设备资源成本。
以centos为例,可以通过vim /etc/sysctl.conf 文件来更改内核参数,可使用sysctl -p命令立即生效。
linux系统常用的内核参数及定义总结如下:
以下内核参数配置仅供参考,具体使用应当根据业务环境特性及服务器硬件配置来设置合理的值。
net.ipv4.ip_nonlocal_bind = 1 #允许非本地ip地址socket监听,当主机作为网关、反向代理或负载均衡器实现双机热备高可用时,主机需要绑定监听虚拟vip地址时,必须开启此项。 net.ipv4.ip_forward = 1 #开启ipv4转发。当服务器作为路由网关、反向代理与负载均衡(开启客户端ip透传时)必须开启。 net.ipv4.tcp_timestamps = 1 #开启tcp时间戳,以一种比重发超时更精确的方法(请参阅 rfc 1323)来启用对 rtt 的计算;为了实现更好的性能应该启用这个选项。默认为0不启用。 fs.file-max = 6553560 #系统所有进程一共可以打开的文件数量,即系统当前最大的文件句柄数,属于系统级别的限制,默认值大小通常与系统物理内存有关。注意:ulimit的open file值(默认1024)是单个进程可以打开的最大文件数,在高并发业务下,这个2个值都需要进行调整。 net.ipv4.tcp_tw_reuse = 1 #默认为0不启用,设置为1启用tcp复用,表示允许将time_wait状态的socket重新用于新的tcp链接,这对于高并发的服务器来说意义重大,因为总有大量time_wait状态的链接存在。 net.ipv4.tcp_tw_recycle = 1 #默认为0表示关闭,为1时表示开启tcp连接中time-wait sockets的快速回收,用于大量time_out场景。 net.ipv4.tcp_keepalive_time = 600 #当keepalive启用时,tcp发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无效链接。 net.ipv4.tcp_keepalive_probes = 3 #当keepalive启用时,如果对方不予应答,探测包的发送次数。 net.ipv4.tcp_keepalive_intvl = 15 #当keepalive启用时,keepalive探测包的发送间隔,单位为秒。 net.ipv4.tcp_fin_timeout = 30 #当服务器主动关闭链接时,socket保持在fin_wait_2状态的最长时间,单位为秒。 net.ipv4.tcp_syn_retries = 1 #在内核放弃建立连接之前发送syn包的数量 net.ipv4.tcp_syncookies = 1 #与性能无关,用于解决tcp的syn攻击。1表示开启tcp syn cookies。当出现syn等待队列溢出时,启用cookies来处理,可防范少量syn攻击,默认为0,表示关闭。 net.ipv4.icmp_echo_ignore_broadcasts = 1 #忽略icmp ping广播包,避免放大攻击。 net.ipv4.icmp_ignore_bogus_error_responses = 1 #开启恶意icmp错误消息保护 net.inet.udp.checksum=1 #防止不正确的udp包的攻击 net.ipv4.conf.default.accept_source_route = 0 #是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。在充当网关的linux主机上缺省值应为1,在一般的linux主机上缺省值应为0。从安全性角度出发,建议关闭该功能。 net.ipv4.tcp_slow_start_after_idle = 0 #关闭tcp的连接传输的慢启动,即先休止一段时间,再初始化拥塞窗口。 net.ipv4.route.gc_timeout = 100 #路由缓存刷新频率,当一个路由失败后多长时间跳到另一个路由,默认是300秒。 net.ipv4.tcp_max_tw_buckets = 5000 #表示操作系统允许保持time_wait套接字数量的最大值,如超过此值,time_wait套接字将立刻被清除并打印警告信息,默认为8000,过多的time_wait套接字会使服务器响应变慢。 net.ipv4.ip_local_port_range = 1024 65000 #定义udp和tcp链接的本地端口的取值范围。 net.ipv4.tcp_rmem = 10240 87380 12582912 #定义了tcp接受socket请求缓存的内存最小值、默认值、最大值。 net.ipv4.tcp_wmem = 10240 87380 12582912 #定义tcp发送缓存的最小值、默认值、最大值。该值为自动调优定义每个 socket 使用的内存。 #第一个值是为 socket 的发送缓冲区分配的最少字节数。 #第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。 #第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。 net.core.netdev_max_backlog = 8096 #当网卡接收数据包的速度大于内核处理速度时,会有一个缓冲队列保存这些数据包。这个参数表示该列队的最大值。 net.core.somaxconn=262114 #选项默认值是128,表示socket监听的backlog(监听队列)上限。这个参数用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。 net.core.optmem_max = 10000000 #该参数指定了每个套接字所允许的最大缓冲区的大小(以字节为单位) net.core.rmem_default = 6291456 #表示内核接收套接字缓冲区默认大小(以字节为单位)。该参数定义了默认的发送窗口大小,对于更大的 bdp 来说,这个大小也应该更大。 net.core.wmem_default = 6291456 #表示内核发送套接字缓冲区默认大小(以字节为单位) net.core.rmem_max = 12582912 #表示内核接收套接字缓冲区最大大小(以字节为单位)。该参数定义了默认的发送窗口大小,对于更大的 bdp 来说,这个大小也应该更大。 net.core.wmem_max = 12582912 #表示内核发送套接字缓冲区最大大小(以字节为单位) net.ipv4.tcp_mem #确定 tcp 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4kb)。 #第一个值是内存使用的下限。 #第二个值是内存压力模式开始对缓冲区使用应用压力的上限。 #第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 bdp 可以增大这些值(其单位是内存页,而不是字节)。 net.ipv4.tcp_max_syn_backlog = 8192 #这个参数表示tcp三次握手建立阶段接受syn请求列队的较大长度,默认1024,将其设置的大一些可使出现服务器程序繁忙来不及accept新连接时,可以容纳更多等待连接的网络连接数,linux不至于丢失客户端发起的链接请求。 net.ipv4.tcp_max_orphans=262114 #选项用于设定系统中最多有多少个tcp套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的dos攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值。 net.ipv4.netfilter.ip_conntrack_max=204800 #设置系统开始iptables防火墙对tcp连接进行状态跟踪的最大队列长度限制,超过此限定值,将会发生数据表溢出丢弃,对于高并发业务通常也可以使用iptables的raw表设置免跟踪处理。 net.ipv4.conf.all.rp_filter = 1 #用于控制系统是否开启对数据包源地址的校验,1为严谨模式 (推荐),0为松散模式。默认为1开启。 net.ipv4.conf.default.rp_filter = 1 #用于控制系统是否开启对数据包源地址的校验,1为严谨模式 (推荐),0为松散模式。默认为1开启。 net.ipv4.tcp_congestion_control = cubic #tcp拥塞控制算法,centos7默认设置是cubic。linux内核中提供了若干套tcp拥塞控制算法,已加载进内核的可以通过内核参数net.ipv4.tcp_available_congestion_control看到:sudo sysctl net.ipv4.tcp_available_congestion_control 没有加载进内核的一般是编译成了模块,可以用modprobe加载。这些算法各自适用于不同的环境。reno是最基本的拥塞控制算法,也是tcp协议的实验原型。bic适用于rtt较高但丢包极为罕见的情况,比如北美和欧洲之间的线路,这是2.6.8到2.6.18之间的linux内核的默认算法。cubic是修改版的bic,适用环境比bic广泛一点,它是2.6.19之后的linux内核的默认算法。hybla适用于高延时、高丢包率的网络,比如卫星链路——同样适用于中美之间的链路。多人实验表明,tcp拥塞控制算法对tcp传输速率的影响可很大。修改tcp拥塞控制算法需要修改内核参数net.ipv4.tcp_congestion_control=xxx net.ipv4.tcp_window_scaling = 0 #关闭tcp_window_scaling,启用 rfc 1323 定义的 window scaling;要支持超过64kb的窗口,必须启用该值。 net.ipv4.tcp_ecn = 0 #关闭tcp的直接拥塞通告(tcp_ecn) net.ipv4.tcp_sack = 1 #关闭tcp_sack,启用有选择的应答(selective acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段),(对于广域网通信来说)这个选项应该启用,但是这会增加对cpu的占用。