大家好,欢迎来到停止重构的频道。
本期,我们介绍一下Linux内核参数调优和负载分析。
如果不做Linux内核参数调优的话,那么4核8G和16核32G服务器的性能可能并没有多大区别。
那么为什么要做负载分析呢? 因为服务器配置的选择是很难标准化的 ,很难推断出“一台需要达到1000RPS”的服务器配置是什么样的,最终运行的性能与代码的编写方式、数据结构、数据量是紧密相关的。
因此服务器配置的选择往往是基于具体的测试结果,而负载分析就是客观地分析 CPU核数是多了、还是少了 内存是否足够, 网络带宽是否足够等问题。
内核参数调优和了解负载分析,是对软件服务调优的前提,我们按照以下顺序介绍 :
内核参数调优
服务器负载分析
内核参数调优
首先是内核参数调优,光有强大的物理性能 而不做内核参数调优的话, 那么服务器的性能是发挥不出来的。
内核参数调优一般调整两部分:
最大文件数
TCP相关设置
最大文件数的设置会影响系统最多可以打开的文件数, Ubuntu20.04的话可参考图中配置,一般统一设置为最大值65535即可。
这里的文件数不单单是文档 ,它还包含线程、TCP连接等等。如果不设置的话 ,那么服务器是无法启动1000个线程, 或者打开1000个TCP连接的。
TCP相关设置会影响高并发网络通信的性能,Ubuntu20.04的话可参考图中配置,虽然在低压力下性能影响不大,但是在高压力下,诸如通道复用、TCP最大通道数等配置就会很大程度上影响性能。
无论服务器的具体配置如何, 内核参数调优我们是习惯统一设置成最大值的 ,一是为了简化内核参数调优 。二是没有必要根据具体硬件配置设置 ,因为之后我们会进行软件服务的调优, 在软件服务调优的时候根据具体硬件配置即可。
当然,一些公有云的服务器是已经做好内核参数调优的, 但是最好在服务调优之前检查一下,不然往往再怎么调整软件服务配置,性能也上不去。
接下来是服务器负载分析 ,在前面《性能测试》时提到, 最终的测试报告是由两部分组成的,其中一个就是服务器负载情况。
服务器负载分析一般就是分析 CPU、内存、网络带宽使用率、磁盘I/O情况等。 当然,如果使用其他硬件如GPU等,也需要对其进行负载分析。
CPU使用率反映的是CPU的忙碌情况 ,CPU使用率可以用htop观察 ,如果CPU使用率接近或超过100%时,就会出现明显的卡顿 所以在性能调优时 ,最好把CPU使用率控制在80%以下。
除了CPU使用率 ,还需要观察CPU平均负载,平均负载指单位时间内平均活跃的进程数,一般情况下平均负载的值应该低于当前服务器的CPU核数。
内存使用率反映的是内存的使用情况,内存使用率可以使用htop或free观察 ,内存使用率是可以接近100%的,但最好保持在80%以下,虚拟内存最好保持在0% ,因为虚拟内存实际上是磁盘空间, 虚拟内存的性能是远不如内存的 。
当然,也不要关闭虚拟内存, 因为虚拟内存可以作为突发情况时的内存空间 ,聊胜于无。
磁盘I/O情况也就是磁盘的繁忙程度,这是很容易忽略的, 因为网站系统中,日志、文件操作、数据库操作都会对磁盘造成读写压力。 如果磁盘存在性能瓶颈的话 ,再怎么增加内存CPU都是没用的。
磁盘情况可以使用iostat或iotop观察,同样磁盘也不能100%负载,为了降低磁盘压力,可以使用更高性能的磁盘或者异步写入文件。当然,也可以通过tmpfs挂载一部分内存作为磁盘空间以提高性能。
网络带宽使用情况也是很容易忽略的指标, 网络带宽使用情况可以使用nload观察 ,网络带宽使用率最好在80%以下 。当然,带宽实际上是有上行带宽和下行带宽之分的 也就是图中的Incoming和outgoing ,这两个带宽一般需要单独分析 因为它们的值一般是不相等的。
以数据库为例 ,接收到的SQL请求是占用下行带宽的, 返回数据是占用上行带宽的。另外,内网并不是带宽无上限的 ,不要因为是内网环境就忽略网络带宽的观察。
如果是云环境,一般是提供相关的负载信息的。但在性能调优时,最好通过以上工具观察物理资源使用情况。
内核参数调优和负载分析是很容易被忽略的 ,如果忽略了这两项, 则没有调优的方向, 胡乱地选择硬件配置 ,就好像买衣服胡乱选择尺码一样。