Linux面试最高频的5个基本问题

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

转自:blog.csdn.net/fuzhongmin05/article/details/114088146


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

嵌入式Linux

微信扫描二维码,关注我的公众

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用iptables实现G1手机cmwap代理上http网站[转]

2019独角兽企业重金招聘Python工程师标准>>> 折腾了几天,总算有点阶段性成果: 证实可以用iptables实现通过cmwap的代理上HTTP协议的网站。 首先,android系统的实现是有缺陷的。在接入apn中指定的proxy并不会被系统所用。好似只有浏…

初识Buildroot

转自CSDN ,记录是为了作者小编学习需要作者:xixihaha331什么是buildrootBuildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置&#…

Python3安装(Windows)

Windows下Python3环境搭建 目录 Windows下Python3环境搭建 安装Python 启动终端会话 IDE —— Geany 安装Python 访问https://www.python.org/downloads 点击上图红色区域按钮,下载Python。下载完成后开始安装: 勾选“Add Python 3.7 to PATH”&…

Runtime消息动态解析与转发流程

先上图&#xff1a; 下面根据具体代码看这张图。 一、创建一个Person类&#xff0c; Person.h #import <Foundation/Foundation.h>interface Person : NSObject-(void)sendMessage:(NSString *)message;end Person.m #import "Person.h" #import <objc/runt…

编写优美的GTest测试案例

使用gtest也有很长一段时间了&#xff0c;这期间也积累了一些经验&#xff0c;所以分享一下。GTest为我们提供了便捷的测试框架&#xff0c;让我们只需要关注案例本身。如何在GTest框架下写出优美的测试案例&#xff0c;我觉得必须要做到&#xff1a; 案例的层次结构一定要清晰…

评分9.3,你想要的那本书,来了!

还记得那天晚上我发的朋友圈吗&#xff1f;经过不完全统计&#xff0c;更多的人喜欢C语言这本书&#xff0c;所以这次先安排抽奖这本书籍&#xff0c;属于出版社赞助&#xff0c;也是给大家一个获奖的机会。不吹牛啊&#xff0c;我们办公室一个大神&#xff0c;写算法的&#x…

Python3安装(Linux)

Linux下Python3环境搭建 目录 Linux下Python3环境搭建 检查Python版本&#xff08;ubuntu16.04&#xff09; Helloworld IDE —— Geany 检查Python版本&#xff08;ubuntu16.04&#xff09; Linux默认已经安装了Python。CtrlAltT调出终端&#xff0c;输入python&#xff…

create-react-app 创建react项目 多页面应用

1:npm install -g create-react-app 2:创建一个应用 create-react-app my-app cd my-app 3:提取配置文件 npm run eject 4:允许文件 npm start create-react-app 默认是创建单页面应用&#xff0c;但是也可以创建多页面应用&#xff0c;需要手动配置一下webpack 第一步&…

c语言指针用法详解,通俗易懂超详细!

文章转自&#xff1a;无际单片机大家好&#xff0c;我是无际。今天给大家来讲解一下指针。我会由浅到深&#xff0c;最后结合实际应用讲解&#xff0c;让大家学会指针的同时&#xff0c;知道大佬们都用指针来干嘛&#xff01;长文预警&#xff01;全文大约5200多字&#xff0c;…

Python3 —— 变量和简单数据类型

Python3 —— 变量和简单数据类型 目录 python3 —— 变量和简单数据类型 一、变量 1、变量&#xff08;每个变量都存储了一个值——与变量相关联的信息&#xff09; 2、变量命名 二、简单数据类型&#xff08;整型&#xff0c;浮点型&#xff0c;字符串等&#xff09; 1…

Linux C Socket编程,这篇文章让我耳目一新

目录1. 什么是TCP/IP、UDP&#xff1f;2. Socket在哪里呢&#xff1f;3. Socket是什么呢&#xff1f;4. 有很多的框架&#xff0c;为什么还在从Socket开始&#xff1f;5. Linux C Socket简单示例1.什么是TCP/IP、UDP&#xff1f;TCP/IP&#xff08;Transmission Cont…

视频下载比想象中容易

两周前搞定了56.com的视频独立播放和视频下载后&#xff0c;很得意是吹嘘了一把&#xff0c;有一些朋友也就试着用了&#xff08;有朋友笑称我在为56.com做广告&#xff0c;因为他以前是不知道56.com的&#xff0c;我这么一搞&#xff0c;他竟也喜欢上56.com看视频了&#xff0…

微处理器:50岁了!

编排 | strongerHuang微信公众号 | 嵌入式专栏50年前&#xff08;1971年&#xff09;&#xff0c;英特尔推出了第一款商用的通用型微处理器 4004&#xff0c;4004拥有2300多个晶体管&#xff0c;与当今芯片中的几十上百亿个晶体管相比&#xff0c;这个数字相形见绌&#xff0c;…

Python3 —— 列表

Python3 —— 列表 目录 Python3 —— 列表 1.访问列表元素&#xff08;索引&#xff09; 2.修改列表元素 3.添加列表元素 4.删除列表元素 5.组织列表 6.遍历整个列表&#xff08;for循环&#xff0c;缩进部分都在for范围之内&#xff09; 7.创建数值列表 8.列表简单…

当卷烟厂也那么卷后……

过年回家&#xff0c;跟几个同学一起吃饭&#xff0c;聊到当时班上读书厉害的一个同学。同学嘴巴瞪得很大&#xff0c;说了一句&#xff0c;他在烟厂企业上班&#xff0c;现在开的什么什么车&#xff0c;待遇好得不得了。中学时候&#xff0c;那个同学读书真的厉害&#xff0c;…

Python3 —— if/while/input

Python3 —— if/while/input 目录 Python3 —— if/while/input 1.条件测试 2.if语句 3.input()函数 4.while循环 5.break与continue 1.条件测试 等于 ! 不等于 < 小于 < 小于等于 > 大于 > 大于等于 and 与 or 或 not in 不在 2…

python 全栈开发,Day63(子查询,MySQl创建用户和授权,可视化工具Navicat的使用,pymysql模块的使用)...

昨日内容回顾 外键的变种三种关系&#xff1a;多对一&#xff1a;左表的多 对右表一 成立左边的一 对右表多 不成立foreign key(从表的id) refreences 主表的&#xff08;id&#xff09;多对多建立第三张表&#xff08;foreign key&#xff09;一对一foreign keyunique单表查询…

我偶尔会用到的调试方法 | Linux 内核

文章转自我朋友的公众号&#xff0c;以下为内容正文大家好&#xff0c;我是你们的工具人老吴。今天,和大家分享一下几个 Linux 内核的调试小技巧。当你遇到一个 bug&#xff0c;你调试了 1 年半载都解决不了&#xff0c;这其实一件好事。因为它会时刻提醒你平时写代码时要谨慎、…

Linux应用编程之共享内存实例

1共享内存实例01主要内容 上一小节小哥跟大家介绍了一下共享内存的知识&#xff0c;今天主要是做一个实战的演示&#xff0c;从而更好的理解共享内存的原理和实际应用。02程序示例 1#include <stdlib.h>2#include <stdio.h>3#include <string.h>4#inclu…

洛谷P1279 字串距离 (动态规划)

题目描述 设有字符串X&#xff0c;我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串&#xff0c;如字符串X为”abcbcd”&#xff0c;则字符串“abcb□cd”&#xff0c;“□a□bcbcd□”和“abcb□cd□”都是X的扩展串&#xff0c;这里“□”代表空格字符。 如…