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命令觀察,假設發現現在確實是高負載低使用率。

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佔用率高的進程

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 文件名修改文件所有者和組,冒號前面是所有者,後面是組。

常用的壓縮命令
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來解壓縮。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章