第13章 linux系統管理技巧(日常運維管理技巧)
這一章的内容是核心,以後會用的幾率也是很大的,隻要掌握必備的基礎知識,做初級系統管理者是不成問題的。
13.1監控系統的狀态
作為一個運維工程師、系統管理者,如果對自己的系統不了解的話,那怎麼排查問題呢?如果出現問題的話,肯定要查一下是什麼問題,哪裡的問題,系統的資源的耗費情況如何檢視。
13.1.1使用w指令檢視目前系統的負載
第一部分是系統時間,使用date指令也可以檢視目前時間。
第二部分是系統運作時間
第三部分是登陸了幾個使用者,從下面可以看到,也可以看到登入了哪個終端。如果是網絡登入的話,終端是ps/0,ps/1這些;如果是系統登入,會出現tty1,tty1- tty6是6個終端。from是可以看出從哪裡來的。
load average是關鍵的一段,這是它的系統負載,平時用的最多的就是這一部分了。它後面跟三個數字,分别是1分鐘、5分鐘、15分鐘内系統的平均負載值。第一個數字是機關時間内使用CPU的活動的程序有多少個,值越大說明伺服器壓力越大。這個數字可以是零點幾,也可以是一百多,目前值是0,說明系統沒有負載,就沒有活動的程序,這說明伺服器處于空閑的狀态。這對于Linux作業系統來講就比較浪費,它在空耗。那什麼值是理想狀态呢?看你有幾顆CPU,這個指的是邏輯CPU,而不是實體CPU。CPU有很多類型,Intel的,AMD的,都會有幾顆CPU,每顆上又會有很多邏輯CPU。檢視CPU的指令如下:
cat /proc/cpuinfo,需要檢視的數字是processor。如果是0,就代表有1顆;是1代表是2顆;如果有39,就代表有40顆。
這裡說的是邏輯CPU,而不是實體CPU。系統上的數字是0,代表有一個CPU,用w指令查到的第一個數字是1是最好的,不閑也沒什麼壓力。processor的最大數字是7,代表最多有8顆CPU,隻要w指令查到的數字不大于8,就是可以的。LOGIN@是登陸的時間,IDLE是空閑了多長時間,PCPU是使用CPU的時間,WHAT是适用的指令,後面的可以不用管它。
還有一個指令是:uptime,它和w指令的結果一樣。
注:/proc/cpuinfo檔案記錄了CPU的詳細資訊。目前市場上多為2顆多核CPU,在Linux看來,它就是2*n個CPU(n為單顆實體CPU上有幾核)。如果n為4,則檢視這個檔案時會顯示8段資訊,而最後一段資訊的processor會顯示7,檢視目前系統有幾個CPU,可以使用指令grep -c 'processor' /proc/cpuinfo。然後檢視有幾顆實體CPU時,則需要檢視關鍵字physical id。
13.1.2用vmstat指令檢視監控系統的狀态
我們用w指令學會了檢視負載情況,如果出現了負載值偏高的情況,如查詢的數字大于CPU核數了,說明CPU不夠用了。此時就需要思考CPU不夠用的原因,程序在幹什麼,都有哪些任務在使用CPU,你可能想去檢視系統的瓶頸在哪裡。
可以查到CPU核數,記憶體,虛拟記憶體交換分區,io就是磁盤,系統的程序等等相關的東西。經常使用vmstat 1指令,每隔一秒輸出一次狀态,感覺差不多可以Ctrl C結束。
當然也可以vmstat 1 5,每隔一秒輸出一次狀态,輸出5次結束。
我們隻需要關心如下幾列:
proc顯示程序的相關資訊:
r,是run的簡寫,表示系統中有多少程序是屬于run的狀态。如果隻有一個CPU,那某一個時間點隻可能有一個程序在使用CPU,其他程序都在排隊。但它們那是循環的,每個程序都有機會使用CPU,都可以使用一會兒。不管是在使用還是在排隊,都是處于r的狀态。如果該數值長期大于伺服器CPU的個數,則說明CPU資源不夠用了。
b,是block的縮寫,表示等待資源的程序數。b就是說程序被CPU以外的資源(硬碟或者網絡)給阻斷了,處于一個等待狀态,卡死了,b被堵死了。比如說網速慢,程序想要給你發一個資料包,假如網速很快,隻需要1秒就發完了。但是現在速度慢,可能就花了10秒鐘,就是因為網速太慢,這個時候隻能等網速了,這就是有多少程序在等待了。
memory顯示記憶體的相關資訊
swpd,表示切換到交換分區中的記憶體數量,機關為KB。以前講分區時,有個swap交換分區,當記憶體不夠時,系統可以把記憶體中的一部分資料臨時放到swap空間裡面去。如果這個數字不變,那還好;如果這個數字在持續不斷的變化,那說明記憶體和交換分區在持續不斷的交換資料,這就說明記憶體不夠了。
free,buff,cache我們講記憶體時,再講這幾個單詞的含義。
swap顯示記憶體的交換情況
si、so和swapd相關,如果swapd頻繁變化,那他們也會相應發生變化。
si:表示有多少資料(塊)是由swap交換區進入記憶體中的,機關為KB。i表示in,進入記憶體的。o表示out,so表示有多少是從記憶體中出來的。
io顯示磁盤的情況
bi,bo是和磁盤有關系的。bi表示從塊裝置讀取資料的量(讀磁盤),機關為KB。bo表示從塊裝置寫入資料的量(寫磁盤),機關為KB。這個資料量很大,說明磁盤在頻繁的讀寫。io相比較磁盤來說,是很慢的。如果有那麼多的資料讀寫,肯定會造成并列增加,因為有很多程序在等待磁盤,這個是必然的。
CPU:顯示CPU的使用狀态
us:表示使用者級别的,比如說一個作業系統,肯定不可能隻運作一個系統,還有跑一些服務。比如跑了一個網站,跑了一個MySQL,網站也好,MySQL也好,肯定會占一些資源,它就會展現us這一方面了,user占用的情況。us的數字是不會超過100的,因為一共就100%。us數字表示使用者下的資源占用CPU的百分比,us長期大于50就說明系統資源不夠了。
sy:顯示系統本身花費CPU的時間百分比。
id:表示空閑的百分比us+sy+id=100
wa:wait等待,表示I/O等待所占用CPU的時間百分比,這一列很大,說明CPU不夠用了。
通過vmstat指令可以判定出系統的瓶頸,如CPU不夠,記憶體不夠,還是磁盤io太大。
13.1.3用top指令顯示程序所占的系統資源
可以用top檢視具體的程序。
第一行和w指令查到的是一樣的,總共有多少任務,有多少運作的任務,有多少正在sleeping的任務。僵屍程序,主程序被意外終止,子程序就沒人管了,就比較尴尬,沒人管,隻能自生自滅。
風扇轉的歡,CPU很燙,說明CPU使用率很高。us長期在60%以上是對CPU沒有好處的。
下面是真正需要關心的東西,預設情況下,它會按CPU百分比從高到低排序,%MEM是記憶體,RES是實體記憶體大小,機關是KB千位元組。
按大小字母M,會出現按記憶體使用大小排序,可以看到程序使用記憶體的具體大小。按大小字母P,換回CPU使用大小排序。按1的話,下面會列出
所有的CPU使用情況。按字母q會推出top指令。
使用top -c指令可以檢視具體的程序指令,全局的路徑。
使用top -bn1指令,可以靜态的一次性的把所有的資訊全部顯示出來。
這種用法适合在寫腳本的時候用。
可以關注一下PID,比如說要殺死一個指令,可以使用PID去殺。kill PID指令就可以殺死一個程序。
USER是哪個使用者運作的,PR、NI是關于優先級的,不需要過多關注。
注:使用top指令重點檢視的還是下面的程序使用系統資源的詳細狀況。
13.1.4用sar指令監控系統狀态
sar是一個非常全面的分析系統狀态的指令,主要用來檢視網卡的流量。它同樣可以檢視你的CPU、記憶體、磁盤的狀态,它被稱為linux系統中的瑞士×××,也就是它的指令非常複雜和豐富。與其他系統狀态監控工具不同,它可以列印曆史資訊,可以顯示當天從零點開始到目前時刻的系統狀态資訊。
如果沒有這個指令,可以通過
yum install -y sysstat來安裝。
安裝完這個指令,首次使用這個指令會出現如下錯誤,那是因為sar工具還沒有生成相應的資料庫檔案(無需時時監控,因為不用去查詢那個庫檔案)。
如果sar不加參數的話,它會調用系統裡面保留的曆史檔案,
這個目錄就是它生成的曆史檔案所在的目錄,什麼叫曆史檔案呢?因為sar有一個特性,每10分鐘會把系統的狀态過濾一遍,抓一邊儲存在檔案裡,這個檔案就存在上面的目錄裡。
這個指令要想用,需要加上合适的選項和參數,如果要檢視網卡的流量,需要使用如下指令:
這個用法和vmstat的用法類似,就是每隔1秒鐘顯示1次,總共顯示10次結束。
IFACE表示網卡的名字。
rxpck/s和txpck/s表示每秒鐘的包的數量,機關是個。rx是receive的簡寫,代表收取的,tx代表發送的。
rxkB/s這一清單示每秒收取的資料量(機關是KB)
txkB/s這一清單示每秒發送的資料量(後面幾列不需要關注,阿銘老師工作這麼多年,後面幾列都是不超過0的,也就是都是0)
一個網站如果遭到攻擊,它會發送很多的資料包給你的網站,意味着你要接受很多的資料包。量很大的話,意味着你的網卡承擔不了,最終導緻網絡堵塞,你的網站不能打開。
那多少包合适呢?
有時候也要關注網卡是否跑滿,比如你的公司買了一個機櫃,配置設定了一些帶寬(比如說100M),100M不大,如果換算成正常了解的就是12.5M/s,也不是很大。如果有幾個人同時下載下傳的話,很快就占滿了。如果rxpck/s的資料包有幾千是正常的,如果有幾萬的話,就不正常了。有幾萬,幾十萬的話,就是被攻擊了。如果被攻擊了,可以看rxpck/s的資料包有多少,這個不太确定,需要用抓包工具。
使用如下指令可以檢視某一天的網卡流量:
sar -n DEV -f /var/log/sa/sarn,n代表具體的日期
資料在這個目錄下最多保留一個月
sar -q是檢視伺服器在過去的某個時間的負載情況
sar -b是檢視磁盤的
下面的指令是看它的讀和寫
13.1.5用nload指令檢視網卡流量
sar指令可以檢視網卡流量,但是不夠直覺,使用nload指令更好。nload指令預設沒有安裝,需要使用如下指令安裝:
yum install -y epel-release;yum install -y nload
安裝完運作,就會出現動态的顯示網卡:
最上面一行是網卡名字以及IP位址,按向右箭頭可以檢視其他網卡的網絡流量。輸出結果分為兩部分,Incoming為進入網卡的流量,Outgoing為網卡出去的流量,我們關注的當然是Curr那行的資料,其機關也可以動态自動調整,非常人性化。按q退出該界面。買的帶寬是出去的帶寬,如果有攻擊,進來的數字就會很大。
sar的補充内容:
這個目錄等到明天才會生成,sar28是可以通過cat來檢視的,而sa28不能。
13.1.6監控io性能(這個是關于磁盤的,磁盤的狀态的兩個指令)
在日常運維過程中,除了CPU、記憶體外,磁盤的io也是非常重要的名額。有時候CPU、記憶體明明有剩餘,但系統就是負載很高,我們用vmstat指令檢視會發現b列或wa列比較大,那就說明系統磁盤有瓶頸。
我們在安裝sysstat包時,就會安裝iostat指令,它和sar屬于同一個包。
iostat的用法:
也可以
要講的是iostat -x指令,這裡有一個非常重要的名額。
%util首先是一個百分比,這一清單示io等待,總之就是磁盤使用有多少時間是占用你CPU的。CPU有一部分時間是給程序處理、計算的,也有一部分是等待io的,等待磁盤讀寫的。如果這個數字是50%以上,就說明磁盤太差了,它非常忙碌。如果硬碟有問題,即使CPU再快,再厲害,還是存在很大的瓶頸。如果磁盤嚴重不行,隻能更換磁盤。
如果發現磁盤io很忙,很頻繁,如果想知道是哪一個程序在頻繁的讀寫,就可以使用Iotop指令。但發現沒有安裝,使用yum install -y iotop安裝。
它和top很像,是動态的,按排行來排。
我們看的是IO百分比
13.1.7用free指令檢視記憶體使用情況
free指令可以檢視目前系統的總記憶體大小以及使用記憶體的情況。CentOS 7系統的free指令顯示結果比CentOS 6更簡潔一些,但大體一緻。
總共有三行,第一行是說明,第二行是記憶體的使用情況,第三行是交換分區的情況。
total:記憶體總大小
used:真正使用的實際記憶體大小
free:剩餘實體記憶體大小(沒有被配置設定,純剩餘)
shared:共享記憶體大小,這個不用關注
buff/cache:配置設定格buff/cache的記憶體總共有多大。
簡單區分一下buff(緩沖)和cache(緩存),資料的流向不一樣,所叫的名字也不一樣。buff/cache都是一部分記憶體,記憶體的作用就是緩解CPU和IO(如,磁盤)的的速度差距的。可以這樣了解:資料經過CPU計算,即将要寫入磁盤,這是用的記憶體為fuff;CPU要計算時,需要把資料從磁盤中讀出來,臨時先放到記憶體中,這部分記憶體就是cache。
avaliable:系統可使用記憶體有多大,它包含了free。linux系統為了讓應用跑得更快,系統會預先預留出一部分(buff/cache)給某些應用使用,雖然這部分記憶體并沒有真正使用,但也已經配置設定出去了。然而,當另外一個服務要使用更多記憶體時,是可以把這一部分預先配置設定的記憶體拿來用的。是以,
available=free+buff/cache
total=used+free+buff/cache
buffer和cache如此重要,系統會預先預留出一部分給buffer和cache。
使用free指令需要關注的是available這一項。
13.1.8使用ps檢視系統程序
ps -elf和ps aux結果差不多
vmstat根本占用不了CPU多少時間,運作一下就sleep了。+說的是前台程序,說的是終端上的程序。
Z表示僵屍程序,這種程序不多,也會有。如果多的話,就想辦法把它殺死。
<表示高優先級程序,優先級比較高,CPU先緊着給它用。
N表示低優先級程序,有Z相對,意味着它 不着急,晚一點用也沒關系。
|多線程程序,線程和程序是有差別的,線程有一個大的程序組成的,一個程序裡面有多個線程。概念回去查一查,程序和程序之間記憶體互相之間是不共享的,但線程之間使用了同一個程序的記憶體的區域。比如給程序配置設定了一個程序塊,這個程序本來對這個記憶體是有使用權限的,但它下面的線程不管有多少,它們共享這一塊記憶體,這就是線程的特點。多線程程序是說,程序有多個線程。
13.1.9用netstat指令檢視網絡狀态
linux作為伺服器的作業系統,伺服器上會有很多服務,服務往往是和用戶端互相通信的,這就意味着它要有監聽端口,要有對外的通信端口。這個指令檢視的就是TCP/IP通信的狀态。安裝一個MySQL,提供一個資料庫服務,就要有一個監聽端口,那麼何為監聽端口?正常情況下一台機器是沒有任何的端口監聽的,這就意味着它沒有辦法和其他的機器通信。你要想讓其他人通路你的網站,它就需要監聽一個端口,它把這個端口放開,打開一個孔。就像網卡上搞了一個小孔出來,然後遠端的裝置想辦法和這個裝置相連,資料就可以通過這個孔進入到網卡裡,進入到伺服器裡,互相的進行通信。
端口檢視指令:
l代表的是listen
sshd有兩個,一個是tcp,一個是tcp6,tcp6就是Ipv6(tcp和udp的資料自行查閱,這個不作為重點)
master 25端口,發郵件的端口
第二個指令:
這個指令會檢視tcp/ip狀态
擴充知識:tcp/ip的三次握手,四次揮手,這個往往在面試的時候被問到
檢視tcp/ip,需要關注一個值就是ESTABLISHED,如果這個值很大,說明你的系統很忙。并發連接配接數,就是同一時間有多少用戶端在連接配接你,我們可以那這個數字來說明并發連接配接數有多少。上面說明有45個用戶端和服務端進行通信,正在連接配接。這個是真正的通信,1000以内伺服器都是能接受的。
ss -an 指令也能顯示tcp/ip的狀态
它有一個缺點,它不會顯示程序的名字,vmstst -lntp指令可以
13.1.10linux下的抓包工具