1. 程式人生 > >2018.1.23 7周2次課

2018.1.23 7周2次課

not 路由表 設備名 服務器 ctrl+ web 條件 命令 window

七周二次課(1月23日)

10.6 監控io性能

10.7 free命令

10.8 ps命令

10.9 查看網絡狀態

10.10 linux下抓包

10.6 監控io性能

1. iostat來對linux硬盤IO性能進行檢測

使用iostat,需要先安裝sysstat ,即yum -y install sysstat

iostat可以產生三種類型的報告:CPU利用情況報告、設備利用情況報告、網絡文件系統利用情況報告。

iostat命令格式可概述為:

iostat[參數][時間][次數]

其中,時間以秒為單位。

1)iostat命令的參數說明

-c 僅顯示 CPU 統計信息。與 -d 選項互斥。

-d 僅顯示磁盤統計信息。與 -c 選項互斥。

-k 以 KB為單位顯示每秒的磁盤請求數,默認單位塊。

-m 以MB為單位顯示每秒的磁盤請求數。

-N 顯示磁盤陣列信息

-n 顯示網絡文件系統NFS報告。此選項僅適用於Linux內核2.6.17以上版本。

-p device | ALL

與 -x 選項互斥,用於顯示塊設備及系統分區的統計信息,也可以在 -p 後指定一個設備名,如:

# iostat -p hda

或顯示所有設備:

# iostat -p ALL

-t 在輸出數據時,打印收集數據的時間。

-V 打印版本號和幫助信息。

-x 輸出擴展信息。

2)iostat 命令的簡單使用

iostat 命令可以顯示 CPU 和 I/O 系統的負載情況及分區狀態信息。

直接執行 iostat 命令可以顯示下面的內容:

技術分享圖片

各項輸出項目的含義如下:

1)avg-cpu段:

%user:在用戶級別運行所使用 CPU 的百分比。

%nice:nice操作所使用 CPU 的百分比。

%system:在系統級別(kernel)運行所使用 CPU 的百分比。

%iowait:CPU等待硬件 I/O 時,所占用 CPU 百分比。

%steal:管理程序維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。

%idle:CPU 空閑時間的百分比。

Device段:

tps:該設備每秒的傳輸次數,一次傳輸的意思是“一次I/O請求”

kB_read/s:每秒從設備讀取的數據量

kB_wrtn/s :每秒向設備寫入的數據量

kB_read :讀取的總數據量

kB_wrtn :寫入的總數量數據量

技術分享圖片

Device段:

rrqm/s: 每秒進行合並的讀操作數目。即 delta(rmerge)/s

wrqm/s: 每秒進行合並的寫操作數目。即 delta(wmerge)/s

r/s: 每秒完成的讀 I/O 設備次數。即 delta(rio)/s

w/s: 每秒完成的寫 I/O 設備次數。即 delta(wio)/s

rsec/s: 每秒讀扇區數。即 delta(rsect)/s

wsec/s: 每秒寫扇區數。即 delta(wsect)/s

rkB/s: 每秒讀K字節數。是 rsect/s 的一半,因為每扇區大小為512字節。(需要計算)

wkB/s: 每秒寫K字節數。是 wsect/s 的一半。(需要計算)

avgrq-sz: 平均每次設備I/O操作的數據大小 (扇區)。delta(rsect+wsect)/delta(rio+wio)

avgqu-sz: 平均I/O隊列長度。即 delta(aveq)/s/1000 (因為aveq的單位為毫秒)。

await: 平均每次設備I/O操作的等待時間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)

svctm: 平均每次設備I/O操作的服務時間 (毫秒)。即 delta(use)/delta(rio+wio)

%util: 一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的。即 delta(use)/s/1000 (因為use的單位為毫秒)

如果%util接近100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸;idle小於70% IO壓力就較大了,一般讀取速度有較多的wait。

2. iotop命令是一個用來檢測磁盤I/O使用情況的top類工具。iotop具有與top相似的UI,其中包括PID,用戶,I/O,進程等相關信息。

linux下的IO統計工具如iostat,nmon等大多數是只能統計到每設備的讀寫情況,如果你想知道每個進程是如何使用的就比較麻煩,使用iotop命令可以很方便的查看。

需要安裝 yum install -y iotop

命令格式

iotop (選項)

選項:

-o : 只顯示有io操作的進程

-b : 批量顯示,無交互,主要用作記錄到文件

-n NUM: 顯示NUM次,主要用於非交互模式

-d SEC: 間隔SEC秒顯示一次

-p PID: 監控的進程pid

-u USER: 監控的進程用戶

iotop常用快捷鍵:

1. 左右箭頭:改變排序方式,默認是按IO排序

2. r:改變排序順序

3. o:只顯示有io輸出的進程

4. p:進程/線程的顯示方式的切換

5. a:顯示累積使用量

6. q:退出

10.7 free命令

用free命令查看內存使用狀況

技術分享圖片

free命令可以查看當前系統的總內存大小以及使用內存的情況。

  • total:內存總大小。

  • used:真正使用的實際內存大小。

  • free:剩余物理內存大小(沒有被分配,純剩余)。

  • shared:共享內存大小,不用關註它

  • buff/cache:分配給buffer和cache的內存總共有多大。關於buffer和cache大家也許有一些疑惑,因為字面意思上兩者很相近。教你一個很容易區分這兩者的方法,buffer和cache都是一部分內存,內存的作用就是緩解CPU和IO(如磁盤)的速度差距的,你可以這樣理解:數據經過CPU計算,即將要寫入磁盤,這時用的內存為buffer;CPU要計算時,需要把數據從磁盤中讀出來,臨時先放到內存中,這部分內存就是cache。

  • available:系統可使用內存有多大,它包含了free。 Linux系統為了讓應用跑得更快,會預先分配一部分內存(buffer/cache)給某些應用使用,雖然這部分內存並沒有真正使用,但也已經分配出去了。然而,當另外一個服務要使用更多內存時, 是可以把這部分預先分配的內存拿來用的。所以還沒有被占用的這部分buffer和cache再加上行free就是available。

這個free命令顯示的結果中,其實有一個隱藏的公式:total=used+free+buff/cache。另外,available是由free這部分內存和buff/cache還未被占用的那部分內存組成。used那部分內存和 buff/ cache被占用的內存是沒有關系的。

另外free命令還可以加-m和-g選項(分別以MB或GB為單位)打印內存的使用狀況,也支持-h選項

技術分享圖片

10.8 ps命令

系統管理員一定要知道你所管理的系統都有哪些進程在運行,在windows下只要打開任務管理器即可查看。那麽在Linux下如何查看呢?其實使用前面介紹的top命令就可以,但是查看起來沒有ps命令方便,它是專門顯示系統進程的命令

技術分享圖片

技術分享圖片

  1. USER: 進程擁有者

  2. PID:表示進程的ID,這個ID很有用在Linux中,內核管理進程就得靠pid來識別和管理某一個進程。比如我想終止某一個進程,則用命令"kill進程的pid"。有時這樣並不能終止進程,需要加-9選項,即"kill 9進程的pid",但這樣有點暴力,嚴重的時候會丟數據,所以盡量還是別用。在/proc/目錄下,每個進程都有PID id開頭的目錄。

  3. %CPU: 占用的 CPU 使用率

  4. %MEM: 占用的物理內存的使用率

  5. VSZ: 占用的虛擬內存大小

  6. RSS: 占用的內存大小

  7. TTY: 在哪個終端機上面運作,若與終端機無關,則顯示 ?

  8. STAT:進程的狀態。進程狀態分為以下幾種

  • D:不能中斷的進程(通常為IO)。

  • R (run):正在運行中的進程,其中包括了等待CPU時間片的進程。

  • S (sleep):已經中斷的進程。通常情況下,系統的大部分進程都是這個狀態。

  • T:已經停止或者暫停的進程。如果我們正在運行一個命令,比如說sleep 10,我們按一下 ctrl+z暫停進程時,用ps命令查看就會顯示T這個狀態。

  • W(內核2 · 6xx以後不可用),沒有足夠的內存頁分配。

  • X:已經死掉的進程(這個好像從來不會出現)。

  • Z:僵屍進程,即殺不掉、打不死的垃圾進程,占用系統一點資源,不過沒有關系。如果占用太多(一般不會出現),就需要重視了。

  • <:高優先級進程。

  • N:低優先級進程。

  • L:在內存中被鎖了內存分頁。

  • s:主進程,後面講到nginx或者php-fpm服務的時候,你就能更好地理解它了。

  • l:多線程進程。(1個進程裏有多個線程)

  • +:在前臺運行的進程,比如在當前終端執行ps aux就是前臺進程。

  1. START: 進程開始時間

  2. TIME: 執行的時間

  3. COMMAND:所執行的指令

ps命令是在工作中用得非常多的一個命令,所以請記住它。經常會將ps連同管道符一起使用,用來查看某個進程或者它的數量

技術分享圖片

10.9 查看網絡狀態

Netstat 命令用於顯示各種網絡相關信息,如網絡連接,路由表,接口狀態 (Interface Statistics),masquerade 連接,多播成員 (Multicast Memberships) 等等。

netstat 查看網絡狀態

技術分享圖片

從整體上看,netstat的輸出結果可以分為兩個部分:

一個是Active Internet connections,稱為有源TCP連接,其中"Recv-Q"和"Send-Q"指的是接收隊列和發送隊列,這些數字一般都應該是0。如果不是則表示軟件包正在隊列中堆積,這種情況非常少見。

另一個是Active UNIX domain sockets,稱為有源Unix域套接口(和網絡套接字一樣,但是只能用於本機通信,性能可以提高一倍)。

Proto顯示連接使用的協議,

RefCnt表示連接到本套接口上的進程數量,

Types顯示套接口的類型,

State顯示套接口當前的狀態,

Path表示連接到套接口的其它進程使用的路徑名。

常見參數

-a (all)顯示所有選項,netstat默認不顯示LISTEN相關

-t (tcp)僅顯示tcp相關選項

-u (udp)僅顯示udp相關選項

-n 拒絕顯示別名,能顯示數字的全部轉化成數字。(重要)

-l 僅列出有在 Listen (監聽) 的服務狀態

-p 顯示建立相關鏈接的程序名(macOS中表示協議 -p protocol)

-r 顯示路由信息,路由表

-e 顯示擴展信息,例如uid等

-s 按各個協議進行統計 (重要)

-c 每隔一個固定時間,執行該netstat命令。

提示:LISTEN和LISTENING的狀態只有用-a或者-l才能看到

netstat 命令用來打印網絡連接狀態、系統所開發端口、路由表等信息。

netstat -lnp 查看監聽端口,打印當前系統啟動哪些端口。

netstat -lntp 只看出tcp的,不包含socket

netstat -an 查看系統的網絡連接狀況

ss -an 和nestat異曲同工,但不會顯示進程的名字。

查看所有狀態數字的awk命令

netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'

技術分享圖片

10.10 linux下抓包

有時也許想看一下某個網卡上都有哪些數據包,尤其是當你初步判定服務器上有流量攻擊時,使用抓包工具來抓取數據包就可以知道有哪些IP在攻擊了。

tcpdump命令,需要使用命令yum install -y tcpdump安裝。

它的命令格式為:

tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]

[ -s snaplen ] [ -w file ] [ expression ]

1. 抓包選項:

-c:指定要抓取的包數量。註意,是最終要獲取這麽多個包。例如,指定"-c 10"將獲取10個包,但可能已經處理了100個包,只不過只有10個包是滿足條件的包。

-i interface:指定tcpdump需要監聽的接口。若未指定該選項,將從系統接口列表中搜尋編號最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),

:一旦找到第一個符合條件的接口,搜尋馬上結束。可以使用'any'關鍵字表示所有網絡接口。

-n:對地址以數字方式顯式,否則顯式為主機名,也就是說-n選項不做主機名解析。

-nn:除了-n的作用外,還把端口顯示為數值,否則顯示端口服務名。

-N:不打印出host的域名部分。例如tcpdump將會打印'nic'而不是'nic.ddn.mil'。

-P:指定要抓取的包是流入還是流出的包。可以給定的值為"in"、"out"和"inout",默認為"inout"。

-s len:設置tcpdump的數據包抓取長度為len,如果不設置默認將會是65535字節。對於要抓取的數據包較大時,長度設置不夠可能會產生包截斷,若出現包截斷,

:輸出行中會出現"[|proto]"的標誌(proto實際會顯示為協議名)。但是抓取len越長,包的處理時間越長,並且會減少tcpdump可緩存的數據包的數量,

:從而會導致數據包的丟失,所以在能抓取我們想要的包的前提下,抓取長度越小越好。

輸出選項:

-e:輸出的每行中都將包括數據鏈路層頭部信息,例如源MAC和目標MAC。

-q:快速打印輸出。即打印很少的協議相關信息,從而輸出行都比較簡短。

-X:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出。

-XX:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出,更詳細。

-v:當分析和打印的時候,產生詳細的輸出。

-vv:產生比-v更詳細的輸出。

-vvv:產生比-vv更詳細的輸出。

其他功能性選項:

-D:列出可用於抓包的接口。將會列出接口的數值編號和接口名,它們都可以用於"-i"後。

-F:從文件中讀取抓包的表達式。若使用該選項,則命令行中給定的其他表達式都將失效。

-w:將抓包數據輸出到文件中而不是標準輸出。可以同時配合"-G time"選項使得輸出文件每time秒就自動切換到另一個文件。可通過"-r"選項載入這些文件以進行分析和打印。

-r:從給定的數據包文件中讀取數據。使用"-"表示從標準輸入中讀取。

2. tcpdump表達式

表達式用於篩選輸出哪些類型的數據包,如果沒有給定表達式,所有的數據包都將輸出,否則只輸出表達式為true的包。在表達式中出現的shell元字符建議使用單引號包圍。

tcpdump的表達式由一個或多個"單元"組成,每個單元一般包含ID的修飾符和一個ID(數字或名稱)。有三種修飾符:

(1).type:指定ID的類型。

可以給定的值有host/net/port/portrange。例如"host foo","net 128.3","port 20","portrange 6000-6008"。默認的type為host。

(2).dir:指定ID的方向。

可以給定的值包括src/dst/src or dst/src and dst,默認為src or dst。例如,"src foo"表示源主機為foo的數據包,"dst net 128.3"表示目標網絡為128.3的數據包,"src or dst port 22"表示源或目的端口為22的數據包。

(3).proto:通過給定協議限定匹配的數據包類型。

常用的協議有tcp/udp/arp/ip/ether/icmp等,若未給定協議類型,則匹配所有可能的類型。例如"tcp port 21","udp portrange 7000-7009"。

所以,一個基本的表達式單元格式為"proto dir type ID"

除了使用修飾符和ID組成的表達式單元,還有關鍵字表達式單元:gateway,broadcast,less,greater以及算術表達式。

表達式單元之間可以使用操作符" and / && / or / || / not / ! "進行連接,從而組成復雜的條件表達式。如"host foo and not port ftp and not port ftp-data",這表示篩選的數據包要滿足"主機為foo且端口不是ftp(端口21)和ftp-data(端口20)的包",常用端口和名字的對應關系可在linux系統中的/etc/service文件中找到。

另外,同樣的修飾符可省略,如"tcp dst port ftp or ftp-data or domain"與"tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"意義相同,都表示包的協議為tcp且目的端口為ftp或ftp-data或domain(端口53)。

使用括號"()"可以改變表達式的優先級,但需要註意的是括號會被shell解釋,所以應該使用反斜線"\"轉義為"\(\)",在需要的時候,還需要包圍在引號中。

技術分享圖片

我們只需要關註第3列和第4列,它們顯示的信息為哪一個IP+端口號在連接哪一個IP+端口號。後面的信息是該數據包的相關信息,如果不懂也沒有關系。

-i選項後面跟設備名稱,如果想抓取其他網卡的數據包,後面則要跟其他網卡的名字。

-nn選項的作用是讓第3列和第4列顯示成“ IP+端口號" 的形式,如果不加-nn選項則顯示“主機名+服務名稱"

tcpdump -nn port 80

tcpdump -nn not port 22 and host 192.168.0.100

tcpdump -nn -c 100 -w 1.cap(寫入文件1.cap,不能直接cat,用file 1.cap命令可以查看文件大致信息,具體查看要用tcpdump -r 1.cap)

wireshark工具

wireshark這個抓包工具,它的功能非常強大。在Linux平臺我們同樣也可以使用它,只不過是以命令行的形式。在日常工作中,tcpdump其實就已經夠我們使用了

需要安裝yum install -y wireshark

tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"

上面的抓包命令tshark,這條命令用於web服務器

Feb 24,2017 15:37:08 · 857507000 199.0.20.38 k168.123.com GET /thread-4861-I-I.html

類似於web訪問日誌。若服務器沒有配置訪問日誌,可以臨時使用該命令查看一下當前服務器上的web請求。在這裏要註意的是,如果你的機器上沒有開啟web服務,是不會顯示任何內容的。


2018.1.23 7周2次課