目录
- 线上系统是如何运行的
- CPU是如何并发运行多个线程的?
- 线程太多会导致什么样的后果?
- 经常听说的CPU使用率和负载到底是什么?
- 如何通过top命令来查看CPU使用率和负载?
- 总结
今天给大家分享一个知识点,就是平时我们线上服务器部署的Java系统如果发现要是性能不太好,此时应该如何登录到线上服务器,接着用top命令去分析线上系统的性能呢?下面我们就来一步一步给大家讲解一下top命令的使用技巧。
线上系统是如何运行的?
首先,在讲解top命令的使用技巧之前,我们先得给大家铺垫一些基础的知识,就是关于线上系统在服务器上运行的时候,他会需要使用哪些资源,或者换句话说,他会需要使用到服务器的哪些硬件呢?
大家首先要明白一个事情,就是线上运行的系统本质其实就是一个linux进程,也就是JVM进程。这个JVM进程实际上会开启多个线程,每个线程都会交给CPU来运行, 这个CPU就是我们很关键的一个硬件,CPU在运行我们的线程的同时,当然也会运行线程负责执行的那部分代码了,如下图。
CPU是如何并发运行多个线程的?
但是单单是这个CPU运行多个线程的事儿就有的一说。可能很多人不知道现代服务器都是有多个CPU的,或者说一个CPU是有多个核(core)的。我们要搞清楚,一个CPU是有多个cores的。一个CPU core并发运行多个线程与多个CPU core同时运行多个线程是不一样的。
一个CPU core并发运行多个线程,实际上指的不是同时运行多个线程,而是快速的切换运行每一个线程,也就是某个CPU core会先运行一下线程A,执行一小会儿A的代码,再立刻切换去运行线程B,运行一小会儿B的代码再快速的切换去运行线程C。CPU core只不过是切换的速度非常快,让你有一种错觉,一个CPU core可以同时运行多个线程一样,其实并不是,如下图。
线程太多会导致什么样的后果?
很多时候并不是线程越多越好的,很多小伙伴往往在开发线上系统时会犯一个错误,那就是以为让系统同时运行几百几千个线程,就可以高并发的处理请求了,其实根本不是。如果开启的线程太多了,会导致每个CPU core要频繁的切换来运行n多线程,而每次线程切换都是有时间开销。过多的线程反而会导致每个线程都只运行一小会儿后就被暂停一段时间才能被再次运行,为什么?因为线程太多了啊,CPU core要给每个线程都运行一下,雨露均沾,如下图。
上面这个图就很明显,你一个请求来了,是交给一个线程来处理的,这个线程刚得到CPU运行机会,跑了一小会儿还没处理完,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使用率和负载情况。
END
扫码 免费获取 600+页石杉老师原创精品文章汇总PDF
原创技术文章汇总