2018.1.23 7周2次課
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命令方便,它是專門顯示系統進程的命令
USER: 進程擁有者
PID:表示進程的ID,這個ID很有用在Linux中,內核管理進程就得靠pid來識別和管理某一個進程。比如我想終止某一個進程,則用命令"kill進程的pid"。有時這樣並不能終止進程,需要加-9選項,即"kill 9進程的pid",但這樣有點暴力,嚴重的時候會丟數據,所以盡量還是別用。在/proc/目錄下,每個進程都有PID id開頭的目錄。
%CPU: 占用的 CPU 使用率
%MEM: 占用的物理內存的使用率
VSZ: 占用的虛擬內存大小
RSS: 占用的內存大小
TTY: 在哪個終端機上面運作,若與終端機無關,則顯示 ?
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就是前臺進程。
START: 進程開始時間
TIME: 執行的時間
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次課