• Linux服务器线上优化


    一、服务器配置选择

    1、介绍

    服务器一般是由CPU、内存、磁盘和网卡组成,因此选择服务器配置就是选择CPU核数、内存大小、磁盘大小及类型、网络带宽。

    但是,服务器配置的选择是很难标准化的,也就是说很难推断出"一台需要达到1000TPS的后端服务器"的配置应该是什么样的。因为软件的最终运行性能与软件的实现方式是紧密相关的,即使是同一个后端应用程序中的两个接口,由于具体功能的差别,性能也会有所差别。因此,服务器配置的选择应该基于具体的测试结果。一开始可以选用配置较低的服务器做调优和测试,并以该服务器的测试结果作为选择服务器的依据

    2、配置选择举例

    以一个订单业务为例,经过测试后,一台配置为4核 CPU 、16GB内存、10Mbps带宽、50GB机械磁盘的服务器的测试结果为:支持50并发量和300TPS吞吐量(增大并发量后会出现超时报错)。而在压力测试过程中, CPU 的使用率接近75%,内存使用率在 50%以下,带宽使用率在50%以下,除去日志以外无磁盘操作。

    因此可以认为,一台配置为4核 CPU ( CPU 使用率需要在75%以下)、8GB内存(内存使用率可以接近100%)、 5Mbps 带宽(带宽使用率可以接近100%)的服务器,可以满足订单接口支持50并发量、300TPS吞吐量的压力。如果需要达到200并发数、2400TPS吞吐量的目标的话,则需要8台配置为4核 CPU 、8GB内存、5Mbps带宽的服务器,或者1台配置为32核 CPU 、64GB内存、40Mbps带宽的服务器。当然,最终的服务器配置还是需要通过测试来验证

    注意:在以上订单接口的例子中,后端服务器和数据库等服务器需要一起调试,避免后端服务器性能过剩,而数据库等服务器性能不足的情况发生。另外,以上选择服务器配置的方法不一定适用于所有场景,请斟酌参考。

    二、服务器负载分析

    1、介绍

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

    2、CPU使用率

    CPU使用率反应的是CPU的忙碌情况。当CPU达到100%时,部分进程会进入等待状态,CPU暂时不会对其进行处理。在实际情况下,为了应对一下突发性的请求压力,服务器CPU使用率一般需要在75%以下。如果一台服务器的CPU使用率多次高于75%,这时候就考虑增加新的服务器。

    3、内存使用率

    内存使用率反应的是内存的使用情况。内存用于存放程序的代码及数据,一般分为物理内存和虚拟内存,其中物理内存指的是服务器的内存,而虚拟内存指的是硬盘的一块空间。当物理内存使用率达到100%时将会使用虚拟内存。需要注意的是,虚拟内存的读写速度远远低于物理内存,如果程序被放在了虚拟内存执行,那么程序的执行效率会变得很低。一般而言,服务器的物理内存应该保持在80%以下,虚拟内存使用率保持在0%

    4、平均负载

    平均负载指的是单位时间内平均的活跃进程数,是一个表示服务器负载的指标。一般情况下需要保证平均负载的值小于当前服务器的CPU核数。一般情况下服务器的平均负载需要小于当前服务器的CPU核数,为了应对突发状况,**服务器的平均负载应该在cpu核心数*75%**以下。监控里三个数分别代表1分钟,5分钟,15分钟的平均负载

    以上几种可以使用htop明显的观察

    # Centos安装
    yum install htop -y
    #ubuntu安装
    sudo apt install htop
    # 启动
    htop
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5、iostat查看磁盘I/O

    磁盘I/O指的是磁盘的读写,在软件系统中,日志、文件操作、数据库操作都会造成磁盘读写压力,其中又以数据库操作为甚,在高并发情况下往往数据库会首先成为系统的瓶颈。磁盘监控可以使用iostat工具,可以很方便查看磁盘的使用情况

    # 安装
    yum install sysstat -y
    sudo apt install sysstat 
    # 查看磁盘总体读写情况, 1代表每1秒读取一次数据
    iostat -x 1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    • %idle:表示CPU除去等待磁盘I/O以外的空闲时间百分比,这个指标应该要保证在70%以上

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

    6、网络使用情况

    网络使用情况也是监控的重要指标。当带宽不足时会大大增加请求的响应时间。为了防止突发性并发压力,应该保证服务器的带宽使用率在80%以上。这里需要注意的是,物理网卡限制了服务器所能使用的最大宽带。查看网络使用情况推荐使用nload工具

    # 下载
    yum install nload -y
    sudo apt install nload
    #运行
    nload
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输入nload命令后,网络使用情况分为流入网卡的数据与流出网卡的数据。流入网卡的对应下行带宽的网速,流出网卡的数据对应上行带宽的网速。如果 “当前网速” 持续接近 “最大网速” 时,代表带宽使用率已经接近100%。

    指标说明:

    • Curr:当前网速

    • Avg:平均网速

    • Min:最小网速

    • Max:最大网速

    • Ttl:总流量

    三、服务器内核参数调优

    1、介绍

    光有强大的物理性能是不够的,还需要对内核参数进行调优,这样才能在高并发压力下充分体现服务器应有的性能。当然,并不是所有的服务器都需要做高并发性能调优,一般来说,只需要对要处理高并发请求的服务器进行内核参数调优即可,常见的包括:前端服务器,后端服务器,数据库服务器。

    服务器常见的调优参数主要有两个:单个进程最大打开文件数 和 TCP相关设置

    2、单个进程最大打开文件数

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

    # 其中* 代表所有用户,65536代表修改的值,重启后生效
    * soft  nofile  65535
    * hard  nofile  65535
    * soft  nproc  65535
    * hard  nproc  65535
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    参考文章:

    https://mp.weixin.qq.com/s/AyEb4fDsTvvfOG1Lgb1bzw

  • 相关阅读:
    docker安装常用软件
    基于ABP实现DDD--领域逻辑和应用逻辑
    MySQL事务隔离级别
    【uni-app】常用组件和 API
    Hugging News #0717: 开源大模型榜单更新、音频 Transformers 课程完成发布!
    vue父组件调用子组件的方法 或传递值给子组件
    Mock数据
    Redis实战案例及问题分析之redis解决商户缓存以及相应缓存问题解决方案(穿透、雪崩、击穿)
    GO语言集成开发工具环境JetBrains GoLand 2022
    MySQL 高级(进阶) SQL 语句 (一)
  • 原文地址:https://blog.csdn.net/lemon_TT/article/details/126063436