今天给大家分享一个知识点,就是平时我们线上服务器部署的 Java 系统如果发现要是性能不太好,此时应该如何登录到线上服务器,接着用 top 命令去分析线上系统的性能呢?下面我们就来一步一步给大家讲解一下 top 命令的使用技巧。
线上系统是如何运行的?
首先,在讲解 top 命令的使用技巧之前,我们先得给大家铺垫一些基础的知识,就是关于线上系统在服务器上运行的时候,他会需要使用哪些资源,或者换句话说,他会需要使用到服务器的哪些硬件呢?
首当其中的,大家必须知道一个事儿,就是我们线上运行的系统,他的本质其实就是一个 Linux 进程,也就就是 JVM 进程,这个 JVM 进程实际上会开启多个线程,每个线程都会交给 CPU 来运行。
这个 CPU 就是我们很关键的一个硬件,CPU 在运行我们的线程的同时,当然也会运行线程负责执行的那部分代码了。
如下图:
CPU 是如何并发运行多个线程的?
但是单单是这个 CPU 运行多个线程的事儿就有的一说,可能很多人不知道的是,现代服务器都是有多个 CPU 的,或者说一个 CPU 是有多个核的。
所以说,我们要搞清楚,一个 CPU 是有多个 cores 的,所以你的一个 cpu core 并发运行多个线程,以及多个 cpu core 同时运行多个线程,是不太一样的。
这个一个 cpu core 并发运行多个线程,实际上他不是说同时运行多个线程,而是快速的切换运行每一个线程,什么意思呢?
就是说,你这个 cpu core 会先运行一下线程 A,执行一小会儿他的代码,再立刻切换去运行线程 B,运行一小会儿他的代码再快速的切换过去运行线程 C。
他只不过是切换的速度非常快,让你有一种错觉,一个 cpu core 可以同时运行多个线程一样,其实并不是。
如下图:
那如果是有多个 cpu core 呢?这个时候其实每个 cpu core 都可以运行一个线程了,如果你有多个 cpu core 同时运行多个线程,那就是真正的同时了,因为每个 cpu core 都可以自己独立运行一个线程的代码。
如下图:
线程太多会导致什么样的后果?
所以说,很多时候,其实并不是说线程越多越好的,很多兄弟往往对线上系统会犯一个错误,那就是以为让系统同时运行几百几千个线程,就可以高并发的处理请求了。
其实根本不是,如果你要是线程太多了,会导致每个 cpu core 要频繁的切换来切换去的运行 n 多线程。
每次线程切换都是有时间开销的,如果线程太多了,反而会导致每个线程被运行了一小会儿以后,接着要过一段时间才能被再次运行,为什么?因为线程太多了啊,cpu core 要给每个线程都运行一下,雨露均沾。
如下图:
上面这个图就很明显,你一个请求来了,是交给一个线程来处理的,这个线程刚得到 cpu 运行机会,跑了一小会儿没处理完请求呢,人家切换去执行别的线程了,而且还得运行很多别的线程,最后才能切换回来运行你这个线程,那你一个请求运行是不是要等挺久才能跑完的?
所以说,一般我们的经验是,线上业务系统连接 MySQL 数据库的这种情况,往往 4 个 cpu core 的机器,开启 200 个业务线程处理请求,大概每秒处理 1000 左右的线程,就差不多了,因为你要是请求再多,线程再多,4 个 cpu core 就忙不过来了。
经常听说的 CPU 使用率和负载到底是什么?
所以这里给大家再引入一个概念,就是 CPU 使用率和负载,CPU 使用率这个大家很好理解,CPU 使用率越高,就说明 CPU 几乎没闲着,一直在拼命的运转。
负载也是同理,负载越高,说明 CPU 越是繁忙,如果要是 CPU 使用率和负载过于高,尤其是使用率,超过 90% 的时候,往往说明你的系统负载压力就太大了,这个时候你的性能是会下降的。
因为你任何一个请求过来,繁忙的 CPU 要干好多好多事情,他可能留给你这个请求的处理机会就比较少,导致你这个请求就得等待一段时间才能处理完毕,所以系统性能也就必然会下降了。
如下图:
如何通过 top 命令来查看 CPU 使用率和负载?
因此如果线上服务器运行的系统性能不好的时候,往往我们第一步就是可以登录到线上服务器去通过 top 命令看一看当前服务器的 CPU 使用率和负载是不是过高了。
如果过高了,那么说明你当前系统压力过大,CPU 过于繁忙,导致请求过来以后运行的比较慢,性能自然就下来了。
当然,如果你们公司要是有可视化监控系统,直接就可以看到线上服务器的 CPU 负载和使用率,那也是没问题的,接着一起来看看 top 命令吧。
这里我用自己的 mac 电脑执行了 top 命令,会得到如下的截图:
咱们一起来看一看这个 top 命令的输出结果里都有什么,东西很多,但是我们挑选重要的东西来看就行了,刚开始他输出的 Processes 是说当前机器上的进程情况。
这里会有在运行中的进程数量,以及在休眠中的进程,还有你的进程开启的线程总数量,比如我的电脑里有 387 个进程,就 2 个在运行,385 个都是在休眠,一共有 3834 个线程。
接着 Load Avg 和 CPU Usage 是比较重要的,我们可以重点看 CPU Usage 就可以了。
他意思就是说我们的 CPU 使用率,这个使用率一般是应该在最高在 80% 左右,如果到 90% 以上,甚至超过 100%,那就很危险了,像我的电脑负载很低,使用率就 1%~2%,空闲率在 90% 多。
接着 PhysMem 说的是服务器的内存被使用了多少 GB,NetWorks 说的是通过网络输入和输出的数据量,Disks 说的是对磁盘文件写入和读取的数据量有多少,然后下面还有当前运行的主要进程列表,每个进程对 CPU 等资源的消耗都有显示。
好了,今天的知识点就到这里了,重点是给大家讲解了 CPU 对系统性能的影响,以及如何通过 top 命令查看服务器的 CPU 使用率和负载情况。