0x00 前言

作为一个程序猿,无论我们将来想要往哪个方向攀登,如果没有好的基础知识是会很吃力的,所以打下良好的基础必不可少。在我看来,从事 IT 行业的技术工种,有以下基础知识是刚需:

  • 编程
  • 算法
  • 计算机原理
  • 计算机网络

根据冯诺依曼计算机结构体系,计算机就是一个输入输出的设备,我们输入待处理的数据,经由计算机处理后得到我们想要的结果。那么说白了作为程序员我们就是通过各种手段操控这个设备,自然而然的,想要把这个机器玩的很溜是需要了解这个机器的原理的,所以我们需要学习计算机原理。

在了解了计算机的原理后,我们如何去操作他呢,当然是通过编程的手段了,这里我说的编程是广义上的编程,不要以为只有写段 C 的代码才是编程,命令行输入指令就不是编程了,命令其实也是编程,因为他们两者最终都是翻译成机器指令由计算机来执行。

同样地,这台机器他的性能是有限的,我们只知道怎么通过编程操作它远远不够,我们需要学一些骚操作来提升效率和速度,那么我们就需要学算法了。说白了,就好像两个工人操作一个机器,其中一个工人会搞一些很溜的操作,让这个机器的效率更高,执行速度更快,还能搞一些高阶玩法,如果这个工厂只能留下一个人,你觉得最终会留下谁呢?

在有了上面这三类基础知识后,我们对于单台机器的操作可以说是入门了,但是我们现在身处的世界是万物互联的世界,计算机需要与计算机之间进行协作,那么就需要学习计算机网络。

而我最近出于工作原因,一直在学习 Linux 的性能优化。Linux 性能优化的范围涉及非常广,从软件到硬件、从编程到网络都有涉及到,有很多的基础知识,而对于很广的知识,我觉得需要一条线来串联起来,才能形成一个体系的知识结构。所以我会把在这过程中学到的知识,加上平时工作中的实践,提炼成博客写出来。

0x01 详解

A. 平均负载

首先分析 CPU 的性能问题,当我们发现有 CPU 的性能问题,第一时间是干什么呢?当然是查看整体的 CPU 使用情况,当查看 CPU 的整体情况后,然后再分析到底是哪种情况导致 CPU 的负载很高,最后找到导致 CPU 负载升高的罪魁祸首。那么我们接下来就按照这个步骤来分析。

1. 查看整体的 CPU 使用情况

常用的查看 CPU 的平均负载的命令有很多,如 uptime,top 等都可以查看。首先解释下什么是平均负载,总的来说平均负载可以理解为平均一段时间内 runnable 和 non-interruptable 进程的数量。

这里我们用 uptime 命令执行得到的结果如下:

@ubuntu ➜ ~  uptime
 12:25:11 up 88 days, 19:37,  7 users,  load average: 0.24, 0.24, 0.23

分别是最近 1 min,5 min,15 min 的平均负载的情况,从这里我们可以看出最近系统的负载情况,从而可以对整体 CPU 的使用情况有一个大概的判断。

平均负载的详细介绍可以看: Understanding the Load Average on Linux and Other Unix-like Systems

2. 哪些进程会导致平均负载的升高呢

一般有如下场景:

  1. CPU 密集型
  2. I/O 密集型
  3. 大量进程

3. 如何判断是哪个进程导致平均负载很大呢

可以使用如下工具:

  1. pidstat

  2. mpstat
    查看 %user 可以判断是不是 CPU 密集型, %iowait 判断是否是 I/O 密集型, %wait 判断的则是大量进程切换型。

0x02 总结

本篇主要介绍了如何查看 CPU 的使用情况,和判断流程,流程为以下步骤:

  1. 通过查看平均负载来查看的 CPU 的总体使用情况
  2. 通过使用 pidstat, mpstat 来判断 CPU 负载很高是哪种情况
  3. 最后可以通过上述工具找到相关的导致 CPU 使用升高的进程。