我们开发的软件服务需要在服务器上运行,所以服务器性能代表了软件的性能上限,因此服务器性能调优是个十分重要的环节,然而大部分同学对服务器性能调优关注的较少,今天从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,服务器负载和带宽使用情况。
CPU使用率
CPU使用率反应的是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-x1
磁盘IO
输入iostat命令后,磁盘总体读写情况如上所示。磁盘负载主要关注2个指标:%idle,%util
- %idle:表示CPU除去等待磁盘I/O以外的空闲时间百分比,这个指标应该要保证在70%以上
- %util:该设备用于I/O操作的时间百分比,这个指标需要保证在70%以下,当到达100%时表示已经满负载。为了降低磁盘负载,可以采用性能更高的磁盘(OSD,PCIE)或者降低磁盘的操作频率(异步写、合并写)
平均负载
平均负载指的是单位时间内平均的活跃进程数,是一个表示服务器负载的指标。一般情况下需要保证平均负载的值小于当前服务器的CPU核数。
同样的,查看服务器平均负载我们也可以使用htop命令
在这里我们主要关注Load average指标,上图有3个数字,分别代表1分钟,5分钟,15分钟的平均负载。
一般情况下服务器的平均负载需要小于当前服务器的CPU核数,为了应对突发状况,服务器的平均负载应该在75%即3 以下,很显然,上图这台服务器平均负载超过了75%,需要考虑提升性能了。
网络使用情况
网络使用情况也是监控的重要指标。当带宽不足时会大大增加请求的响应时间。为了防止突发性并发压力,应该保证服务器的带宽使用率在80%以上。这里需要注意的是,物理网卡限制了服务器所能使用的最大宽带。
查看网络使用情况我推荐使用nload工具。
使用nload查看网络
首先需要安装nload,以centos为例
yuminstallnload-y
安装完成后我们直接运行nload
nload
输入nload命令后,网络使用情况如上图所示。其中,网络使用情况分为流入网卡的数据与流出网卡的数据。流入网卡的对应下行带宽的网速,流出网卡的数据对应上行带宽的网速。如果 “当前网速” 持续接近 “最大网速” 时,代表带宽使用率已经接近100%。
指标说明:
- Curr:当前网速
- Avg:平均网速
- Min:最小网速
- Max:最大网速
- Ttl:总流量
服务器内核参数调优
光有强大的物理性能是不够的,还需要对内核参数进行调优,这样才能在高并发压力下充分体现服务器应有的性能。当然,并不是所有的服务器都需要做高并发性能调优,一般来说,只需要对要处理高并发请求的服务器进行内核参数调优即可,常见的包括:前端服务器,后端服务器,数据库服务器。
服务器常见的调优参数主要有两个:单个进程最大打开文件数 和 TCP相关设置。
单个进程最大打开文件数
修改单个文件最大打开文件数,只需要编辑/etc/security/limits.conf文件,在文件末尾加上以下四句
*softnofile65535
*hardnofile65535
*softnproc65535
*hardnproc65535
其中* 代表所有用户,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
用户评论
这篇文章太棒了!我一直想学习怎样提高服务器性能,希望能从这篇文章里学到点真经。
有14位网友表示赞同!
服务器性能优化确实是一个重要的课题,尤其是对于网站和应用程序来说。
有17位网友表示赞同!
想知道什么方法对提升服务器性能最有效!
有7位网友表示赞同!
我已经在学习web开发,经常会遇到服务器处理能力问题,这本书应该很值得我一看!
有15位网友表示赞同!
面试官直接问优化的问题,看来竞争真的很激烈啊!
有6位网友表示赞同!
感觉这篇文章的题目很有深度,需要系统地了解服务器运作机制才能回答。
有19位网友表示赞同!
现在很多工作都离不开服务器了,优化服务器性能确实很有必要!
有5位网友表示赞同!
分享一下你对服务器性能优化的经验吧!
有20位网友表示赞同!
希望这篇文章能系统地介绍各种优化方法,而不是随便说几个词。
有15位网友表示赞同!
如果面试官问这个问题,我会先聊聊内存管理、磁盘读写等方面吧。
有18位网友表示赞同!
学习一下服务器性能优化技巧,说不定将来能帮到自己!
有14位网友表示赞同!
不知道这篇文章会介绍什么最新技术?
有14位网友表示赞同!
我经常在处理大文件的时候会遇到服务器性能瓶颈,希望从中找到解决办法。
有14位网友表示赞同!
面试官的问题果然是深入浅出的!需要好好准备才行。
有12位网友表示赞同!
文章应该会有详细的步骤和实例讲解,才能真正帮助我们理解。
有10位网友表示赞同!
想了解一下如何用监控工具来分析服务器性能问题。
有11位网友表示赞同!
分享一下你面试官会问哪些其他技术问题吧!
有9位网友表示赞同!
希望这篇文章能让我知道哪些硬件配置可以提升服务器性能。
有16位网友表示赞同!
文章里的内容应该很实用,适合我们日常工作中遇到的优化问题。
有19位网友表示赞同!
服务器性能优化是一个需要不断学习和探索的领域!
有18位网友表示赞同!