CPU 利用率和 CPU 负载的区别是什么
提到 CPU 利用率,就必须了解工夫片。什么是 CPU 工夫片?咱们当初所应用的 Windows、Linux、Mac OS 都是“多任务操作系统”,就是说他们能够“同时”运行多个程序,比方一边关上 Chrome 浏览器浏览网页还能一边听音乐。
然而,实际上一个 CPU 内核在同一时刻只能干一件事,那操作系统是如何实现“多任务”的呢?大略的办法是让多个过程轮流应用 CPU 一小段时间,因为这个“一小段时间”很短(在 linux 上为 5ms-800ms 之间),用户感觉不到,就如同是几个程序同时在运行了。下面提到的“一小段时间”就是咱们所说的 CPU 工夫片,CPU 的古代分时多任务操作系统对 CPU 都是分工夫片应用的。
CPU 使用率,就是程序对 CPU 工夫片的占用状况,即 CPU 使用率 = CPU 工夫片被程序应用的工夫 / 总工夫。比方 A 过程占用 10ms,而后 B 过程占用 30ms,而后闲暇 60ms,再又是 A 过程占 10ms,B 过程占 30ms,闲暇 60ms,如果在一段时间内都是如此,那么这段时间内的 CPU 占用率为 40%。CPU 利用率显示的是程序在运行期间实时占用的 CPU 百分比。
大多数操作系统的 CPU 占用率分为用户态 CPU 使用率和零碎态 CPU 使用率。用户态 CPU 使用率是指执行利用程序代码的工夫占总 CPU 工夫的百分比。相比而言,零碎态 CPU 使用率是指利用执行操作系统调用的工夫占总 CPU 工夫的百分比。零碎态的 CPU 使用率高意味着共享资源有竞争或者 I / O 设施之间有大量的交互。
而 CPU 负载显示的是一段时间内正在应用和期待应用 CPU 的均匀工作数。
简略了解,一个是 CPU 的实时应用状况,一个是 CPU 的以后以及将来一段时间的应用状况。举例来说:如果我有一个程序它须要始终应用 CPU 的运算性能,那么此时 CPU 的使用率可能达到 100%,然而 CPU 的工作负载则是趋近于“1”,因为 CPU 仅负责一个工作嘛!如果同时执行这样的程序两个呢?CPU 的使用率还是 100%,然而工作负载则变成 2 了。所以也就是说,CPU 的工作负载越大,代表 CPU 必须要在不同的工作之间进行频繁的工作切换。无论 CPU 的利用率是高是低,跟前面有多少工作在排队 (CPU 负载) 没有必然关系。
如果单核 CPU 的话,负载达到 1 就代表 CPU 曾经达到满负荷的状态了,超过 1,前面的进行就须要排队期待解决了。如果是是多核多 CPU,假如当初服务器是 2 个 CPU,每个 CPU 有 2 个核,那么总负载不超过 4 都没什么问题。
能够通过 uptime、w 命令查看 CPU 均匀负载,应用 top 命令还能看到 CPU 负载总体使用率以及各个过程占用 CPU 的比例。
查看物理 CPU 个数
cat /proc/cpuinfo| grep“physical id”| sort | uniq| wc -l
查看每个物理 CPU 中 core 的个数(即核数)
cat /proc/cpuinfo| grep“cpu cores”| uniq
查看逻辑 CPU 的个数
cat /proc/cpuinfo| grep“processor”| wc -l
如果 CPU 负载很高,利用率却很低该怎么办
CPU 负载很高,利用率却很低,阐明处于期待状态的工作很多,负载越高,代表可能很多僵死的过程。通常这种状况是 IO 密集型的工作,大量工作在申请雷同的 IO,导致工作队列沉积。
生产环境造成 CPU 利用率低负载高的具体场景常见的有如下几种。
场景一:磁盘读写申请过多就会导致大量 I / O 期待
过程在 cpu 下面运行须要拜访磁盘文件,这个时候 cpu 会向内核发动调用文件的申请,让内核去磁盘取文件,这个时候 cpu 会切换到其余过程或者闲暇,这个工作就会转换为不可中断睡眠状态。当这种读写申请过多就会导致不可中断睡眠状态的过程过多,从而导致负载高,cpu 低的状况。
场景二:MySQL 中存在没有索引的语句或存在死锁等状况
咱们都晓得 MySQL 的数据是存储在硬盘中,如果须要进行 sql 查问,须要先把数据从磁盘加载到内存中。当在数据特地大的时候,如果执行的 sql 语句没有索引,就会造成扫描表的行数过大导致 I / O 阻塞,或者是语句中存在死锁,也会造成 I / O 阻塞,从而导致不可中断睡眠过程过多,导致负载过大。
同样,能够先通过 top 命令察看,假如发现当初的确是高负载低使用率。
而后,再通过命令 ps -aux 查看是否存在状态为 D 的过程,这个状态指的就是不可中断的睡眠状态的过程。处于这个状态的过程无奈终止,也无奈自行退出,只能通过复原其依赖的资源或者重启零碎来解决。以下图中没有 D 状态的过程。
Linux 上过程的五种状态
R (TASK_RUNNING):可执行状态,只有在该状态的过程才可能在 CPU 上运行。而同一时刻可能有多个过程处于可执行状态。
S (TASK_INTERRUPTIBLE):可中断的睡眠状态,处于这个状态的过程因为期待某某事件的产生(比方期待 socket 连贯、期待信号量),而被挂起。
D (TASK_UNINTERRUPTIBLE):不可中断的睡眠状态,过程处于睡眠状态,然而此刻过程是不可中断的。TASK_UNINTERRUPTIBLE 状态存在的意义就在于,内核的某些解决流程是不能被打断的。
T (TASK_STOPPED or TASK_TRACED):暂停状态或跟踪状态。Z (TASK_DEAD – EXIT_ZOMBIE):退出状态,过程成为僵尸过程。过程已终止,但过程形容还在,直到父过程调用 wait4()零碎调用后开释。
如果 CPU 负载很低,利用率却很高该怎么办
这示意 CPU 的工作并不多,然而工作执行的工夫很长,大概率就是你写的代码自身有问题,通常是计算密集型工作,生成了大量耗时短的计算工作。
怎么排查?间接 top 命令找到 CPU 使用率最高的过程,定位到去看看就行了。如果代码没有问题,那么过段时间 CPU 使用率就会降落的。往期面试题汇总:250 期面试材料
CPU 利用率达到 100% 怎么排查问题
1、通过 top 找到 CPU 占用率高的过程
2、通过 top -Hp pid 命令查看 CPU 占比靠前的线程 ID
3、再把线程 ID 转化为 16 进制,printf“0x%x\n”74317,失去 0x1224d
4、通过命令 jstack 72700 | grep‘0x1224d’-C5 –color 找到有问题的代码
留神:jstack 的对象是 java 过程的 PID,而不是 java 线程的 PID。
说几个常见的 Linux 命令
罕用的文件 / 目录命令
ls:用户查看目录下的文件,ls - a 能够用来查看暗藏文件,ls - l 能够用于查看文件的详细信息,包含权限、大小、所有者等信息。
touch:用于创立文件。如果文件不存在,则创立一个新的文件,如果文件已存在,则会批改文件的工夫戳。
cat:cat 是英文 concatenate 的缩写,用于查看文件内容。应用 cat 查看文件的话,不论文件的内容有多少,都会一次性显示,所以他不适宜查看太大的文件。
more:more 和 cat 有点区别,more 用于分屏显示文件内容。能够用空格键向下翻页,b 键向上翻页
less:和 more 相似,less 用于分行显示
tail:可能是平时用的最多的命令了,查看日志文件根本靠它。tail -fn 100 xx.log 查看最初的 100 行内容
罕用的权限命令
chmod:批改权限命令。个别用 + 号增加权限,- 号删除权限,x 代表执行权限,r 代表读取权限,w 代表写入权限,常见写法比方 chmod +x 文件名增加执行权限。
还有另外一种写法,应用数字来受权,因为 r =4,w=2,x=1,平时执行命令 chmod 777 文件名这就是最高权限了。
第一个数字 7 =4+2+ 1 代表着所有者的权限,第二个数字 7 代表所属组的权限,第三个数字代表其他人的权限。常见的权限数字还有 644,所有者有读写权限,其他人只有只读权限,755 代表其他人有只读和执行权限。
chown:用于批改文件和目录的所有者和所属组。个别用法 chown user 文件名用于批改文件所有者,chown user:user 文件名批改文件所有者和组,冒号后面是所有者,前面是组。往期面试题汇总:250 期面试材料
罕用的压缩命令
zip:压缩 zip 文件命令,比方 zip test.zip 文件名能够把文件压缩成 zip 文件,如果压缩目录的话则需增加 -r 选项。
unzip:与 zip 对应,解压 zip 文件命令。unzip xxx.zip 间接解压,还能够通过 -d 选项指定解压目录。
gzip:用于压缩带.gz 后缀的文件,gzip 命令不能打包目录。须要留神的是间接应用 gzip 文件名这个命令会导致源文件会隐没,如果要保留源文件,能够应用 gzip -c 文件名 > xx.gz,解压缩间接应用 gzip -d xx.gz
tar:tar 命令能够为 linux 的文件和目录创立档案。利用 tar,能够为某一特定文件创建档案(备份文件),也能够在档案中扭转文件,或者向档案中退出新的文件。tar 罕用几个选项,-x 解打包,-c 打包,-f 指定压缩包文件名,-v 显示打包文件过程,个别罕用 tar -cvf xx.tar 文件名来打包,解压则应用 tar -xvf xx.tar
首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要辨别这两个概念呢?这源于 Linux 中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar 命令),而后再用压缩程序进行压缩(gzip 等命令)。
Linux 的打包和压缩是离开的操作,如果要打包并且压缩的话,依照后面的做法必须先用 tar 打包,而后再用 gzip 压缩。当然,还有更好的做法就是 - z 命令,打包并且压缩。
应用命令 tar -zcvf xx.tar.gz 文件名来打包压缩,应用命令 tar -zxvf xx.tar.gz 来解压缩。