Linux 面试最高频的 5 个基本问题!
歡迎關(guān)注微信公眾號(hào)【廈門微思網(wǎng)絡(luò)】。www.xmws.cn專業(yè)IT認(rèn)證培訓(xùn)19周年
主要課程:思科、華為、紅帽、ORACLE、VMware、CISP、PMP等認(rèn)證培訓(xùn)及考證?
CPU利用率和CPU負(fù)載的區(qū)別是什么
提到CPU利用率,就必須理解時(shí)間片。什么是CPU時(shí)間片?我們現(xiàn)在所使用的Windows、Linux、Mac OS都是“多任務(wù)操作系統(tǒng)”,就是說他們可以“同時(shí)”運(yùn)行多個(gè)程序,比如一邊打開Chrome瀏覽器瀏覽網(wǎng)頁還能一邊聽音樂。
但是,實(shí)際上一個(gè)CPU內(nèi)核在同一時(shí)刻只能干一件事,那操作系統(tǒng)是如何實(shí)現(xiàn)“多任務(wù)”的呢?大概的方法是讓多個(gè)進(jìn)程輪流使用CPU一小段時(shí)間,由于這個(gè)“一小段時(shí)間”很短(在linux上為5ms-800ms之間),用戶感覺不到,就好像是幾個(gè)程序同時(shí)在運(yùn)行了。上面提到的“一小段時(shí)間”就是我們所說的CPU時(shí)間片,CPU的現(xiàn)代分時(shí)多任務(wù)操作系統(tǒng)對(duì)CPU都是分時(shí)間片使用的。
CPU使用率,就是程序?qū)PU時(shí)間片的占用情況,即CPU使用率 = CPU時(shí)間片被程序使用的時(shí)間 / 總時(shí)間。比如A進(jìn)程占用10ms,然后B進(jìn)程占用30ms,然后空閑60ms,再又是A進(jìn)程占10ms,B進(jìn)程占30ms,空閑60ms,如果在一段時(shí)間內(nèi)都是如此,那么這段時(shí)間內(nèi)的CPU占用率為40%。CPU利用率顯示的是程序在運(yùn)行期間實(shí)時(shí)占用的CPU百分比。
大多數(shù)操作系統(tǒng)的CPU占用率分為用戶態(tài)CPU使用率和系統(tǒng)態(tài)CPU使用率。用戶態(tài)CPU使用率是指執(zhí)行應(yīng)用程序代碼的時(shí)間占總CPU時(shí)間的百分比。相比而言,系統(tǒng)態(tài)CPU使用率是指應(yīng)用執(zhí)行操作系統(tǒng)調(diào)用的時(shí)間占總CPU時(shí)間的百分比。系統(tǒng)態(tài)的CPU使用率高意味著共享資源有競(jìng)爭(zhēng)或者I/O設(shè)備之間有大量的交互。
而CPU負(fù)載顯示的是一段時(shí)間內(nèi)正在使用和等待使用CPU的平均任務(wù)數(shù)。
簡(jiǎn)單理解,一個(gè)是CPU的實(shí)時(shí)使用情況,一個(gè)是CPU的當(dāng)前以及未來一段時(shí)間的使用情況。舉例來說:如果我有一個(gè)程序它需要一直使用CPU的運(yùn)算功能,那么此時(shí)CPU的使用率可能達(dá)到100%,但是CPU的工作負(fù)載則是趨近于“1”,因?yàn)镃PU僅負(fù)責(zé)一個(gè)工作嘛!如果同時(shí)執(zhí)行這樣的程序兩個(gè)呢?CPU的使用率還是100%,但是工作負(fù)載則變成2了。所以也就是說,CPU的工作負(fù)載越大,代表CPU必須要在不同的工作之間進(jìn)行頻繁的工作切換。無論CPU的利用率是高是低,跟后面有多少任務(wù)在排隊(duì)(CPU負(fù)載)沒有必然關(guān)系。
如果單核CPU的話,負(fù)載達(dá)到1就代表CPU已經(jīng)達(dá)到滿負(fù)荷的狀態(tài)了,超過1,后面的進(jìn)行就需要排隊(duì)等待處理了。如果是是多核多CPU,假設(shè)現(xiàn)在服務(wù)器是2個(gè)CPU,每個(gè)CPU有2個(gè)核,那么總負(fù)載不超過4都沒什么問題。
可以通過uptime、w命令查看CPU平均負(fù)載,使用top命令還能看到CPU負(fù)載總體使用率以及各個(gè)進(jìn)程占用CPU的比例。
查看物理CPU個(gè)數(shù)
cat /proc/cpuinfo| grep “physical id”| sort | uniq| wc -l
查看每個(gè)物理CPU中core的個(gè)數(shù)(即核數(shù))
cat /proc/cpuinfo| grep “cpu cores” | uniq
查看邏輯CPU的個(gè)數(shù)
cat /proc/cpuinfo| grep “processor”| wc -l
如果CPU負(fù)載很高,利用率卻很低該怎么辦
CPU負(fù)載很高,利用率卻很低,說明處于等待狀態(tài)的任務(wù)很多,負(fù)載越高,代表可能很多僵死的進(jìn)程。通常這種情況是IO密集型的任務(wù),大量任務(wù)在請(qǐng)求相同的IO,導(dǎo)致任務(wù)隊(duì)列堆積。
生產(chǎn)環(huán)境造成CPU利用率低負(fù)載高的具體場(chǎng)景常見的有如下幾種。
場(chǎng)景一:磁盤讀寫請(qǐng)求過多就會(huì)導(dǎo)致大量I/O等待
進(jìn)程在cpu上面運(yùn)行需要訪問磁盤文件,這個(gè)時(shí)候cpu會(huì)向內(nèi)核發(fā)起調(diào)用文件的請(qǐng)求,讓內(nèi)核去磁盤取文件,這個(gè)時(shí)候cpu會(huì)切換到其他進(jìn)程或者空閑,這個(gè)任務(wù)就會(huì)轉(zhuǎn)換為不可中斷睡眠狀態(tài)。當(dāng)這種讀寫請(qǐng)求過多就會(huì)導(dǎo)致不可中斷睡眠狀態(tài)的進(jìn)程過多,從而導(dǎo)致負(fù)載高,cpu低的情況。
場(chǎng)景二:MySQL中存在沒有索引的語句或存在死鎖等情況
我們都知道MySQL的數(shù)據(jù)是存儲(chǔ)在硬盤中,如果需要進(jìn)行sql查詢,需要先把數(shù)據(jù)從磁盤加載到內(nèi)存中。當(dāng)在數(shù)據(jù)特別大的時(shí)候,如果執(zhí)行的sql語句沒有索引,就會(huì)造成掃描表的行數(shù)過大導(dǎo)致I/O阻塞,或者是語句中存在死鎖,也會(huì)造成I/O阻塞,從而導(dǎo)致不可中斷睡眠進(jìn)程過多,導(dǎo)致負(fù)載過大。
同樣,可以先通過top命令觀察,假設(shè)發(fā)現(xiàn)現(xiàn)在確實(shí)是高負(fù)載低使用率。
然后,再通過命令ps -aux查看是否存在狀態(tài)為D的進(jìn)程,這個(gè)狀態(tài)指的就是不可中斷的睡眠狀態(tài)的進(jìn)程。處于這個(gè)狀態(tài)的進(jìn)程無法終止,也無法自行退出,只能通過恢復(fù)其依賴的資源或者重啟系統(tǒng)來解決。以下圖中沒有D狀態(tài)的進(jìn)程。
Linux上進(jìn)程的五種狀態(tài)
-
R (TASK_RUNNING):可執(zhí)行狀態(tài),只有在該狀態(tài)的進(jìn)程才可能在CPU上運(yùn)行。而同一時(shí)刻可能有多個(gè)進(jìn)程處于可執(zhí)行狀態(tài)。
-
S (TASK_INTERRUPTIBLE):可中斷的睡眠狀態(tài),處于這個(gè)狀態(tài)的進(jìn)程因?yàn)榈却衬呈录陌l(fā)生(比如等待socket連接、等待信號(hào)量),而被掛起。
-
D (TASK_UNINTERRUPTIBLE):不可中斷的睡眠狀態(tài),進(jìn)程處于睡眠狀態(tài),但是此刻進(jìn)程是不可中斷的。TASK_UNINTERRUPTIBLE狀態(tài)存在的意義就在于,內(nèi)核的某些處理流程是不能被打斷的。
-
T (TASK_STOPPED or TASK_TRACED):暫停狀態(tài)或跟蹤狀態(tài)。
-
Z (TASK_DEAD - EXIT_ZOMBIE):退出狀態(tài),進(jìn)程成為僵尸進(jìn)程。進(jìn)程已終止,但進(jìn)程描述還在,直到父進(jìn)程調(diào)用wait4()系統(tǒng)調(diào)用后釋放。
如果CPU負(fù)載很低,利用率卻很高該怎么辦
這表示CPU的任務(wù)并不多,但是任務(wù)執(zhí)行的時(shí)間很長(zhǎng),大概率就是你寫的代碼本身有問題,通常是計(jì)算密集型任務(wù),生成了大量耗時(shí)短的計(jì)算任務(wù)。
怎么排查?直接top命令找到CPU使用率最高的進(jìn)程,定位到去看看就行了。如果代碼沒有問題,那么過段時(shí)間CPU使用率就會(huì)下降的。往期面試題匯總:250期面試資料
CPU利用率達(dá)到100%怎么排查問題
1、通過top找到CPU占用率高的進(jìn)程
2、通過top -Hp pid命令查看CPU占比靠前的線程ID
3、再把線程ID轉(zhuǎn)化為16進(jìn)制,printf “0x%x\n” 74317,得到0x1224d
4、通過命令jstack 72700 | grep ‘0x1224d’ -C5 --color找到有問題的代碼
注意:jstack的對(duì)象是java進(jìn)程的PID,而不是java線程的PID。
說幾個(gè)常見的Linux命令
常用的文件/目錄命令
-
ls:用戶查看目錄下的文件
-
ls -a可以用來查看隱藏文件
-
ls -l可以用于查看文件的詳細(xì)信息,包括權(quán)限、大小、所有者等信息。
touch:用于創(chuàng)建文件。如果文件不存在,則創(chuàng)建一個(gè)新的文件,如果文件已存在,則會(huì)修改文件的時(shí)間戳。
cat:cat是英文concatenate的縮寫,用于查看文件內(nèi)容。使用cat查看文件的話,不管文件的內(nèi)容有多少,都會(huì)一次性顯示,所以他不適合查看太大的文件。
more:more和cat有點(diǎn)區(qū)別,more用于分屏顯示文件內(nèi)容。可以用空格鍵向下翻頁,b鍵向上翻頁
less:和more類似,less用于分行顯示
tail:可能是平時(shí)用的最多的命令了,查看日志文件基本靠它。tail -fn 100 xx.log查看最后的100行內(nèi)容
常用的權(quán)限命令
chmod:修改權(quán)限命令。一般用+號(hào)添加權(quán)限,-號(hào)刪除權(quán)限,x代表執(zhí)行權(quán)限,r代表讀取權(quán)限,w代表寫入權(quán)限,常見寫法比如chmod +x 文件名添加執(zhí)行權(quán)限。
還有另外一種寫法,使用數(shù)字來授權(quán),因?yàn)閞=4,w=2,x=1,平時(shí)執(zhí)行命令chmod 777 文件名這就是最高權(quán)限了。
第一個(gè)數(shù)字7=4+2+1代表著所有者的權(quán)限,第二個(gè)數(shù)字7代表所屬組的權(quán)限,第三個(gè)數(shù)字代表其他人的權(quán)限。常見的權(quán)限數(shù)字還有644,所有者有讀寫權(quán)限,其他人只有只讀權(quán)限,755代表其他人有只讀和執(zhí)行權(quán)限。
chown:用于修改文件和目錄的所有者和所屬組。一般用法chown user 文件名用于修改文件所有者,chown user:user 文件名修改文件所有者和組,冒號(hào)前面是所有者,后面是組。
常用的壓縮命令
zip:壓縮zip文件命令,比如zip test.zip 文件名可以把文件壓縮成zip文件,如果壓縮目錄的話則需添加 -r 選項(xiàng)。
unzip:與zip對(duì)應(yīng),解壓zip文件命令。unzip xxx.zip直接解壓,還可以通過 -d 選項(xiàng)指定解壓目錄。
gzip:用于壓縮帶.gz后綴的文件,gzip命令不能打包目錄。需要注意的是直接使用gzip 文件名這個(gè)命令會(huì)導(dǎo)致源文件會(huì)消失,如果要保留源文件,可以使用gzip -c 文件名 > xx.gz,解壓縮直接使用gzip -d xx.gz
tar:tar命令可以為linux的文件和目錄創(chuàng)建檔案。利用tar,可以為某一特定文件創(chuàng)建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。tar常用幾個(gè)選項(xiàng),-x 解打包,-c 打包,-f 指定壓縮包文件名,-v 顯示打包文件過程,一般常用tar -cvf xx.tar 文件名來打包,解壓則使用tar -xvf xx.tar
首先要弄清兩個(gè)概念:打包和壓縮。打包是指將一大堆文件或目錄變成一個(gè)總的文件;壓縮則是將一個(gè)大的文件通過一些壓縮算法變成一個(gè)小文件。為什么要區(qū)分這兩個(gè)概念呢?這源于Linux中很多壓縮程序只能針對(duì)一個(gè)文件進(jìn)行壓縮,這樣當(dāng)你想要壓縮一大堆文件時(shí),你得先將這一大堆文件先打成一個(gè)包(tar命令),然后再用壓縮程序進(jìn)行壓縮(gzip等命令)。
Linux的打包和壓縮是分開的操作,如果要打包并且壓縮的話,按照前面的做法必須先用tar打包,然后再用gzip壓縮。當(dāng)然,還有更好的做法就是-z命令,打包并且壓縮。
使用命令tar -zcvf xx.tar.gz 文件名來打包壓縮,使用命令tar -zxvf xx.tar.gz來解壓縮。
總結(jié)
以上是生活随笔為你收集整理的Linux 面试最高频的 5 个基本问题!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网工协议基础(3) IP地址
- 下一篇: 【干货】你不知道的 Linux 命令使用