Linux就这5个问题

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

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

  1. [root@aliyun ~]# uptime
  2. 20:35:17 up 2 days, 2:54, 1 user, load average: 0.00, 0.00, 0.00
  3. [root@aliyun ~]# w
  4. 20:36:15 up 2 days, 2:55, 1 user, load average: 0.00, 0.00, 0.00
  5. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  6. root pts/0 171.11.0.157 20:35 0.00s 0.01s 0.00s w
  7. [root@aliyun ~]# top
  8. top - 20:35:48 up 2 days, 2:54, 1 user, load average: 0.00, 0.00, 0.00
  9. Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
  10. %Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
  11. MiB Mem : 1748.2 total, 1203.5 free, 144.4 used, 400.3 buff/cache
  12. MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1459.6 avail Mem
  13. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
  14. 1123 root 10 -10 166748 20936 16576 S 0.3 1.2 4:59.63 AliYunDun
  15. 1 root 20 0 176172 10556 8136 S 0.0 0.6 0:01.95 systemd
  16. 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
  17. 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
  18. 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
  19. 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kblockd
  20. 8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
  21. 9 root 20 0 0 0 0 S 0.0 0.0 0:00.17 ksoftirqd/0
  22. 10 root 20 0 0 0 0 I 0.0 0.0 0:01.51 rcu_sched
  23. 11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
  24. 12 root rt 0 0 0 0 S 0.0 0.0 0:00.05 watchdog/0
  25. 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
  26. 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
  27. 16 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
  28. 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kauditd
  29. 18 root 20 0 0 0 0 S 0.0 0.0 0:00.02 khungtaskd
  30. 19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 oom_reaper

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

如果单核CPU的话,负载达到1就代表CPU已经达到满负荷的状态了,超过1,后面的进行就需要排队等待处理了。如果是是多核多CPU的话,假设现在服务器是2个CPU,每个CPU2个核,那么总负载不超过4都没什么问题。怎么查看CPU有多少核呢?

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

  1. [root@aliyun ~]# cat /proc/cpuinfo
  2. processor : 0
  3. vendor_id : GenuineIntel
  4. cpu family : 6
  5. model : 85
  6. model name : Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz
  7. stepping : 7
  8. microcode : 0x1
  9. cpu MHz : 2500.000
  10. cache size : 36608 KB
  11. physical id : 0
  12. siblings : 1
  13. core id : 0
  14. cpu cores : 1
  15. apicid : 0
  16. initial apicid : 0
  17. fpu : yes
  18. fpu_exception : yes
  19. cpuid level : 22
  20. wp : yes
  21. flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves arat avx512_vnni
  22. bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit
  23. bogomips : 5000.00
  24. clflush size : 64
  25. cache_alignment : 64
  26. address sizes : 46 bits physical, 48 bits virtual
  27. power management:
  28. [root@aliyun ~]# cat /proc/cpuinfo | grep "model name"
  29. model name : Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz

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

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

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

同样,可以先通过top命令观察,假设发现现在确实是高负载低使用率。

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

[root@aliyun ~]# ps -axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     3     0     0 ?           -1 I<       0   0:00  \_ [rcu_gp]
    2     4     0     0 ?           -1 I<       0   0:00  \_ [rcu_par_gp]
    2     6     0     0 ?           -1 I<       0   0:00  \_ [kworker/0:0H-kblockd]
    2     8     0     0 ?           -1 I<       0   0:00  \_ [mm_percpu_wq]
    2     9     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]
    2    10     0     0 ?           -1 R        0   0:01  \_ [rcu_sched]
    2    11     0     0 ?           -1 S        0   0:00  \_ [migration/0]
    2    12     0     0 ?           -1 S        0   0:00  \_ [watchdog/0]
    2    13     0     0 ?           -1 S        0   0:00  \_ [cpuhp/0]
    2    15     0     0 ?           -1 S        0   0:00  \_ [kdevtmpfs]
    2    16     0     0 ?           -1 I<       0   0:00  \_ [netns]
    2    17     0     0 ?           -1 S        0   0:00  \_ [kauditd]
    2    18     0     0 ?           -1 S        0   0:00  \_ [khungtaskd]
    2    19     0     0 ?           -1 S        0   0:00  \_ [oom_reaper]
    2    20     0     0 ?           -1 I<       0   0:00  \_ [writeback]
    2    21     0     0 ?           -1 S        0   0:00  \_ [kcompactd0]
    2    22     0     0 ?           -1 SN       0   0:00  \_ [ksmd]

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

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

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

4.那如果CPU使用率达到100%呢?

  1. 通过top找到占用率高的进程。
  2. 通过top -Hp pid找到占用CPU高的线程ID。这里找到958的线程ID
  3. 再把线程ID转化为16进制,printf "0x%x\n" 958,得到线程ID0x3be
  4. 通过命令jstack 163 | grep '0x3be' -C5 --color 或者 jstack 163|vim +/0x3be - 找到有问题的代码

Linux面试问题 - 图1

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来解压缩