Linux网络内核:优化网络性能的关键(linux网络内核)

作为一款开源的操作系统,Linux由于其高性能、高效稳定性以及安全性等优势,已经在服务器领域得到了广泛的应用。作为日常使用最广泛的服务器操作系统,Linux的网络性能对于许多企业来说显得尤为重要。而要想优化Linux的网络性能,就要对其网络内核进行深入分析和调整。

五台网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联公司于2013年开始到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司

Linux内核网络配置

在Linux系统中,内核网络配置是使用内核命令进行设置和调整的。这些配置文件或命令的含义和功能是非常详细和复杂的,一旦配置不当,就会对整个网络性能产生负面影响。因此,我们在配置Linux内核网络时需要特别注意以下几点:

1. 推荐使用高级网络协议

Linux支持多种网络协议,但是不同的协议具有不同的性能特征。比如TCP协议在网络传输的可靠性方面表现非常出色,但是在处理高并发时的性能却受到了一定的影响。而对于高并发的网络应用来说,选择对性能友好的高级网络协议如UDP则更为合适。

2. 合理调整内核并发参数

内核并发参数对于网络性能影响非常大,可以调整的并发参数包括更大文件描述符、更大进程数、更大线程数等。这些参数默认配置可能不够合理,需要根据实际的应用需求进行调整。建议将这些参数设置到应用和系统的更大值。

3. 网络缓存设置

网络缓存是Linux内核中实现网络性能优化的重要参数。在大型网络应用中,通过调整内核网络缓存大小可以显著提高网络性能。在进行内核网络缓存设置时,需要考虑网络延迟、数据处理能力等因素。

4. TCP连接性能优化

Linux系统默认的TCP连接,可能会使连接成功率降低。可以通过在内核当中改变TCP的基础参数,将巨大的并发TCP连接管理更加协调,避免因为TCP连接数量过大,造成系统性能下降的问题。

性能测试和性能优化

优化网络性能,必须首先得知它的瓶颈在哪里。所以,我们需要对系统的网络性能进行测试。而要想得到比较准确和可靠的测试结果,需要注意以下几点:

1. 测试时间和负载条件

网络性能测试时间及负载条件应该尽可能接近实际应用环境的负载条件,否则测试结果可能会失去准确性,无法反映实际情况。在进行测试时,需要注意选择合适的测试工具,如Iperf、Netperf等。

2. 数据收集和分析

在进行网络性能测试时,需要保证测试数据的可靠性。可以选择将测试数据记录到日志文件中,并在测试结束后进行分析,以找出网络性能出现问题的原因。

对于测试结果的反馈,我们可以着手进行性能优化。性能优化的主要任务是优化系统资源的使用、提高系统吞吐量和降低系统延迟。在进行性能优化时,我们需要掌握一些方法和技巧,例如:

1. 合理选择内核调度算法

内核调度算法是决定系统性能的重要因素之一。Linux内核调度算法包括CFS、O(1)和Deadline等,不同的算法对系统的性能会产生不同的影响。因此,在进行性能优化时,需要根据应用负载情况,合理选择调度算法以实现优化系统性能的目的。

2. 合理配置网络参数

网络参数的配置对于优化系统性能非常重要。以TCP/IP协议为例,可以通过控制拥塞窗口大小、调整滑动窗口、关闭不必要的状态等来优化系统性能。

3. 资源的合理分配

系统内部的不同资源,即CPU、内存、磁盘等,它们的使用分配也会影响系统的性能。在进行性能优化时,需要合理地分配每个资源的使用率,以实现更好的系统性能。

综合来讲,linux网络内核的优化对于优化系统网络性能有着重要的作用。在实际应用中,架构设计师和开发人员需要针对实际应用需求对网络内核进行合理配置和调整,才能最终达到优化网络性能的目的。

相关问题拓展阅读:

  • 一般优化linux的内核,需要优化什么参数

一般优化linux的内核,需要优化什么参数

方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用

netstat命令

去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:

#netstat -n | awk ‘/^tcp/ {++S} END {for(a in S) print a, S}’

这个命令会输出类似下面的结果:

LAST_ACK 16

SYN_RECV 348

ESTABLISHED 70

FIN_WAIT1 229

FIN_WAIT2 30

CLOSING 33

TIME_WAIT 18098

我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

用vim打开

配置文件

:#vim /etc/sysctl.conf

在这个文件中,加入下面的几行内容:

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 30

输入下面的命令,让内核参数生效:#sysctl -p

简单的说明上面的参数的含义:

net.ipv4.tcp_syncookies = 1

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭闹早;

net.ipv4.tcp_fin_timeout

#修改系统默认的 TIMEOUT 时间。

在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。

此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.ip_local_port_range =

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000

#这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。

net.ipv4.tcp_keepalive_time = 1200

#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

net.ipv4.ip_local_port_range =

#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改滚举为10000到65000。(注意:这里不要将更低值设的太低,否则可能会占用掉正常的端口!)

net.ipv4.tcp_max_syn_backlog = 8192

#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 6000

#表示系统同时液备雀保持TIME_WAIT的更大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默 认为180000,改为6000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT

套接字

数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT的更大数量,避免Squid服务器被大量的TIME_WAIT拖死。

内核其他TCP参数说明:

net.ipv4.tcp_max_syn_backlog = 65536

#记录的那些尚未收到客户端确认信息的连接请求的更大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.core.netdev_max_backlog = 32768

#每个网络接口接收

数据包

的速率比内核处理这些包的速率快时,允许送到队列的数据包的更大数目。

net.core.somaxconn = 32768

#web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

net.core.wmem_default =

net.core.rmem_default =

net.core.rmem_max = #更大socket读buffer,可参考的优化值:873200

net.core.wmem_max = #更大socket写buffer,可参考的优化值:873200

net.ipv4.tcp_timestps = 0

#时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

net.ipv4.tcp_synack_retries = 2

#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓

三次握手

中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries = 2

#在内核放弃建立连接之前发送SYN包的数量。

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

# 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。

net.ipv4.tcp_wmem =73200

# TCP写buffer,可参考的优化值:73200

net.ipv4.tcp_rmem =873200

# TCP读buffer,可参考的优化值:873200

net.ipv4.tcp_mem =

# 同样有3个值,意思是:

net.ipv4.tcp_mem:低于此值,TCP没有内存压力。

net.ipv4.tcp_mem:在此值下,进入内存压力阶段。

net.ipv4.tcp_mem:高于此值,TCP拒绝分配socket。

上述内存单位是页,而不是字节。可参考的优化值是:

net.ipv4.tcp_max_orphans =

#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。

如果超过这个数字,连接将即刻被复位并打印出警告信息。

这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,

更应该增加这个值(如果增加了内存之后)。

net.ipv4.tcp_fin_timeout = 30

#如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外

当机

。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的

WEB服务器

,也有因为大量的死套接字而

内存溢出

的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

深入学习linux看下《linux就该这么学》

Sysctl命令及linux内核参数调整

一、Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现。

命令格式:

sysctl -w variable=value

sysctl -p (default /etc/sysctl.conf)

sysctl –a

常用参数的意义:

-w  临时改变某个指定参数的值,如

# sysctl -w net.ipv4.ip_forward=1

-a  显示所有的系统参数

-p从指定的文件加载系统参数,默认从/etc/sysctl.conf 文件中加载,如:

# echo 1 > /proc/sys/net/ipv4/ip_forward

# sysctl -w net.ipv4.ip_forward=1

以上两种方法都可能立即开启路由功能,但前祥如果系统重启,或执行了

# service network restart

命令,所设置的值即会丢失,如果想永久保留配置,可以修改/etc/sysctl.conf文件,将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1

二、linux内核参数调整:linux 内核参数调整有两种方式

方法一:修改/proc下内核参数文件内容,不能使用编辑器来修改内核参数文件,理由是由于内核随时可能更改这些文件中的任意一个,另外,这些内核参数文件都是虚拟文件,实际中不存在,因此不能使用编辑器进行编辑,而是使用echo命令,然后从

命令行

将输出重定向至 /proc 下所选定的咐搏文件中。如:将 timeout_timewait 参数设置为30秒:

# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

参数修改后立即生效,但是重启系统后,该参数又恢复成默认值。因此,想永久更改内核参数,需要修改/etc/sysctl.conf文件

方法二.修改衡悔祥/etc/sysctl.conf文件。检查sysctl.conf文件,如果已经包含需要修改的参数,则修改该参数的值,如果没有需要修改的参数,在sysctl.conf文件中添加参数。如:

net.ipv4.tcp_fin_timeout=30

保存退出后,可以重启机器使参数生效,如果想使参数马上生效,也可以执行如下命令:

# sysctl  -p

三、sysctl.conf 文件中参数设置及说明

proc/sys/net/core/wmem_max

更大socket写buffer,可参考的优化值:873200

/proc/sys/net/core/rmem_max

更大socket读buffer,可参考的优化值:873200

/proc/sys/net/ipv4/tcp_wmem

TCP写buffer,可参考的优化值:73200

/proc/sys/net/ipv4/tcp_rmem

TCP读buffer,可参考的优化值:873200

/proc/sys/net/ipv4/tcp_mem

同样有3个值,意思是:

net.ipv4.tcp_mem:低于此值,TCP没有内存压力.

net.ipv4.tcp_mem:在此值下,进入内存压力阶段.

net.ipv4.tcp_mem:高于此值,TCP拒绝分配socket.

上述内存单位是页,而不是字节.可参考的优化值是:

/proc/sys/net/core/netdev_max_backlog

进入包的更大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000

/proc/sys/net/core/somaxconn

listen()的默认参数,挂起请求的更大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.可调整到256.

/proc/sys/net/core/optmem_max

socket buffer的更大初始化值,默认10K

/proc/sys/net/ipv4/tcp_max_syn_backlog

进入SYN包的更大请求队列.默认1024.对重负载服务器,可调整到2023

/proc/sys/net/ipv4/tcp_retries2

TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,尽早释放内核资源.

/proc/sys/net/ipv4/tcp_keepalive_time

/proc/sys/net/ipv4/tcp_keepalive_intvl

/proc/sys/net/ipv4/tcp_keepalive_probes

这3个参数与TCP KeepAlive有关.默认值是:

tcp_keepalive_time = 7200 seconds (2 hours)

tcp_keepalive_probes = 9

tcp_keepalive_intvl = 75 seconds

意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可调整到:

/proc/sys/net/ipv4/tcp_keepalive_time 1800

/proc/sys/net/ipv4/tcp_keepalive_intvl 30

/proc/sys/net/ipv4/tcp_keepalive_probes 3

/proc/sys/net/ipv4/ip_local_port_range

指定端口范围的一个配置,默认是,已够大.

net.ipv4.tcp_syncookies = 1

表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1

表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1

表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout = 30

表示如果

套接字

由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_keepalive_time = 1200

表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

net.ipv4.ip_local_port_range =

表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.tcp_max_syn_backlog = 8192

表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 5000

表示系统同时保持TIME_WAIT套接字的更大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为,改为 5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的更大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

Linux上的NAT与iptables

谈起Linux上的NAT,大多数人会跟你提到iptables。原因是因为iptables是目前在linux上实现NAT的一个非常好的接口。它通过和内核级直接操作网络包,效率和稳定性都非常高。这里简单列举一些NAT相关的iptables实例命令,可能对于大多数实现有多帮助。

这里说明一下,为了节省篇幅,这里把准备工作的命令略去了,仅仅列出核心步骤命令,所以如果你单单执行这些没有实现功能的话,很可能由于准备工作没有做好。如果你对整个命令细节感兴趣的话,可以直接访问我的《如何让你的Linux网关更强大》系列文章,其中对于各个脚本有详细的说明和描述。

# 案例1:实现网关的MASQUERADE

# 具体功能:内网网卡是eth1,

外网

eth0,使得内网指定本服务做网关可以访问外网

EXTERNAL=”eth0″

INTERNAL=”eth1″

# 这一步开启ip转发支持,这是NAT实现的前提

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -o $EXTERNAL -j MASQUERADE

# 案例2:实现网关的简单端口映射

# 具体功能:实现外网通过访问网关的外部ip:80,可以直接达到访问私有网络内的一台主机192.168.1.10:80效果

LOCAL_EX_IP=11.22.33.44 #设定网关的外网卡ip,对于多ip情况,参考《如何让你的Linux网关更强大》系列文章

LOCAL_IN_IP=192.168.1.1  #设定网关的内网卡ip

INTERNAL=”eth1″ #设定内网卡

# 这一步开启ip转发支持,这是NAT实现的前提

echo 1 > /proc/sys/net/ipv4/ip_forward

# 加载需要的ip模块,下面两个是ftp相关的模块,如果有其他特殊需求,也需要加进来

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

# 这一步实现目标地址指向网关外部ip:80的访问都吧目标地址改成192.168.1.10:80

iptables -t nat -A PREROUTING -d $LOCAL_EX_IP -p tcp –dport 80 -j DNAT –to 192.168.1.10

# 这一步实现把目标地址指向192.168.1.10:80的

数据包

的源地址改成网关自己的本地ip,这里是192.168.1.1

iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp –dport 80 -j SNAT –to $LOCAL_IN_IP

# 在FORWARD链上添加到192.168.1.10:80的允许,否则不能实现转发

iptables -A FORWARD -o $INTERNAL -d 192.168.1.10 -p tcp –dport 80 -j ACCEPT

# 通过上面重要的三句话之后,实现的效果是,通过网关的外网ip:80访问,全部转发到内网的192.168.1.10:

80端口

,实现典型的端口映射

# 特别注意,所有被转发过的数据都是源地址是网关

内网ip

的数据包,所以192.168.1.10上看到的所有访问都好像是网关发过来的一样,而看不到外部ip

# 一个重要的思想:数据包根据“从哪里来,回哪里去”的策略来走,所以不必担心回头数据的问题

# 现在还有一个问题,网关自己访问自己的外网ip:80,是不会被NAT到192.168.1.10的,这不是一个严重的问题,但让人很不爽,解决的方法如下:

iptables -t nat -A OUTPUT -d $LOCAL_EX_IP -p tcp –dport 80 -j DNAT –to 192.168.1.10

获取系统中的NAT信息和诊断错误

了解/proc目录的意义

在Linux系统中,/proc是一个特殊的目录,proc

文件系统

是一个伪文件系统,它只存在内存当中,而不占用

外存

空间。它包含当前系统的一些参数(variables)和状态(status)情况。它以文件系统的方式为访问系统内核数据的操作提供接口

通过/proc可以了解到系统当前的一些重要信息,包括磁盘使用情况,内存使用状况,硬件信息,网络使用情况等等,很多系统监控工具(如HotSaNIC)都通过/proc目录获取系统数据。

另一方面通过直接操作/proc中的参数可以实现系统内核参数的调节,比如是否允许ip转发,syn-cookie是否打开,tcp超时时间等。

获得参数的方式:

之一种:cat /proc/xxx/xxx,如 cat /proc/sys/net/ipv4/conf/all/rp_filter

第二种:sysctl sysctl net.ipv4.conf.all.rp_filter

改变参数的方式:

之一种:echo value > /proc/xxx/xxx,如 echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter

第二种:sysctl variable=value,如 sysctl net.ipv4.conf.all.rp_filter=1

以上设定系统参数的方式只对当前系统有效,重起系统就没了,想要保存下来,需要写入/etc/sysctl.conf文件中

通过执行 man 5 proc可以获得一些关于proc目录的介绍

查看系统中的NAT情况

和NAT相关的系统变量

/proc/slabinfo:内核缓存使用情况统计信息(Kernel slab allocator statistics)

/proc/sys/net/ipv4/ip_conntrack_max:系统支持的更大ipv4连接数,默认65536(事实上这也是理论更大值)

/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 已建立的tcp连接的超时时间,默认432023,也就是5天

和NAT相关的状态值

/proc/net/ip_conntrack:当前的前被跟踪的连接状况,nat翻译表就在这里体现(对于一个网关为主要功能的Linux主机,里面大部分信息是NAT翻译表)

/proc/sys/net/ipv4/ip_local_port_range:本地开放端口范围,这个范围同样会间接限制NAT表规模

# 1. 查看当前系统支持的更大连接数

cat /proc/sys/net/ipv4/ip_conntrack_max

# 值:默认65536,同时这个值和你的内存大小有关,如果内存128M,这个值更大8192,1G以上内存这个值都是默认65536

# 影响:这个值决定了你作为NAT网关的工作能力上限,所有局域网内通过这台网关对外的连接都将占用一个连接,如果这个值太低,将会影响吞吐量

# 2. 查看tcp连接超时时间

cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established

# 值:默认432023(秒),也就是5天

# 影响:这个值过大将导致一些可能已经不用的连接常驻于内存中,占用大量链接资源,从而可能导致NAT ip_conntrack: table full的问题

# 建议:对于NAT负载相对本机的 NAT表大小很紧张的时候,可能需要考虑缩小这个值,以尽早清除连接,保证有可用的连接资源;如果不紧张,不必修改

# 3. 查看NAT表使用情况(判断NAT表资源是否紧张)

# 执行下面的命令可以查看你的网关中NAT表情况

cat /proc/net/ip_conntrack

# 4. 查看本地开放端口的范围

cat /proc/sys/net/ipv4/ip_local_port_range

# 返回两个值,最小值和更大值

# 下面的命令帮你明确一下NAT表的规模

wc -l /proc/net/ip_conntrack

#或者

grep ip_conntrack /proc/slabinfo | grep -v expect | awk ‘{print $1 ‘,’ $2;}’

# 下面的命令帮你明确可用的NAT表项,如果这个值比较大,那就说明NAT表资源不紧张

grep ip_conntrack /proc/slabinfo | grep -v expect | awk ‘{print $1 ‘,’ $3;}’

# 下面的命令帮你统计NAT表中占用端口最多的几个ip,很有可能这些家伙再做一些bt的事情,嗯bt的事情:-)

cat /proc/net/ip_conntrack | cut -d ‘ ‘ -f 10 | cut -d ‘=’ -f 2 | sort | uniq -c | sort -nr | head -n 10

# 上面这个命令有点瑕疵cut -d’ ‘ -f10会因为命令输出有些行缺项而造成统计偏差,下面给出一个正确的写法:

cat /proc/net/ip_conntrack | perl -pe s/^\(.*?\)src/src/g | cut -d ‘ ‘ -f1 | cut -d ‘=’ -f2 | sort | uniq -c | sort -nr | head -n 10

作为高性能WEB服务器,只调整Nginx本身的参数是不行的,因为Nginx服务依赖于高性能的操作系统。

以下为常见的几个Linux内核参数优化方法。

net.ipv4.tcp_max_tw_buckets

对于tcp连接,服务端和客户端通信完后状态变为timewait,假如某台服务器非常忙,连接数特别多的话,那么这个timewait数量就会越来越大。

毕竟它也是会占用一定的资源,所以应该有一个更大值,当超过这个值,系统就会删除最早的纳档连接,这样始终保持在一个数量级。

这个数值就是由net.ipv4.tcp_max_tw_buckets这个参数来决定的。

CentOS7系统,你可以使用sysctl -a |grep tw_buckets来查看它的值,默认为32768,

你可以适当把它调低,比如调整到8000,毕竟这个状态的连接太多也是会消耗资源的。

但你不要把它调到几十、几百这样,因为这种状态的tcp连接也是有用的,

如果同样的客户端再次和服务端通信洞携乱,就不用再次建立新的连接了,用这个旧的通道,省时省力。

net.ipv4.tcp_tw_recycle = 1

该参隐纤数的作用是快速回收timewait状态的连接。上面虽然提到系统会自动删除掉timewait状态的连接,但如果把这样的连接重新利用起来岂不是更好。

所以该参数设置为1就可以让timewait状态的连接快速回收,它需要和下面的参数配合一起使用。

net.ipv4.tcp_tw_reuse = 1

该参数设置为1,将timewait状态的连接重新用于新的TCP连接,要结合上面的参数一起使用。

net.ipv4.tcp_syncookies = 1

tcp三次握手中,客户端向服务端发起syn请求,服务端收到后,也会向客户端发起syn请求同时连带ack确认,

假如客户端发送请求后直接断开和服务端的连接,不接收服务端发起的这个请求,服务端会重试多次,

这个重试的过程会持续一段时间(通常高于30s),当这种状态的连接数量非常大时,服务器会消耗很大的资源,从而造成瘫痪,

正常的连接进不来,这种恶意的半连接行为其实叫做syn flood攻击。

设置为1,是开启SYN Cookies,开启后可以避免发生上述的syn flood攻击。

开启该参数后,服务端接收客户端的ack后,再向客户端发送ack+syn之前会要求client在短时间内回应一个序号,

如果客户端不能提供序号或者提供的序号不对则认为该客户端不合法,于是不会发ack+syn给客户端,更涉及不到重试。

net.ipv4.tcp_max_syn_backlog

该参数定义系统能接受的更大半连接状态的tcp连接数。客户端向服务端发送了syn包,服务端收到后,会记录一下,

该参数决定最多能记录几个这样的连接。在CentOS7,默认是256,当有syn flood攻击时,这个数值太小则很容易导致服务器瘫痪,

实际上此时服务器并没有消耗太多资源(cpu、内存等),所以可以适当调大它,比如调整到30000。

net.ipv4.tcp_syn_retries

该参数适用于客户端,它定义发起syn的更大重试次数,默认为6,建议改为2。

net.ipv4.tcp_synack_retries

该参数适用于服务端,它定义发起syn+ack的更大重试次数,默认为5,建议改为2,可以适当预防syn flood攻击。

net.ipv4.ip_local_port_range

该参数定义端口范围,系统默认保留端口为1024及以下,以上部分为自定义端口。这个参数适用于客户端,

当客户端和服务端建立连接时,比如说访问服务端的80端口,客户端随机开启了一个端口和服务端发起连接,

这个参数定义随机端口的范围。默认为,建议调整为。

net.ipv4.tcp_fin_timeout

tcp连接的状态中,客户端上有一个是FIN-WAIT-2状态,它是状态变迁为timewait前一个状态。

该参数定义不属于任何进程的该连接状态的超时时间,默认值为60,建议调整为6。

net.ipv4.tcp_keepalive_time

tcp连接状态里,有一个是established状态,只有在这个状态下,客户端和服务端才能通信。正常情况下,当通信完毕,

客户端或服务端会告诉对方要关闭连接,此时状态就会变为timewait,如果客户端没有告诉服务端,

并且服务端也没有告诉客户端关闭的话(例如,客户端那边断网了),此时需要该参数来判定。

比如客户端已经断网了,但服务端上本次连接的状态依然是established,服务端为了确认客户端是否断网,

就需要每隔一段时间去发一个探测包去确认一下看看对方是否在线。这个时间就由该参数决定。它的默认值为7200秒,建议设置为30秒。

net.ipv4.tcp_keepalive_intvl

该参数和上面的参数是一起的,服务端在规定时间内发起了探测,查看客户端是否在线,如果客户端并没有确认,

此时服务端还不能认定为对方不在线,而是要尝试多次。该参数定义重新发送探测的时间,即之一次发现对方有问题后,过多久再次发起探测。

默认值为75秒,可以改为3秒。

net.ipv4.tcp_keepalive_probes

第10和第11个参数规定了何时发起探测和探测失败后再过多久再发起探测,但并没有定义一共探测几次才算结束。

该参数定义发起探测的包的数量。默认为9,建议设置2。

设置和范例

linux网络内核的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux网络内核,Linux网络内核:优化网络性能的关键,一般优化linux的内核,需要优化什么参数的信息别忘了在本站进行查找喔。

创新互联服务器托管拥有成都T3+级标准机房资源,具备完善的安防设施、三线及BGP网络接入带宽达10T,机柜接入千兆交换机,能够有效保证服务器托管业务安全、可靠、稳定、高效运行;创新互联专注于成都服务器托管租用十余年,得到成都等地区行业客户的一致认可。

文章标题:Linux网络内核:优化网络性能的关键(linux网络内核)
URL标题:http://www.gawzjz.com/qtweb2/news7/26057.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联