• Linux内核参数调优


    一、Linux内核配置文件

    Linux在系统运行时修改内核参数(/proc/sys与/etc/sysctl.conf),而不需要重新引导系统,这个功能是通过/proc虚拟文件系统实现的。

    在/proc/sys目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改, 可以通过更改/proc/sys中内核参数对应的文件达到修改内核参数的目的(修改过后,保存配置文件就马上自动生效),不过重新启动机器后之前修改的参数值会失效,所以只能是一种临时参数变更方案。(适合调试内核参数优化值的时候使用,如果设置值有问题,重启服务器还原原来的设置参数值了,简单方便) 。

    但是如果调试内核参数优化值结束后,需要永久保存参数值,就要通过修改/etc/sysctl.conf内的内核参数来永久保存更改。但只是修改sysctl文件内的参数值,确认保存修改文件后,设定的参数值并不会马上生效,如果想使参数值修改马上生效,并且不重启服务器,可以执行下面的命令:

    # sysctl –p

    下面介绍一下/proc/sys下内核文件与配置文件sysctl.conf中变量的对应关系。

    由于可以修改的内核参数都在/proc/sys目录下,所以sysctl.conf的变量名省略了目录的前面部分(/proc/sys)。

    即将/proc/sys中的文件转换成sysctl中的变量依据下面两个简单的规则:

    1.去掉前面部分/proc/sys

    2.将文件名中的斜杠变为点

    这两条规则可以将/proc/sys中的任一文件名转换成sysctl中的变量名。

    例如:

    1. /proc/sys/net/ipv4/ip_forward =》 net.ipv4.ip_forward
    2. /proc/sys/kernel/hostname =》 kernel.hostname

    可以使用下面命令查询所有可修改的变量名。

    # sysctl –a

    二、linux内核参数

    根据参数文件所处目录不同而进行分表整理

    下列文件所在目录:/proc/sys/net/ipv4/

    名称

    默认值

    建议值

    描述

    tcp_syn_retries

    5

    1

    对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1决定的)

    tcp_synack_retries

    5

    1

    对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。

    tcp_keepalive_time

    7200

    600

    TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。

    防止两边建立连接但不发送数据的攻击。

    tcp_keepalive_probes

    9

    3

    TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效。

    tcp_keepalive_intvl

    75

    15

    探测消息未获得响应时,重发该消息的间隔时间(秒)。默认值为75秒。 (对于普通应用来说,这个值有一些偏大,可以根据需要改小.特别是web类服务器需要改小该值,15是个比较合适的值)

    tcp_retries1

    3

    3

    放弃回应一个TCP连接请求前﹐需要进行多少次重试。RFC规定最低的数值是3

    tcp_retries2

    15

    5

    在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)

    tcp_orphan_retries

    7

    3

    在近端丢弃TCP连接之前﹐要进行多少次重试。默认值是7个﹐相当于 50秒 - 16分钟﹐视 RTO 而定。如果您的系统是负载很大的web服务器﹐那么也许需要降低该值﹐这类 sockets 可能会耗费大量的资源。另外参的考tcp_max_orphans。(事实上做NAT的时候,降低该值也是好处显著的,我本人的网络环境中降低该值为3)

    tcp_fin_timeout

    60

    2

    对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。

    tcp_max_tw_buckets

    180000

    36000

    系统在同时所处理的最大 timewait sockets 数目。如果超过此数的话﹐time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐不过﹐如果网络条件需要比默认值更多﹐则可以提高它(或许还要增加内存)。(事实上做NAT的时候最好可以适当地增加该值)

    tcp_tw_recycle

    0

    1

    打开快速 TIME-WAIT sockets 回收。除非得到技术专家的建议或要求﹐请不要随意修改这个值。(做NAT的时候,建议打开它)

    tcp_tw_reuse

    0

    1

    表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)

    tcp_max_orphans

    8192

    32768

    系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制。如果内存大更应该增加这个值。(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)

    tcp_abort_on_overflow

    0

    0

    当守护进程太忙而不能接受新的连接,就象对方发送reset消息,默认值是false。这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复状态。只有在你确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的使用。(对待已经满载的sendmail,apache这类服务的时候,这个可以很快让客户端终止连接,可以给予服务程序处理已有连接的缓冲机会,所以很多防火墙上推荐打开它)

    tcp_syncookies

    0

    1

    只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。

    tcp_stdurg

    0

    0

    使用 TCP urg pointer 字段中的主机请求解释功能。大部份的主机都使用老旧的 BSD解释,因此如果您在 Linux打开它﹐或会导致不能和它们正确沟通。

    tcp_max_syn_backlog

    1024

    16384

    对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目。对于超过 128Mb 内存的系统﹐默认值是 1024 ﹐低于 128Mb 的则为 128。如果服务器经常出现过载﹐可以尝试增加这个数字。警告﹗假如您将此值设为大于 1024﹐最好修改include/net/tcp.h里面的TCP_SYNQ_HSIZE﹐以保持TCP_SYNQ_HSIZE*16(SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()和Accept() ),是用另一个队列单独存放半打开连接。这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的SYN Flood攻击(事实证明)

    tcp_window_scaling

    1

    1

    该文件表示设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力(RFC 1323)。(对普通地百M网络而言,关闭会降低开销,所以如果不是高速网络,可以考虑设置为0)

    tcp_timestamps

    1

    1

    Timestamps 用在其它一些东西中﹐可以防范那些伪造的sequence 号码。一条1G的宽带线路或许会重遇到带 out-of-line数值的旧sequence 号码(假如它是由于上次产生的)。Timestamp 会让它知道这是个 '旧封包'。(该文件表示是否启用以一种比超时重发更精确的方法(RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。)

    tcp_sack

    1

    1

    使用 Selective ACK﹐它可以用来查找特定的遗失的数据报--- 因此有助于快速恢复状态。该文件表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段)。(对于广域网通信来说这个选项应该启用,但是这会增加对 CPU 的占用。)

    tcp_fack

    1

    1

    打开FACK拥塞避免和快速重传功能。(注意,当tcp_sack设置为0的时候,这个值即使设置为1也无效)[这个是TCP连接靠谱的核心功能]

    tcp_dsack

    1

    1

    允许TCP发送"两个完全相同"的SACK。

    tcp_ecn

    0

    0

    TCP的直接拥塞通告功能。

    tcp_reordering

    3

    6

    TCP流中重排序的数据报最大数量。 (一般有看到推荐把这个数值略微调整大一些,比如5)

    tcp_retrans_collapse

    1

    0

    对于某些有bug的打印机提供针对其bug的兼容性。(一般不需要这个支持,可以关闭它)

    tcp_wmemmindefaultmax

    4096

    16384

    131072

    8192

    131072

    16777216

    发送缓存设置

    min:为TCP socket预留用于发送缓冲的内存最小值。每个tcp socket都可以在建议以后都可以使用它。默认值为4096(4K)。

    default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem_default 值,一般要低于net.core.wmem_default的值。默认值为16384(16K)。

    max: 用于TCP socket发送缓冲的内存最大值。该值不会影响net.core.wmem_max,"静态"选择参数SO_SNDBUF则不受该值影响。默认值为131072(128K)。(对于服务器而言,增加这个参数的值对于发送数据很有帮助,在我的网络环境中,修改为了51200 131072 204800)

    tcp_rmemmindefaultmax

    4096

    87380

    174760

    32768

    131072

    16777216

    接收缓存设置

    同tcp_wmem

    tcp_memmindefaultmax

    根据内存计算

    786432

    1048576 1572864

    low:当TCP使用了低于该值的内存页面数时,TCP不会考虑释放内存。即低于此值没有内存压力。(理想情况下,这个值应与指定给 tcp_wmem 的第 2 个值相匹配 - 这第 2 个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072 * 300 / 4096)。 )

    pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是 TCP 可以使用的总缓冲区大小的最大值 (204800 * 300 / 4096)。 )

    high:允许所有tcp sockets用于排队缓冲数据报的页面量。(如果超过这个值,TCP 连接将被拒绝,这就是为什么不要令其过于保守 (512000 * 300 / 4096) 的原因了。 在这种情况下,提供的价值很大,它能处理很多连接,是所预期的 2.5 倍;或者使现有连接能够传输 2.5 倍的数据。 我的网络里为192000 300000 732000)

    一般情况下这些值是在系统启动时根据系统内存数量计算得到的。

    tcp_app_win

    31

    31

    保留max(window/2^tcp_app_win, mss)数量的窗口由于应用缓冲。当为0时表示不需要缓冲。

    tcp_adv_win_scale

    2

    2

    计算缓冲开销bytes/2^tcp_adv_win_scale(如果tcp_adv_win_scale > 0)或者bytes-bytes/2^(-tcp_adv_win_scale)(如果tcp_adv_win_scale BOOLEAN>0)

    tcp_low_latency

    0

    0

    允许 TCP/IP 栈适应在高吞吐量情况下低延时的情况;这个选项一般情形是的禁用。(但在构建Beowulf 集群的时候,打开它很有帮助)

    tcp_westwood

    0

    0

    启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN通信来说应该启用这个选项。

    tcp_bic

    0

    0

    为快速长距离网络启用 Binary Increase Congestion;这样可以更好地利用以 GB 速度进行操作的链接;对于WAN 通信应该启用这个选项。

    ip_forward

    0

    NAT必须开启IP转发支持,把该值写1

    ip_local_port_range:minmax

    32768

    61000

    1024

    65000

    表示用于向外连接的端口范围,默认比较小,这个范围同样会间接用于NAT表规模。

    ip_conntrack_max

    65535

    65535

    系统支持的最大ipv4连接数,默认65536(事实上这也是理论最大值),同时这个值和你的内存大小有关,如果内存128M,这个值最大8192,1G以上内存这个值都是默认65536

    所处目录/proc/sys/net/ipv4/netfilter/

    文件需要打开防火墙才会存在。

    名称

    默认值

    建议值

    描述

    ip_conntrack_max

    65536

    65536

    系统支持的最大ipv4连接数,默认65536(事实上这也是理论最大值),同时这个值和你的内存大小有关,如果内存128M,这个值最大8192,1G以上内存这个值都是默认65536,这个值受/proc/sys/net/ipv4/ip_conntrack_max限制

    ip_conntrack_tcp_timeout_established

    432000

    180

    已建立的tcp连接的超时时间,默认432000,也就是5天。影响:这个值过大将导致一些可能已经不用的连接常驻于内存中,占用大量链接资源,从而可能导致NAT ip_conntrack: table full的问题。建议:对于NAT负载相对本机的 NAT表大小很紧张的时候,可能需要考虑缩小这个值,以尽早清除连接,保证有可用的连接资源;如果不紧张,不必修改

    ip_conntrack_tcp_timeout_time_wait

    120

    120

    time_wait状态超时时间,超过该时间就清除该连接

    ip_conntrack_tcp_timeout_close_wait

    60

    60

    close_wait状态超时时间,超过该时间就清除该连接

    ip_conntrack_tcp_timeout_fin_wait

    120

    120

    fin_wait状态超时时间,超过该时间就清除该连接

    文件所处目录/proc/sys/net/core/

    名称

    默认值

    建议值

    描述

    netdev_max_backlog
     

    1024

    16384

    每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,对重负载服务器而言,该值需要调高一点。

    somaxconn 
     

    128

    16384

    用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。

    web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。对繁忙的服务器,增加该值有助于网络性能

    wmem_default

    129024

    129024

    默认的发送窗口大小(以字节为单位)

    rmem_default

    129024

    129024

    默认的接收窗口大小(以字节为单位)

    rmem_max

    129024

    873200

    最大的TCP数据接收缓冲

    wmem_max

    129024

    873200

    最大的TCP数据发送缓冲

    三、修改内核参数方法

    1、使用echo value方式直接追加到文件里如echo "1" >/proc/sys/net/ipv4/tcp_syn_retries,但这种方法设备重启后又会恢复为默认值。

    2、把参数添加到/etc/sysctl.conf中,然后执行sysctl -p使参数生效,永久生效。

    四、内核参数优化点

    优化Linux文件打开最大数

    • 为了防止失控的进程破坏系统的性能,UNIX和Linux会跟踪进程使用的大部分资源,并允许用户和系统管理员使用对进程的资源限制,例如控制某个进程打开的文件数、对某个用户打开系统进程数进行限制等,一般限制手段包括软限制和硬限制
      • 软限制(soft limit):内核实际执行的限制,任何进程都可以将软限制设置为任意小于或等于对进程限制的硬限制的值、最大线程数(noproc)和文件数(nofile)
      • 硬限制(hard limit):可以在任何时候任何进程中设置,但硬限制只能由超级用户修改
    • Linux系统一切皆文件,对Linux进行各种操作,实际就是对文件进行操作,文件可分为普通文件、目录文件、链接文件和设备文件.而文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其值是一个非负整数(通常是小正数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符
    • Linux系统默认已经打开的文件描述符包括STDIN_FILENO 0表示标准输入、STDOUT_FILENO 1表示标准输出、STDERR_FILENO 2表示标准错误输出,默认打开一个文件,它的文件描述符为3
    • 每个文件描述符与一个打开文件相对应,不同的文件描述符可以指向同一个文件,相同的文件可以被不同的进程打开,也可以在同一进程中被多次打开
    • Linux系统为每个进程维护了一个文件描述符,该表的值都是从0开始,在不同的进程中用户会看到相同的文件描述符,相同文件描述符有可能指向同一个文件,也可能指向不同的文件.Linux内核对文件操作,维护了3个数据结构概念:
      • 进程级的文件描述符表
      • 系统级的打开文件描述符表
      • 文件系统的i-node表
    • 其中进程级的描述符表的每一条目记录了单个文件描述符的相关信息,例如控制文件描述符操作的一组标志及对打开文件句柄的引用.Linux内核对所有打开的文件都维护了一个系统级的描述符表(open file description table).将描述符表中的记录行称为打开文件句柄(open file handle),一个打开文件句柄存储了一个打开文件相关的全部信息
      • 当前文件偏移量
      • 打开文件时所使用的的状态标识
      • 文件访问模式
      • 与信号驱动相关的设置
      • 对该文件inode对象的引用
      • 文件类型和访问权限
      • 指针指向该文件所持有的锁列表
      • 文件的各种属性
    • 默认Linux内核对每个用户设置了打开文件最大数为1024,对于高并发网站,是远远不够的,需要将默认值调整到更大,方法如下:
      • Linux每个用户打开文件最大数临时设置方法,重启服务器该参数无效
     unlimit -n 65535 

    Linux每个用户打开文件最大数永久设置方法,修改/etc/security/limits.conf,在末尾修改以下内容:

    1. * soft noproc 65535
    2. * hard noproc 65535
    3. * soft nofile 65535
    4. * hard nofile 65535

    上述设置为对每个用户分别设置nofile、noproc最大数,如果需要对Linnx整个系统设置文件最大限制数,需修改/proc/sys/fs/file-max中的值,该值为Linux总文件打开数.例如设置为3865161233。

    内核参数的优化

    • Linux /proc/sys目录下存放着多数内核的参数,并且可以在系统运行时进行更改,一般重新启动机器就会失效.而/etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效
    • /proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系,即修改sysctl.conf配置文件,实际是修改/proc/sys相关参数,所以对Linux内核优化只需修改/etc/sysctl.conf文件即可

    影响服务器性能因素

    • 影响生产环境Linux服务器性能的因素有很多,一般分为两大类,即操作系统层级和应用程序级别.以下为各级别影响性能的具体项及性能评估的标准
    1. 操作系统级别
    • 内存
    • CPU
    • 磁盘I/O
    • 网络I/O带宽
    • 应用程序及软件
    • Nginx
    • MySQL
    • Tomcat
    • PHP
    • Linux系统性能评估表

     五、系统性能评估与分析调优工具

    性能分析工具

    • 常用系统性能分析命令为vmstat、sar、iostat、netstat、free、ps、top、iftop等
    • 常用系统性能组合命令:
      • vmstat、sar、iostat:检测是否是CPU瓶颈
      • free、vmstat:检测是否是内存瓶颈
      • iostat:检测是否是磁盘I/O瓶颈
      • netstat、iftop:检测是否是网络带宽瓶颈

    Linux服务器性能评估与优化

    • Linux服务器性能评估与优化是一项长期的工作,需要随时关注网站服务器的运行状态,及时作出相应的调整
    1. Linux系统整体性能评估
    • uptime命令主要用于查看当前服务器整体性能,例如CPU、负载、内存等值的总览,以下为uptime详解
    1. uptime
    2. 21:51:02 up 13:24, 1 user, load average: 0.00, 0.01, 0.05
    • oad average负载有3个值,分别表示最近1min、5min、15min系统的负载,3个值的大小一般不能大于系统逻辑CPU核数的2倍,例如Linux操作系统有4个逻辑CPU,如果load average的3个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,可以不用担心,一般不会影响系统性能
    • 如果load average的输出装小于CPU逻辑个数的2倍,则表示CPU还有空闲的时间片.基于此参数不能完全确认服务器的性能瓶颈,需要借助其他工具判断

    CPU性能评估

    利用vmstat命令监控CPU,该命令可以显示关于系统各种资源之间相关性能的简要信息,主要用它来查看CPU负载及队列情况。

    1. vmstat
    2. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----
    3. r b swpd free buff cache si so bi bo in cs us sy id wa st
    4. 1 0 0 625548 2148 761888 0 0 7 17 28 74 0 0 100 0 0
    • r:该列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU的个数,说明CPU不足,需要增加CPU。
    • b:该列表示在等待资源的进程数,比如正在等待I/O或者内存交换。
    • us:该列显示了用户进程消耗的CPU时间百分比,us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期大于50%,就需要考虑优化程序或算法。
    • sy:该列显示了内核进程消耗的CPU时间百分比,sy的值较高时,说明内核消耗的CPU资源很多。
    • us+sy:参考值为80%,如果us+sy大于80%说明可能存在CPU资源不足。
    • 利用sar命令监控系统CPU,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。
    1. sar -u 2 10
    2. Linux 3.10.0-957.el7.x86_64 (orange) 03/24/2020 _x86_64_ (1 CPU)
    3. 10:10:42 PM CPU %user %nice %system %iowait %steal %idle
    4. 10:10:44 PM all 0.00 0.00 0.50 0.00 0.00 99.50
    5. 10:10:46 PM all 0.00 0.00 0.00 0.00 0.00 100.00
    6. 10:10:48 PM all 0.00 0.00 0.00 0.00 0.00 100.00
    7. 10:10:50 PM all 0.00 0.00 0.00 0.00 0.00 100.00
    8. 10:10:52 PM all 0.00 0.00 0.00 0.00 0.00 100.00
    9. 10:10:54 PM all 0.00 0.00 0.50 0.00 0.00 99.50
    10. 10:10:56 PM all 0.00 0.00 0.00 0.00 0.00 100.00
    11. 10:10:58 PM all 0.00 0.00 0.00 0.00 0.00 100.00
    12. 10:11:00 PM all 0.50 0.00 2.49 0.00 0.00 97.01
    13. 10:11:02 PM all 0.00 0.00 1.51 0.00 0.00 98.49
    14. Average: all 0.05 0.00 0.50 0.00 0.00 99.45

    输出结果详解:

    %user:该列显示用户进程消耗的CPU时间百分比。
    %nice:该列显示了运行正常进程所消耗的CPU时间百分比。
    %system:该列显示了系统进程消耗的CPU时间百分比。
    %iowait:该列显示了I/O等待所占用的CPU时间百分比。
    %steal:该列显示了CPU处在空闲状态的时间百分比。
    %idle:该列显示了在内存相对紧张的环境下pagein强制对不同页面进行的steal操作。

    内存性能评估

    利用free指令监控内存,free是监控Linux内存使用状况最常用的指令。

    1. free -m
    2. total used free shared buff/cache available
    3. Mem: 1980 624 419 9 936 1163
    4. Swap: 2047 0 2047
    • 一般而言,服务器内存可以通过以下方法判断是否空余
      • 应用程序可用内存/系统物理内存大于70%时,表示系统内存资源非常充足,不影响系统性能
      • 应用程序可用内存/系统物理内存小于20%时,表示系统内存资源紧缺,需要增加系统内存
      • 20%<应用程序可用内存/系统物理内存<70%时,表示系统内存资源基本能满足应用需求,暂时不影响系统性能

    磁盘I/O性能评估

    利用iostat评估磁盘性能,监控磁盘I/O读写及带宽。

    1. iostat -d 1 10
    2. Linux 3.10.0-957.el7.x86_64 (orange) 03/24/2020 _x86_64_ (1 CPU)
    3. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
    4. scd0 0.00 0.11 0.00 5476 0
    5. sda 0.29 7.09 20.92 354986 1046959
    6. dm-0 0.29 6.74 20.84 337211 1042843
    7. dm-1 0.00 0.05 0.00 2460 0
    8. dm-2 0.00 0.10 0.04 5160 2048
    9. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
    10. scd0 0.00 0.00 0.00 0 0
    11. sda 0.00 0.00 0.00 0 0
    12. dm-0 0.00 0.00 0.00 0 0
    13. dm-1 0.00 0.00 0.00 0 0
    14. dm-2 0.00 0.00 0.00 0 0
    15. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
    16. scd0 0.00 0.00 0.00 0 0
    17. sda 0.00 0.00 0.00 0 0
    18. dm-0 0.00 0.00 0.00 0 0
    19. dm-1 0.00 0.00 0.00 0 0
    20. dm-2 0.00 0.00 0.00 0 0
    • iostat输出结果详解:
      • kB_read/s:表示每秒读取的数据块数
      • kB_wrtn/s:表示每秒写入的数据块数
      • kB_read:表示读取的所有块数
      • kB_wrtn:表示写入的所有块数
    • 可以通过kB_read/s和kB_wrtn/s的值对磁盘的读写性能有基本的了解,如果kB_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序,如果kB_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作
    • 利用sar评估磁盘性能,通过sar -d可以对系统的磁盘I/O做基本的统计
    1. sar -d 1 10
    2. Linux 3.10.0-957.el7.x86_64 (orange) 03/24/2020 _x86_64_ (1 CPU)
    3. 10:29:20 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
    4. 10:29:21 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    5. 10:29:21 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    6. 10:29:21 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    7. 10:29:21 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    8. 10:29:21 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    9. 10:29:21 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
    10. 10:29:22 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    11. 10:29:22 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    12. 10:29:22 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    13. 10:29:22 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    14. 10:29:22 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
    • sar输出结果详解
      • await:表示平均每次设备I/O操作的等待时间(以ms为单位)
      • svctm:表示平均每次设备I/O操作的服务时间(以ms为单位)
      • %util:表示1秒内有百分之几的时间用于I/O操作
    • 磁盘I/O性能,评判的标准为正常情况下svctm应该是小于await的值,而svctm的大小和磁盘性能有关,CPU、内存的负荷也会对svctm值造成影响,过多的请求也会间接地导致svctm值的增加
    • await的值大小一般取决于svctm的值和I/O队列长度以及I/O请求模式,如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,此时可通过更换更快的硬盘来解决问题
    • %util项的值也是衡量磁盘I/O的一个重要指标,如果%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷的在工作,该磁盘可能存在瓶颈.长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题

    网络性能评估

    1、通过ping命令检查网络的连通性。

    2、通过netstat -i组合检测网络接口状况。

    3、通过netstat -r组合检测系统的路由表信息。

    4、通过sar -n组合显示系统的网络运行状态通过。

    5、iftop -i ens32可以查看网卡流量。

    1. - iftop -i ens32详细参数:
    2. - <=:客户端流入的流量
    3. - =>:服务端流出的流量
    4. - TX:发送流量
    5. - RX:接收流量
    6. - TOTAL:总流量
    7. - cum:运行iftop到目前时间的总流量
    8. - peak:流量峰值
    9. - rates:分别表示过去2s10s40s的平均流量

    六、生产环境内核参数优化方案

    作为高性能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端口,客户端随机开启了一个端口和服务端发起连接,
    这个参数定义随机端口的范围。默认为32768 61000,建议调整为1025 61000。

    • 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下调整内核参数,可以直接编辑配置文件/etc/sysctl.conf,然后执行sysctl -p命令生效。

     这儿所列参数是生产中常用的参数:

    1. net.ipv4.tcp_syn_retries = 2
    2. net.ipv4.tcp_synack_retries = 2
    3. net.ipv4.tcp_keepalive_time = 600
    4. net.ipv4.tcp_keepalive_probes = 3
    5. net.ipv4.tcp_keepalive_intvl =15
    6. net.ipv4.tcp_retries2 = 5
    7. net.ipv4.tcp_fin_timeout = 6
    8. net.ipv4.tcp_max_tw_buckets = 36000
    9. net.ipv4.tcp_tw_recycle = 1
    10. net.ipv4.tcp_tw_reuse = 1
    11. net.ipv4.tcp_max_orphans = 32768
    12. net.ipv4.tcp_syncookies = 1
    13. net.ipv4.tcp_max_syn_backlog = 16384
    14. net.ipv4.tcp_wmem = 8192 131072 16777216
    15. net.ipv4.tcp_rmem = 32768 131072 16777216
    16. net.ipv4.tcp_mem = 786432 1048576 1572864
    17. net.ipv4.ip_local_port_range = 1024 65000
    18. net.ipv4.ip_conntrack_max = 65536
    19. net.ipv4.netfilter.ip_conntrack_max=65536
    20. net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
    21. net.core.somaxconn = 16384
    22. net.core.netdev_max_backlog = 16384 //30000
  • 相关阅读:
    实验项目5.4 高速缓存(Cache)设计
    轻松一刻|Walrus CLI与CI/CD工具集成,轻松部署2048游戏
    SpringBoot篇之集成Jedis、Lettuce、Redisson
    C++对象模型(8)-- 数据语义学:this指针
    公交查询系统
    14 卡尔曼滤波及代码实现
    小程序如何实现下拉刷新
    C语言数组和指针笔试题(二)(一定要看)
    终身成就奖!中国出了个世界级管理思想家
    Spring - 框架相关内容3(Spring注解式开发)
  • 原文地址:https://blog.csdn.net/qq_35029061/article/details/125917312