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