• 服务器优化


    服务器负载分析

    性能调优时,需要先对服务器负载进行分析,通常而言,我们主要分析
    CPU 使用率内存使用率磁盘 I/O服务器负载和带宽使用情况

    CPU 使用率

    在实际情况下,为了应对一下突发性的请求压力,服务器 CPU 使用率一般需要在 75%以下。如果一
    台服务器的 CPU 使用率多次高于 75%`,这时候就考虑增加新的服务器。

    sudo yum install epel-release -y 
    sudo yum install htop -y
    
    • 1
    • 2

    监控 CPU 使用率我推荐大家使用htop工具,可以非常直观看到 CPU 使用率、内存使用率、及负载等信息
    在这里插入图片描述
    cpu 负载
    如上图所示,这是一个 4 核 CPU 服务器,在截图的时候其中 3 核 CPU 使用率都超过了 75%

    再观察一会发现所有 CPU 的使用率都在 85%左右徘徊,说明 CPU 负载很高了,需要考虑增加新的服务器

    内存使用率

    内存使用率反应的是内存的使用情况

    内存用于存放程序的代码及数据,一般分为物理内存和虚拟内存,其中物理内存指的是服务器的内存,而虚拟内存指的是硬盘的一块空间。

    当物理内存使用率达到 100%时将会使用虚拟内存
    需要注意的是,虚拟内存的读写速度远远低于物理内存,如果程序被放在了虚拟内存执行,那么程序的执行效率会变得很低

    一般而言,服务器的物理内存应该保持在 80%以下,虚拟内存使用率 保持在 0%
    在这里插入图片描述

    内存使用率
    上面显示了服务器的内存使用情况:总内存 16G,使用了10G左右,内存使用率 62%,可以继续使用,同时关闭了 Swap 虚拟内存。

    在下 MEM%栏中显示了单个进程的内存使用率

    磁盘 I/O

    磁盘 I/O 指的是磁盘的读写,在软件系统中,日志、文件操作、数据库操作都会造成磁盘读写压力

    其中又以数据库操作为甚,在高并发情况下往往数据库会首先成为系统的瓶颈

    # 查看磁盘总体读写情况, 1 代表每 1 秒读取一次数据
    iostat -x 1
    
    • 1
    • 2

    磁盘 IO
    输入 iostat 命令后,磁盘总体读写情况如上所示。磁盘负载主要关注 2 个
    指标:%idle,%util

    • %idle:表示 CPU 除去等待磁盘 I/O 以外的空闲时间百分比,这个指标应该要保证在70%以上
    • %util:该设备用于 I/O 操作的时间百分比,这个指标需要保证在 70%以下
      到达100%时表示已经满负载。为了降低磁盘负载,可以采用性能更高的磁盘(OSD,PCIE)或者降低磁盘的操作频率(异步写、合并写

    平均负载

    平均负载指的是单位时间内平均的活跃进程数,是一个表示服务器负载的指标。

    一般情况下需要保证平均负载的值小于当前服务器的 CPU 核数
    在这里插入图片描述
    在这里我们主要关注 Load average 指标,上图有 3 个数字,分别代表 1 分钟, 5 分钟,15 分钟的平均负载

    一般情况下服务器的平均负载需要小于当前服务器的 CPU 核数

    为了应对突发状况,服务器的平均负载应该在 75%即 3 以下,很显然,上图这台服务器平均负载超过了 75%,需要考虑提升性能了

    网络使用情况

    当带宽不足时会 大大增加请求的响应时间

    为了防止突发性并发压力,应该保证服务器的带宽使用率在 80%以上。这里需要注意的是,物理网卡限制了服务器所能使用的最大宽带

    yum install nload -y
    
    • 1

    nload
    在这里插入图片描述

    如果 “当前网速” 持续接近 “最大网速” 时,代表 带宽使用率已经接近 100%

    指标说明:

    • Curr:当前网速
    • Avg:平均网速
    • Min:最小网速
    • Max:最大网速
    • Ttl:总流量

    服务器内核参数调优

    光有强大的物理性能是不够的,还需要对内核参数进行调优,这样才能在高并发压力下充分体现服务器应有的性能

    当然,并不是所有的服务器都需要做高并发性能调优

    一般来说,只需要对要处理高并发请求的服务器进行内核参数调优即可,常见的包括:前端服务器,后端服务器,数据库服务器。服务器常见的调优参数主要有两个:单个进程最大打开文件数TCP 相关设置

    单个进程最大打开文件数

    修改单个 进程 最大打开文件数
    只需要编辑/etc/security/limits.conf 文件,在文件末尾加上以下四句

    * soft nofile 65535
    * hard nofile 65535
    * soft nproc 65535
    * hard nproc 65535
    
    • 1
    • 2
    • 3
    • 4

    其中* 代表所有用户,65536 代表修改的值,重启后生效。

    TCP 相关设置

    修改 TCP 相关参数,可以优化 TCP 高并发通信,编辑 /etc/sysctl.conf 文件,添加以下内容

    # 为防止洪水攻击,高并发系统需要将此项  关闭!!!
    net.ipv4.tcp_syncookies = 0
    # 开启 TCP 连接重用,允许处理 TIME-WAIT 状态的连接重新用于新的 TCP 连接
    net.ipv4.tcp_tw_reuse = 1
    # 开启快速回收 TCP 连接中处于 TIME-WAIT 状态的连接
    net.ipv4.tcp_tw_recycle = 1
    # 修改超时时间( s ),该值表示如果连接由本端关闭,则连接处于 FIN-WAIT-2 状态的时间为
    net.ipv4.tcp_fin_timeout = 30
    # 当 keepalive(长连接)启用的时候,TCP 发送 keepalive 消息(探测包)的时间间隔( s ),默认为 2 个小时
    net.ipv4.tcp_keepalive_time =1200
    # 服务器对外连接的端口范围,影响该服务器与其他服务器的连接数
    net.ipv4.ip_local_port_range =102465535
    # SYN 队列的长度,可以容纳更多等待连接的网络连接数,默认为 1024
    net.ipv4.tcp_max_syn_backlog = 65535
    # 保持 TIME_WAIT 状态连接的最大数量,如果超过此值,TIME_WAIT 将立刻被清除并打印警告信息,默认为 180000
    net.ipv4.tcp_max_tw_buckets =5000
    # 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
    net.core.netdev_max_backlog =65535
    # TCP 最大连接数
    net.core.somaxconn = 65535
    # 预留用于接收缓冲的内存默认值(字节)
    net.core.rmem_default = 8388608
    # 预留用于接收缓冲的内存最大值(字节)
    net.core.rmem_max = 16777216
    # 预留用于发送缓冲的内存默认值(字节)
    net.core.wmem_default = 8388608
    # 预留用于发送缓冲的内存最大值(字节)
    net.core.wmem_maX = 16777216
    # 避免时间戳异常
    net.ipv4.tcp_timestamps = 0
    # 系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,连接将即刻被复位并打印警告信息
    # 这个限制仅仅是为了防止简单的 DoS 攻击
    net.ipv4.tcp_max_orphans =3276800
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
  • 相关阅读:
    沃趣QFusion数据库管理平台-权限管理
    Jekyll 教程——快速上手
    双调旅行商问题
    20221125使用PR2023自动识别obs-studio录屏生成的MKV视频的字幕
    【Java基础】时间日期类之Date类、SimplDateFormat类、Calendar类及二月天案例
    11.2SpringBoot
    nrf52832通过自定义profile实现BLE串口透传功能
    2.FastRunner定时任务Celery+RabbitMQ
    ABP:是否应该在一个应用服务中调用另外一个应用服务?
    检查了600+个代码库,竟有3%代码未能通过单元测试
  • 原文地址:https://blog.csdn.net/qq_30659573/article/details/127990086