当前位置: 首页 > 科技观察

面试官:如何优化服务器性能?

时间:2023-03-20 23:08:13 科技观察

大家好,我是飘渺。架构优化,界面优化,数据库优化,我听说过很多。今天我们将讨论服务器优化。我们开发的软件服务需要运行在服务器上,所以服务器性能代表了软件性能的上限,所以服务器性能调优是一个很重要的环节,但是大部分同学对服务器性能调优关注的比较少,今天从3部分开始介绍服务器性能调优,即:服务器配置选择、服务器负载分析、服务器内核参数调优。云原生实战系列正在更新中,快进来学习吧~服务器配置选择服务器一般由CPU、内存、磁盘、网卡组成,所以选择服务器配置就是选择CPU核数,内存大小、磁盘大小和类型以及网络带宽。但是服务器配置的选择很难标准化,也就是说很难推导出“一台需要达到1000TPS的后端服务器”应该是什么配置。由于软件的最终运行性能与软件的实现方式密切相关,即使是同一个后端应用程序中的两个界面,也会因为具体功能的不同而表现出不同的性能。因此,服务器配置的选择应根据具体的测试结果。一开始可以选择配置较低的服务器进行调优测试,将服务器的测试结果作为选择服务器的依据。以订单业务为例,经过测试,一台配置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带宽的服务器。当然,最终的服务器配置还需要通过测试来验证。注意:在上述订单界面的例子中,需要后台服务器和数据库服务器一起调试,避免出现后台服务器性能过剩,数据库和其他服务器性能不足的情况。另外,上述选择服务器配置的方法不一定适用于所有场景,请谨慎参考。服务器负载分析在性能调优中,首先要分析服务器负载。一般来说,我们主要分析CPU使用率、内存使用率、磁盘I/O、服务器负载和带宽使用率。CPUusageCPU使用率反映了CPU的繁忙程度。当CPU达到100%时,部分进程会进入等待状态,CPU暂时不会对其进行处理。在实际情况中,为了应对突如其来的请求压力,服务器的CPU占用率一般需要在75%以下。如果某台服务器的CPU占用率多次高于75%,可以考虑增加一台新服务器。监控CPU使用率,推荐大家使用htop工具,可以非常直观的看到CPU使用率、内存使用率、负载等信息。使用htop检查CPU负载。首先,我们需要安装htop。以centos为例,安装命令如下:yuminstallhtop-y安装完成后,我们可以通过htop命令观察CPU负载情况。htop输入htop命令后,我们可以直观的看到CPU负载,这条命令的CPU占用率会以多核为单位显示。操作系统会自动分配多核的负载。当所有核心的CPU使用率超过75%时,可以认为服务器的CPU使用率已经超过75%。cpu负载如上图所示。这是一个4核CPU服务器。截图时,3核CPU使用率超过75%。观察一段时间,发现所有CPU的使用率都在85%左右,说明CPU负载高,需要考虑新增服务器。内存使用情况内存使用情况反映了内存的使用情况。内存用于存储程序代码和数据,一般分为物理内存和虚拟内存,其中物理内存是指服务器的内存,虚拟内存是指硬盘上的一块空间。当物理内存使用率达到100%时,将使用虚拟内存。需要注意的是,虚拟内存的读写速度远低于物理内存。如果程序在虚拟内存中执行,程序的执行效率会变得很低。一般来说,服务器的物理内存应该保持在80%以下,虚拟内存使用率应该保持在0%。仍然可以通过hop工具查看服务器的内存使用情况。上图为服务器内存使用情况:总内存16G,使用了10G左右,内存使用率为62%,可以持续使用。同时关闭Swap虚拟内存。单个进程的内存使用情况显示在下方的MEM%列中。磁盘I/O磁盘I/O是指磁盘读写。在软件系统中,日志、文件操作、数据库操作都会造成磁盘读写压力,尤其是数据库操作。首先会成为系统的瓶颈。对于磁盘监控,我推荐大家使用iostat工具,可以很方便的查看磁盘使用情况。使用iostat查看磁盘I/O。首先,我们需要安装iostat。以centos为例。安装命令如下:yuminstallsysstat-y安装完成后,我们可以通过iostat命令磁盘使用情况。#查看磁盘整体读写状态,1表示每1秒读取一次数据iostat-x1diskIO输入iostat命令后,磁盘整体读写状态如上图所示。磁盘负载主要关注两个指标:%idle,%util%idle:表示除等待磁盘I/O外CPU空闲时间的百分比,这个指标要保证在70%以上%util:这个设备用于I/O操作的百分比时间,这个指标需要保证在70%以下,当达到100%时,就说明满载了。为了降低磁盘负载,可以使用更高性能的磁盘(OSD、PCIE)或者降低磁盘的运行频率(异步写、组合写)。平均负载是指单位时间内平均活跃进程数,是服务器负载指标的一种表示。一般来说,需要保证平均负载的值小于当前服务器的CPU核数。同样,我们也可以使用htop命令来查看平均服务器负载。这里我们主要关注Loadaverage指标。上图中有3个数字,分别代表1分钟、5分钟、15分钟的平均负载。一般来说,服务器的平均负载需要小于当前服务器的CPU核数。为了应对突发情况,服务器的平均负载应该在75%以下,也就是3。很明显,上图中的服务器平均负载超过了75%。考虑提高性能。网络使用情况网络使用情况也是一个需要监控的重要指标。当带宽不足时,请求的响应时间会大大增加。为防止突如其来的并发压力,应保证服务器的带宽使用率在80%以上。这里需要注意的是,物理网卡限制了服务器可以使用的最大带宽。要查看网络使用情况,我推荐使用nload工具。要使用nload查看网络,首先需要安装nload。以centos为例,yuminstallnload-y。安装完成后,我们直接运行nloadnload,输入nload命令。网络使用情况如上图所示。其中,网络使用量分为流入网卡的数据和流出网卡的数据。流入网卡的数据对应下行带宽的网速,流出网卡的数据对应上行带宽的网速。如果“当前网速”持续接近“最大网速”,则表示带宽使用率接近100%。指标说明:Curr:当前网速Avg:平均网速Min:最小网速Max:最大网速Ttl:总流量服务器内核参数调优光有强大的物理性能还不够,还需要调优内核参数,所以以充分体现服务器在高并发压力下的性能。当然,并不是所有的服务器都需要进行高并发性能调优。一般来说,只需要调优需要处理高并发请求的服务器的内核参数即可。常见的有:前端服务器、后端服务器、数据库服务器。服务器有两个常用的调优参数:单个进程的最大打开文件数和TCP相关设置。单个进程最大打开文件数修改单个文件最大打开文件数,只需要编辑/etc/security/limits.conf文件,在文件末尾添加如下四句*softnofile65535*hardnofile65535*softnproc65535*hardnproc65535其中*代表所有用户,65536代表修改后的值,重启后生效。TCP相关设置修改TCP相关参数可以优化TCP高并发通信,编辑/etc/sysctl.conf文件,增加如下内容#防止flood攻击,高并发系统需要关闭此项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(longconnection)启用,TCP发送keepalive报文(检测包)时间间隔(s),默认2小时net.ipv4.tcp_keepalive_time=1200#服务器对外连接的端口范围,影响之间的连接数服务器和其他erversnet.ipv4.ip_local_port_range=102465535#SYN队列的长度,可以容纳更多等待连接的网络连接,默认为1024net.ipv4.tcp_max_syn_backlog=65535#维持TIME_WAIT状态的最大连接数,如果这个值为超过,TIME_WAIT会立即清零,并打印警告信息,默认为180000net。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#Reserved为发送缓冲区保留的内存默认值(字节)net.core.wmem_default=8388608#为发送缓冲区保留的内存最大值(字节)net.core.wmem_max=16777216#避免时间戳异常net.ipv4.tcp_timestamps=0#系统中有多少个TCP套接字与任何用户文件句柄无关。如果超过这个数字,连接将立即重置,并打印一条警告消息。这个限制只是为了防止简单的DoS攻击net.ipv4.tcp_max_orphans=3276800