面试题系列:Linux 夺命连环 5 问

本文转载自《阿里云云栖号》
作者 | 前阿里技术专家 - 艾小仙
原文链接:https://mp.weixin.qq.com/s/pIu82Ndob6tapw8B0Wgn-A
本文转载时,做了部分修改,和重新排版。

目录:

[TOC]

1. CPU 负载和 CPU 利用率的区别是什么?

首先,我们可以通过uptimew或者top命令看到 CPU 的平均负载。

使用uptimew命令:

使用uptime或w

使用top命令:

使用top命令

Load Average :负载的 3 个数字,比如上图的 4.86,5.28,5.00,分别代表系统在过去的 1 分钟,5 分钟,15 分钟内的系统平均负载。他代表的是当前系统正在运行的和处于等待运行的进程数之和。也指的是处于可运行状态和不可中断状态的平均进程数。

如果单核 CPU 的话,负载达到 1 就代表 CPU 已经达到满负荷的状态了,超过 1 ,后面的进行就需要排队等待处理了。

如果是是多核多 CPU 的话,假设现在服务器是 2 个 CPU ,每个 CPU 2 个核,那么总负载不超过 4 都没什么问题。

怎么查看 CPU 有多少核呢?

通过命令cat /proc/cpuinfo | grep "model name"查看 CPU 的情况。

查看 CPU 的情况

通过命令cat /proc/cpuinfo | grep "cpu cores"查看 CPU 的核数。

查看 CPU 的核数

CPU 利用率:和负载不同,CPU 利用率指的是当前正在运行的进程实时占用 CPU 的百分比,他是对一段时间内 CPU 使用状况的统计。

我举个栗子🌰 :

假设你们公司厕所有 1 个坑位,有一个人占了坑位,这时候负载就是 1 ,如果还有一个人在排队,那么负载就是 2 。

如果在 1 个小时内,A 上厕所花了 10 分钟,B 上厕所花了 20 分钟,剩下 30 分钟厕所都没人使用,那么这一个小时内利用率就是 50% 。

2. 那如果 CPU 负载很高,利用率却很低该怎么办?

CPU 负载很高,利用率却很低,说明处于等待状态的任务很多,负载越高,代表可能很多僵死的进程。通常这种情况是 IO 密集型的任务,大量请求在请求相同的 IO ,导致任务队列堆积。

同样,可以先通过top命令观察(截图只是示意,不代表真实情况),假设发现现在确实是高负载低使用率。

然后,再通过命令ps -axjf查看是否存在状态为 D+ 状态的进程,这个状态指的就是不可中断的睡眠状态的进程。处于这个状态的进程无法终止,也无法自行退出,只能通过恢复其依赖的资源或者重启系统来解决。(对不起,我截不到 D+ 的状态)

3. 那如果负载很低,利用率却很高呢?

如果你的公司只有一个厕所,外面没人排队,却有一个人在里面上了大半个小时,这说明什么?

两种可能:他没带纸,或者一些奇怪的事情发生了?

这表示 CPU 的任务并不多,但是任务执行的时间很长,大概率就是你写的代码本身有问题,通常是计算密集型任务,生成了大量耗时短的计算任务。

怎么排查?直接top命令找到使用率最高的任务,定位到去看看就行了。如果代码没有问题,那么过段时间 CPU 使用率就会下降的。

4. 那如果 CPU 使用率达到 100% 呢?怎么排查?

通过top命令找到占用率高的进程。

通过top -Hp pid找到占用 CPU 高的线程 ID 。这里找到 958 的线程 ID 。

再把线程 ID 转化为 16 进制,printf "0x%x\n" 958,得到线程 ID0x3be

通过命令jstack 163 | grep '0x3be' -C5 --color或者jstack 163|vim +/0x3be -找到有问题的代码。

5. 说说常见的 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 文件修改文件所有者和组,冒号前面是所有者,后面是组。

常用的压缩命令

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 常用几个选项,-x解打包,-c打包,-f指定压缩包文件名,-v显示打包文件过程,一般常用tar -cvf xx.tar 文件来打包,解压则使用tar -xvf xx.tar

Linux 的打包和压缩是分开的操作,如果要打包并且压缩的话,按照前面的做法必须先用tar打包,然后再用gzip压缩。当然,还有更好的做法就是-z命令,打包并且压缩。

使用命令tar -zcvf xx.tar.gz 文件来打包压缩,使用命令tar -zxvf xx.tar.gz来解压缩。

(完)