Linux系統(tǒng)日常管理--監(jiān)控系統(tǒng)的狀態(tài)+排查是否正被攻擊
概述
工作中有時領(lǐng)導(dǎo)會說明天有業(yè)務(wù),讓你去檢查下服務(wù)器,監(jiān)控下系統(tǒng)的狀態(tài)是不是正常的,這時候我們需要查看哪些信息呢?下面從負載、進程、內(nèi)存、網(wǎng)絡(luò)、網(wǎng)卡等幾個方面來介紹下怎么去監(jiān)控>
1. w查看當前系統(tǒng)的負載
參數(shù)說明:
第一行從左面開始顯示的信息依次為:時間,系統(tǒng)運行時間,登錄用戶數(shù),平均負載。
第二行開始以及下面所有的行,告訴我們的信息是,當前登錄的都有哪些用戶,以及他們是從哪里登錄的等等。其實,在這些信息當中,我們最應(yīng)該關(guān)注的應(yīng)該是第一行中的 ‘load average:’ 后面的三個數(shù)值。
- 第一個數(shù)值表示1分鐘內(nèi)系統(tǒng)的平均負載值;
- 第二個數(shù)值表示5分鐘內(nèi)系統(tǒng)的平均負載值;
- 第三個數(shù)值表示15分鐘系統(tǒng)的平均負載值。
這個值的意義是,單位時間段內(nèi)CPU活動進程數(shù)。
當然這個值越大就說明你的服務(wù)器壓力越大。一般情況下這個值只要不超過服務(wù)器的cpu數(shù)量就沒有關(guān)系。
2. vmstat 監(jiān)控系統(tǒng)的狀態(tài)
上面講的 w 查看的是系統(tǒng)整體上的負載,通過看那個數(shù)值可以知道當前系統(tǒng)有沒有壓力,但是具體是哪里(CPU, 內(nèi)存,磁盤等)有壓力就無法判斷了。通過 vmstat 就可以知道具體是哪里有壓力。vmstat命令打印的結(jié)果共分為6部分:procs, memory, swap, io, system, cpu. 請重點關(guān)注一下r b si so bi bo幾列。
2.1、procs 顯示進程相關(guān)信息
- r :表示運行和等待cpu時間片的進程數(shù),如果長期大于服務(wù)器cpu的個數(shù),則說明cpu不夠用了;
- b :表示等待資源的進程數(shù),比如等待I/O, 內(nèi)存等,這列的值如果長時間大于1,則需要關(guān)注一下了;
2.2、memory 內(nèi)存相關(guān)信息
- swpd :表示切換到交換分區(qū)中的內(nèi)存數(shù)量 ;
- free :當前空閑的內(nèi)存數(shù)量;buff :緩沖大小,(即將寫入磁盤的);
- cache :緩存大小,(從磁盤中讀取的);
2.3、swap 內(nèi)存交換情況
- si :由交換區(qū)寫入到內(nèi)存的數(shù)據(jù)量;
- so :由內(nèi)存寫入到交換區(qū)的數(shù)據(jù)量;
2.4、io 磁盤使用情況
- bi :從塊設(shè)備讀取數(shù)據(jù)的量(讀磁盤);
- bo: 從塊設(shè)備寫入數(shù)據(jù)的量(寫磁盤);
2.5、system 顯示采集間隔內(nèi)發(fā)生的中斷次數(shù)
- in :表示在某一時間間隔中觀測到的每秒設(shè)備中斷數(shù);
- cs :表示每秒產(chǎn)生的上下文切換次數(shù);
2.6、CPU 顯示cpu的使用狀態(tài)
- us :顯示了用戶下所花費 cpu 時間的百分比;
- sy :顯示系統(tǒng)花費cpu時間百分比;id :表示cpu處于空閑狀態(tài)的時間百分比;
- wa :表示I/O等待所占用cpu時間百分比;
- st :表示被偷走的cpu所占百分比(一般都為0,不用關(guān)注);
以上所介紹的各個參數(shù)中,我一般主要關(guān)注r列,b列,和wa列,三列代表的含義在上邊說得已經(jīng)很清楚。IO部分的bi以及bo也是要經(jīng)常參考的對象。如果磁盤io壓力很大時,這兩列的數(shù)值會比較高。另外當si, so兩列的數(shù)值比較高,并且在不斷變化時,說明內(nèi)存不夠了,內(nèi)存中的數(shù)據(jù)頻繁交換到交換分區(qū)中,這往往對系統(tǒng)性能影響極大。
注意:一般使用 vmstat 查看系統(tǒng)狀態(tài)的時候,通常都是使用這樣的形式來看的:
# vmstat 1 5
說明:每隔一秒鐘打印一次狀態(tài),共打印5次。
3. top 顯示進程所占系統(tǒng)資源
這個命令用于動態(tài)監(jiān)控進程所占系統(tǒng)資源,每隔3秒變一次。這個命令的特點是把占用系統(tǒng)資源(CPU,內(nèi)存,磁盤IO等)最高的進程放到最前面。top命令打印出了很多信息,包括系統(tǒng)負載(loadaverage)、進程數(shù)(Tasks)、cpu使用情況、內(nèi)存使用情況以及交換分區(qū)使用情況。其實上面這些內(nèi)容可以通過其他命令來查看,所以用top重點查看的還是下面的進程使用系統(tǒng)資源詳細狀況。這部分東西反映的東西還是比較多的。
PS:分享下我經(jīng)常用的一個命令 top -bn1 它表示非動態(tài)打印系統(tǒng)資源使用情況,可以用在shell腳本中:
和 top 命令唯一的區(qū)別就是,它一次性全部把所有信息輸出出來而非動態(tài)顯示。
4. sar監(jiān)控系統(tǒng)狀態(tài)
sar 命令很強大,它可以監(jiān)控系統(tǒng)所有資源狀態(tài),比如平均負載、網(wǎng)卡流量、磁盤狀態(tài)、內(nèi)存使用等等。它不同于其他系統(tǒng)狀態(tài)監(jiān)控工具的地方在于,它可以打印歷史信息,可以顯示當天從零點開始到當前時刻的系統(tǒng)狀態(tài)信息。如果你系統(tǒng)沒有安裝這個命令,請使用 yum install -y sysstat (或者apt-get install -y sysstat)命令安裝。初次使用sar命令會報錯,那是因為sar工具還沒有生成相應(yīng)的數(shù)據(jù)庫文件(時時監(jiān)控就不會了,因為不用去查詢那個庫文件)。它的數(shù)據(jù)庫文件在 “/var/log/sa/” 目錄下,默認保存一個月。因為這個命令太過復(fù)雜,所以我只介紹幾個。
4.1、查看網(wǎng)卡流量 sar -n DEV
參數(shù)說明: IFACE這列表示設(shè)備名稱,rxpck/s 表示每秒進入收取的包的數(shù)量,txpck/s 表示每秒發(fā)送出去的包的數(shù)量,rxbyt/s 表示每秒收取的數(shù)據(jù)量(單位Byte),txbyt/s表示每秒發(fā)送的數(shù)據(jù)量。后面幾列不需要關(guān)注。
如果有一天你所管理的服務(wù)器丟包非常嚴重,那么你就應(yīng)該看一看這個網(wǎng)卡流量是否異常了,如果rxpck/s 那一列的數(shù)值大于4000,或者rxbyt/s那列大于5,000,000則很有可能是被攻擊了,正常的服務(wù)器網(wǎng)卡流量不會高于這么多,除非是你自己在拷貝數(shù)據(jù)。
上面的命令是查看網(wǎng)卡流量歷史的,如何時時查看網(wǎng)卡流量呢?
4.2、查看歷史負載 sar -q
這個命令可以查看服務(wù)器在過去的某個時間的負載狀況。
大家重點還是用來看是不是丟包和網(wǎng)絡(luò)情況吧!
5. free查看內(nèi)存使用狀況
只需要敲一個 free 然后回車就可以當前系統(tǒng)的總內(nèi)存大小以及使用內(nèi)存的情況,還可以加-m 或者-g選項分別以M或G為單位打印內(nèi)存使用狀況:
我一般用free -m方式查看內(nèi)存占用情況(兆為單位),而系統(tǒng)實際可用內(nèi)存以及可用內(nèi)存有如下幾個加減法:
- used=total-free 即 total=used+free
- 實際內(nèi)存占用:used-buffers-cached 即 total-free-buffers-cached
- 實際可用內(nèi)存:buffers+cached+free
6. ps 查看系統(tǒng)進程
監(jiān)控進程的話這里介紹一個專門顯示系統(tǒng)進程的命令,主要看下是不是有異常進程:
參數(shù)說明:
PID :進程的id,這個id很有用,在linux中內(nèi)核管理進程就得靠pid來識別和管理某一個程,比如我想終止某一個進程,則用 ‘kill 進程的pid 有時并不能殺掉,則需要加一個-9選項了 kill -9 進程pid
STAT :表示進程的狀態(tài),進程狀態(tài)分為以下幾種(不要求記住,但要了解)
D 不能中斷的進程(通常為IO)
R 正在運行中的進程
S 已經(jīng)中斷的進程,通常情況下,系統(tǒng)中大部分進程都是這個狀態(tài)
T 已經(jīng)停止或者暫停的進程,如果我們正在運行一個命令,比如說 sleep 10 如果我們按一下ctrl -z 讓他暫停,那么我們用ps查看就會顯示T這個狀態(tài)
W 這個好像是說,從內(nèi)核2.6xx 以后,表示為沒有足夠的內(nèi)存頁分配
X 已經(jīng)死掉的進程(這個好像從來不會出現(xiàn))
Z 僵尸進程,殺不掉,打不死的垃圾進程,占系統(tǒng)一小點資源,不過沒有關(guān)系。如果太多,就有問題了。一般不會出現(xiàn)。
< 高優(yōu)先級進程
N 低優(yōu)先級進程
L 在內(nèi)存中被鎖了內(nèi)存分頁
s 主進程
l 多線程進程
+ 代表在前臺運行的進程
這個ps命令是我在工作中用的非常多的命令之一,必須掌握的。關(guān)于ps命令的使用,小編經(jīng)常會連同管道符一起使用,用來查看某個進程或者它的數(shù)量。
7. netstat 查看網(wǎng)絡(luò)狀況
netstat命令用來打印網(wǎng)絡(luò)連接狀況、系統(tǒng)所開放端口、路由表等信息。小編最常用的關(guān)于netstat的命令就是這個 netstat -nlp (打印當前系統(tǒng)啟動哪些端口)以及 netstat -an (打印網(wǎng)絡(luò)連接狀況)這兩個命令非常有用,請一定要記住。
如果你所管理的服務(wù)器是一臺提供web服務(wù)(80端口)的服務(wù)器,那么你就可以使用 netstat -an |grep 80 查看當前連接web服務(wù)的有哪些IP了,再進一步可以netstat -an|grep 80|wc -l來查看大概有多少個連接。
8、抓包工具tcpdump
有時候,也許你會有這樣的需求,想監(jiān)控一下某個網(wǎng)卡上都有哪些數(shù)據(jù)包,尤其是當你初步判定你的服務(wù)器上有流量攻擊。這時,使用抓包工具來抓一下數(shù)據(jù)包,就可以知道有哪些IP在攻擊你了。
如果沒有tcpdump 這個命令,需要用 yum install -y tcpdump 命令去安裝一下。上例中第三列和第四列顯示的信息為哪一個IP+port在連接哪一個IP+port,后面的信息是該數(shù)據(jù)包的相關(guān)信息,如果不懂也沒有關(guān)系,畢竟我們不是專門搞網(wǎng)絡(luò)的,而這里需要關(guān)注的只是第三列以及第四列。-i 選項后面跟設(shè)備名稱,如果你想抓eth1網(wǎng)卡的包,后面則要跟eth1.至于-nn選項的作用是讓第三列和第四列顯示成IP+端口號的形式,如果不加-nn則顯示的是主機名+服務(wù)名稱。