Linux系统性能优化思路和工具

1. 概述

有人觉得现如今硬件的性能越来越强,在系统和软件上深度优化的必要性是否存在。硬件性能确实是越来却强,我不知道摩尔定律目前是否失效,但是总会有失效的一天。因此,是否有必要也因人因公司而异,系统优化的目的是更高效地使用CPU和内存等硬件资源,最终还是为了省钱。因此,如果你们公司想省钱,可能是有必要对服务器系统进行优化的。

具体一点,我们只谈论Linux系统的性能优化思路,目前大多服务器也是安装Linux系统的。系统优化从哪里着手呢?我们一般分为以下几个步骤:

1.理解什么是系统性能,系统性能指标有哪些;

2.哪些性能分析工具可以查找到指标里包含的数据;

3.定位到性能问题后,如何进行优化;

2. 系统性能指标

系统性能指标主要包括:

CPU负载:可以粗略理解为一个CPU上等待运行的进程数;

CPU使用率:CPU非空闲时间占总时间的比例;

内存使用率:内存使用数和总内存大小的比例;

磁盘/网络吞吐量:读写的速率、中断次数、等待次数等;

知道要找到这些指标数据之后,我们就开始找相应的分析工具了。

3. 系统性能分析工具

关于性能分析,有一本电子书,叫《Linux performance analysis》,里面列出了各种指标对应的分析工具,并且附有每个工具如何使用的例子。但是后来我又发现网上有一张更全的图,包含更多的分析工具,因此,我直接把这张图贴到这里来,从这张图中,你可以看到贯穿整个系统的分析工具以及一个完整系统包含的层次,比如包括应用层、系统库、系统调用接口、虚拟文件系统、socket、文件系统、TCP/IP、卷管理、驱动程序、磁盘/网络控制器、磁盘/网卡等。我们上一节提到的性能指标数据,都可以从下面这个图中找到相应的工具去获取,具体我就不多说,只能帮您到这里了。如果这些工具不会使用,使用man命令查看使用帮助,看不懂帮助的,网上搜索怎么使用也是可以的,但我建议你多看man帮助,这样习惯了以后更容易看懂其它工具的帮助文档,而不需要去网上搜使用方法。

4. 系统性能优化思路

4.1 CPU负载

对于CPU负载率高的情况,我们可以知道是系统中活跃的进程数比较多,一般是每个CPU都有好多个进程在等待着使用,就会出现负载高的状况。CPU负载可以使用top、uptime命令查看,能分别看到一分钟前、五分钟前、十五分钟前的CPU负载率。那么我们是不是降低系统进程数就能降低CPU负载率呢?答案是不尽然。降低进程数当然是可以稍微降低CPU负载率,但真正引起负载率高的不一定是进程数多的原因,还有可能是因为某个进程进行IO等待的时间比较长,导致其它进程抢占不到CPU,从而出现负载率高的状况。这个时候,我们需要分析具体引起CPU负载高的特定进程,然后找出该进程引起高CPU负载率高的原因,再对症下药才能解决问题。因此,在优化这项指标之前,关键的一步是我们要找出引发问题的根本原因。

4.2 CPU使用率

我们可以使用top命令查看每个进程的CPU使用率,一目了然。CPU使用率高,一般来说是进程用户层代码进行计算的时间比较长。当然如果非要深入的话,也可能是系统内核部分耗费了比较多的时间,还有可能是IO等待时间长,也可能是软硬中断次数过于频繁或者中断处理程序的执行时间过长。但是后面说的这几个原因是属于系统内核层的,如果是内核代码出现问题,也往往是因为用户层代码不合理的调用引起的,所以我们还是要分析用户程序的问题,而倾向于相信系统内核层是没有多大问题的。

我们可以使用strace、perf等工具跟踪系统调用,找出耗费时间比较长的系统接口,然后可以知道用户程序代码哪里调用了这些系统接口,进行针对性的优化。如果用户层不是我们自己写的第三方代码,那么可能需要去了解哪些配置引起第三方程序这样的行为,再进行针对性的优化。

4.3 内存使用率

系统的内存使用情况,可以使用free命令查看,输出如下图:

可以看到系统总物理内存数、已使用数、剩余数、共享数、缓存数、可用数、交换分区大小和使用数、剩余数。这是整个系统的内存使用情况,比如上面的输出结果中,使用到了交换分区,也就是位于磁盘上的虚拟内存。然后可以使用top命令查看具体的进程使用的内存百分比。对Linux系统,可以进行大页设置、刷缓存、更改交换分区设置等系统级的调整,但一般来说,除非你非常清楚自己在干嘛,否则不建议自己去调整这些参数,而对自己的应用程序,则需要多考虑内存优化。

4.4 磁盘/网络IO

磁盘/网络相关的,可调整的东西太多了,比如光TCP相关就有很多可配置项,最大传输单元MTU大小也是可设置的,还有网卡模式、网卡缓冲区大小、文件系统缓存等等。假设这些设置已经没有问题了,系统的磁盘/网络IO还是有性能问题,那就要考虑应用程序的性能问题了。对于应用程序引起的性能问题,解决的思路一般也就是优化算法、使用分治策略减少大循环、同步改异步等。以我的经验来看的话,程序员遇到不可理喻的问题而怪罪操作系统的时候,99%的情况下其实还是自己程序的问题。因此建议开发人员多花心思在如何编写高效、可读、可维护的代码上,然后再考虑系统的性能优化问题。

5. 总结

这篇文章没有写得特别详细,一方面是时间问题,另一方面也是自己水平经验所限,而我想做的就是提供一些解决问题的思路和工具,有这些东西作指导,当我们遇到具体的系统性能问题时,不至于手足无措,可以按照这样的思路去找出问题所在,解决掉具体的问题。

微信扫码,进入【技术人成长】社群逛逛。