1. 程式人生 > >七周二次課 io監控 free ps 抓包 查看網絡狀態

七周二次課 io監控 free ps 抓包 查看網絡狀態

ps free io性能監控 網絡狀態

監控io性能(磁盤性能監控)

在日常運維的工作中,我們不僅要關註cpu,內存之外,磁盤的io也是重要指標之一。有時候cpu和內存都有剩余,但是系統的負載還是很高,用vmstat查看發現b列或者wa列比較大,那說明系統磁盤有瓶頸,那我們就要更詳細的去查看磁盤的狀態。

我們可以用iostat -x來看硬盤的狀態,這裏面有一個非常重要的選項,%util

^C
[root@localhost ~]# iostat -x 1 3
Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 2018年03月07日 _x8664 (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle

0.14 0.00 0.28 0.25 0.00 99.32

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.10 0.95 0.42 35.04 10.54 66.73 0.05 40.20 12.07 103.35 4.07 0.56

這個指標首先是一個百分比,它的含義是io等待,磁盤使用有多少時間占用cpu的,那我們的cup有一部分時間是交給進程進行處理的,計算的,那也有一部分是等待磁盤讀寫的,磁盤要讀寫數據,cpu是需要時間等待的,那麽的時間比就是%util。
如果這個百分比很大,已經達到了50%~60%,這說明磁盤io很差了,說明它非常的忙,這個數值很大,說明磁盤的讀(rkB/s)和寫(wkB/s)這兩列也很大,如果這兩列不大,但是%util很大,就說明我們的硬盤有問題,有些故障,如果硬盤很慢,肯定會影響系統的性能。 

如果我們發現磁盤io很忙,我很想知道是哪一個進程在頻繁讀寫呢?這時候我們輸入命令iotop,如果沒有這條命令,那我們就直接安裝iotop。

這條命令和top命令相似,也是動態顯示
[root@localhost ~]# iotop

Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1715 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.02 % [kworker/0:1]
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
在io列中,排位靠前的就是使用io頻繁的進程。

free:查看內存使用情況的命令
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 988M 130M 715M 6.7M 142M 700M
Swap: 2.0G 0B 2.0G
它是由三行組成,第一行是說明。第二行是內存使用情況,第三行是交換分區使用情況。我們也可以使用參數-h,給他加上合適的單位。我們關註的是第二行,內存的使用情況。
第一列 total內存總大小。
第二列 used:使用了多少。
第三列 free:空閑了多少。
第四列 shared:共享了多少。
第五列 buff/cache :緩沖和緩存。
這裏有一個問題,我們的used(使用)和free(空閑)之和不等於total(總和),這是為什麽呢?這是因為linux系統他會把你的內存先預分配一部分出來給buff(緩沖)/cache(緩存),這兩個詞看似相近,但是他倆是不同的概念。

cache:我們現在有一個數據,要從磁盤中讀出來,交給cpu去運算,磁盤到cpu要經過內存,由於磁盤和cpu的速度差距很大,所以我們中間有一個內存設備,為了就是讓這兩者的速度有一個緩和,所以中間要經過一個內存到cpu,這個內存就是cache。         磁盤-->內存(cache)-->cpu

buff:cpu將數據計算完後要想把它存到磁盤中去,由於cpu速度快而磁盤速度慢,入股想直接寫到磁盤中去速度會很慢,這樣會拖慢cpu的工作效率,所以cpu就先將數據放到內存中去(buff),然後再放入磁盤中去。                                                         cpu-->內存(buff)-->磁盤

第六列 available:可得到的剩余物理內存。它是free和buff/cache 剩余部分之和。我們真正要查看的就是這項。

ps:監控系統狀態
ps aux:靜態的列出系統所以進程
[root@localhost ~]# ps aux |head -4
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 128164 6820 ? Ss 20:34 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize
root 2 0.0 0.0 0 0 ? S 20:34 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 20:34 0:00 [ksoftirqd/0]

第一列 user:進程的運行用戶
第二列 pid:進程id。這個在我們殺死進程的時候可以用到,kill+pid。
第三列 %CPU:cpu百分比
第四列 %MEM :內存百分比
第五列 VSZ:虛擬內存
第六列 RSS :物理內存
第七列 TTY:在哪個TTY上。
第八列 STAT:進程狀態。這也是我們需要關註的一項。
進程的狀態有如下幾種:
D :不能中斷的進程,這樣會造成系統負載很高,這說明D進程會不斷使用cpu。這個很少見。
R:正在跑的進程。
S:休眠的進程,但是有一種情況,一個程序正在運行,但是我們查看的時候他還在處S的狀態,這時因為他雖然在運行,但是不是不停的運行、而是某一個時刻抓一下,所以他占用cpu的時間很短,它運行完的會後就處於S的狀態,這種進程基本不會耗費cpu的資源。
S+:前臺進程。
T:暫停的進程。
[root@localhost ~]# ps aux |grep vmstat
root 1501 0.0 0.1 148316 1348 pts/0 T 23:08 0:00 vmstat 1
這就說明進程被暫停了,這時候他就沒有在運行。
Z:僵屍進程。如果有僵屍進程,我們就要想辦法殺死它。
<:高優先級進程。cpu優先運行這個進程。
N:低優先級進程。cpu會延後運行這個進程。
L:內存中被鎖了內存分頁的。
s:主進程。
|:多線程進程。

第九列 START:什麽時候啟動的
第十列 TIME:啟動多久了
第十一列COMMAND:命令

如果我們想產看系統中某一個程序是否運行,可以用管道符加grep,比如我們先要看nginx這個程序是否運行
[root@localhost ~]# ps aux |grep nginx
root 1462 0.0 0.0 112676 984 pts/0 R+ 22:47 0:00 grep --color=auto nginx
這樣就可以實現了。

netstat:查看網絡狀態
linux作為服務器的一種操作系統,這個服務器會有很多的服務,服務他往往是和客戶端相互通信的,所以也就意味著他有監聽端口,要有對外通信端口,netstat這個命令就是監聽TCP/IP通信的狀態,比如說我們要安裝一個服務,有了服務,我們就要監聽一個端口。

監聽端口:正常情況下一臺機器是沒有端口監聽的,沒有端口監聽,他就沒法和其他機器通信,如果想提服務,如果讓其他人訪問你的服務器,你的網站,就需要監聽一個端口,他把端口放開,打開一個洞,就好比在網卡打開一個洞,你的遠程設備想辦法和我們的這個小洞相連,你的數據從這個小洞進入到我們的網卡,我們的服務器中,相互的去通信。

netstat -lnp:查看監聽端口
[root@localhost ~]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN 889/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:
LISTEN 991/master
tcp6 0 0 :::22 ::: LISTEN 889/sshd
tcp6 0 0 ::1:25 :::
LISTEN 991/master
udp 0 0 0.0.0.0:68 0.0.0.0: 694/dhclient
udp 0 0 0.0.0.0:47393 0.0.0.0:
694/dhclient
udp 0 0 127.0.0.1:323 0.0.0.0: 547/chronyd
udp6 0 0 :::10353 :::
694/dhclient
udp6 0 0 ::1:323 ::: 547/chronyd
raw6 0 0 :::58 :::
7 570/NetworkManager
我們著重要註意以上這些內容,因為我們以後要添加的一些服務,如果想看這些服務是否正常啟動,就會用到條命令,也可以用ps查看進程。

netstat -an:查看TCP/IP狀態
查看所有的連接的狀態,這裏面會牽扯到TCP/IP的三次握手和四次揮手。

netstat-lntp:只查看tcp,不包含socket

查看所有狀態數字的小技巧
[root@localhost ~]# netstat -an | awk ‘/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}‘
LISTEN 4 (監聽)
ESTABLISHED 2(保持連接)這個數字如果很大,說明你的系統很忙,網站並發連接數(並發連接數的概念就是同一時間有多少個客戶端在連接你)。這有這個數字是在真正通信的。通常情況下,這個數字在1千以內。

ss -an:它和netstat類似,都可以查看TCP/IP狀態,如果只想產看被監聽的端口,我們可以接grep。

[root@localhost ~]# ss -an | grep -i listen |head -5
u_str LISTEN 0 128 /var/run/dbus/system_bus_socket 13578 0
u_str LISTEN 0 100 private/rewrite 17480
0
u_str LISTEN 0 100 private/bounce 17483 0
u_str LISTEN 0 100 private/defer 17486
0
u_str LISTEN 0 100 private/trace 17489 * 0
但是這個有一個缺點,他不會顯示進程名字,但是netstat -lntp可以顯示進程名字。

linux下抓包
有時候我們的網站會受到攻擊,網卡流量異常,進入的包會有很多。這時候我們想知道都有哪些包進來,這時候我們就用tcpdump這個抓包工具來查看。
這個命令如果沒有,我們就用yum來安裝一下。

簡單的抓包命令:tcpdump -nn -i ens33(由於我們設備名字特殊,所以我們要指定網卡名。)
[root@localhost ~]# tcpdump -nn -i ens33
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
時間 IP 源IP .源端口 >是到哪裏去 目標源.目標端口 數據包信息
20:47:43.162758 IP 192.168.1.103.50895 > 192.168.1.105.22: Flags [.], ack 196, win 16246, length 0
20:47:43.163198 IP 192.168.1.105.22 > 192.168.1.103.50895: Flags [P.], seq 196:472, ack 1, win 255, length 276
20:47:43.163556 IP 192.168.1.105.22 > 192.168.1.103.50895: Flags [P.], seq 472:636, ack 1, win 255, length 164
20:47:43.163735 IP 192.168.1.103.50895 > 192.168.1.105.22: Flags [.], ack 636, win 16136, length 0
20:47:43.163914 IP 192.168.1.105.22 > 192.168.1.103.50895: Flags [P.], seq 636:896, ack 1, win 255, length 260
20:47:43.164169 IP 192.168.1.105.22 > 192.168.1.103.50895: Flags [P.], seq 896:1060, ack 1, win 255, length 164
我們重點關註的是源IP.源端口到目標源.目標端口。數據流向。

21:52:03.147158 IP 192.168.1.103.50895 > 192.168.1.105.22: Flags [.], ack 196, win 16147, length 0。
有時候我們也要註意length。有時候我們會看到一些奇怪的數據包,默認很多都是tcp的,有時候我們也有可能看到udp的包,如果出現udp的包很有可能你就被攻擊了。有一種DDOS攻擊,叫udp flood洪水攻擊。如果遇到這種洪水攻擊,我們只能借助於專業的防攻擊設備或者是服務。

其中-nn中的第一個n代表你的IP,用數字的形式顯示出來,如果不顯示,則會顯示主機名。
[root@localhost ~]# tcpdump -i ens33
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
20:51:19.244423 IP localhost.localdomain.ssh > 192.168.1.103.50895: Flags [P.], seq 504196553:504196749, ack 3367907909, win 255, length 196
20:51:19.244725 IP 192.168.1.103.50895 > localhost.localdomain.ssh: Flags [.], ack 196, win 16207, length 0
20:51:19.246481 IP localhost.localdomain.43235 > cache4-dlcity.domain: 13573+ PTR? 103.1.168.192.in-addr.arpa. (44)
20:51:19.248896 IP cache4-dlcity.domain > localhost.localdomain.43235: 13573 NXDomain 0/1/0 (99)
20:51:19.250229 IP localhost.localdomain.58113 > cache4-dlcity.domain: 50792+ PTR? 105.1.168.192.in-addr.arpa. (44)
20:51:19.251873 IP cache4-dlcity.domain > localhost.localdomain.58113: 50792 NXDomain
0/1/0 (99)
20:51:19.252153 IP localhost.localdomain.57475 > cache4-dlcity.domain: 15278+ PTR? 38.69.96.202.in-addr.arpa. (43)

ocalhost.localdomain這就是主機名,但是在網上我們並不知道他是誰,所以還是要加上-nn比較直觀。
.ssh這時ssh服務的端口,22,如果我們知道還好,如果我們不知道,那麽我們就不知道這個端口是哪個數字。
所以我們加上nn,就會以數字的形式顯示端口號。(第二個n是端口號)
這臺設備沒有跑什麽服務,只是ssh遠程連接的,所以在我們抓包的時候看到的很多包都是從22端口出去的。

tcpdmup -nn prot 端口:指定端口
因為我們在抓包的時候會抓到很多的端口,因為有些端口我們不需要看,所以我們既要查看指定端口。
tcpdump -nn -i ens33 port 22:指網卡和端口
tcpdump -nn -i ens33 port 22 and host 192.168.1.105:我們還可以加條件,指定IP的包。比如我們指定了192.168.1.105這個IP的包。

還有一種情況,我們指定數據包,只抓100個,而且我想把它存到一個文件中去
[root@localhost ~]# tcpdump -nn -i ens33 -c 100 -w /tmp/llt.cap
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
100 packets captured
100 packets received by filter
0 packets dropped by kernel
這樣100個包就抓完了。

.cap這個文件實際上是就是從網卡裏捕獲的數據包,這個包中含有源IP,目標IP,通訊的數據包,數據內容等很多的信息。所以不能用cat去查看。如果要查看,我們要用tcpdump -r(read讀)+文件的路徑+文件名。他顯示的也是數據流。而我-w寫入的是真真正正的數據包,這是我們要區分的。

然後我們查看一下抓好的包
[root@localhost ~]# tcpdump -r /tmp/llt1.cap
reading from file /tmp/llt1.cap, link-type EN10MB (Ethernet)
22:43:46.835843 IP localhost.localdomain.ssh > 192.168.1.103.50895: Flags [P.], seq 511436009:511436141, ack 3367974121, win 255, length 132
22:43:46.836126 IP 192.168.1.103.50895 > localhost.localdomain.ssh: Flags [.], ack 132, win 16314, length 0
22:43:47.292696 IP 192.168.1.100.39909 > 239.255.255.250.ssdp: UDP, length 268
22:43:47.344078 IP 192.168.1.100.39909 > 239.255.255.250.ssdp: UDP, length 277
22:43:47.400646 IP 192.168.1.100.39909 > 239.255.255.250.ssdp: UDP, length 324
22:43:47.442222 IP 192.168.1.100.39909 > 239.255.255.250.ssdp: UDP, length 322
22:43:47.492553 IP 192.168.1.100.39909 > 239.255.255.250.ssdp: UDP, length 334
22:43:47.542970 IP 192.168.1.100.39909 > 239.255.255.250.ssdp: UDP, length 332
22:43:47.795308 IP 192.168.1.103.53665 > 61.135.169.125.https: Flags [R.], seq 672714496, ack 3686534326, win 0, length 0
22:43:47.796094 IP 192.168.1.100.39909 > 239.255.255.250.ssdp: UDP, length 268

wireshark:抓包工具,它的作用和tcpdmup類似。wireshark這個包有一個命名,tshark。他有一個很實用的用法,用這個命令可以查看你指定網卡80端口的一個wed訪問情況。
[root@localhost ~]# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e " http.request.metod" -e "http.request.uri"
這個類似於wed的訪問日誌,我們可以很清晰的發現在這個往卡上,有什麽ip來訪問網站

七周二次課 io監控 free ps 抓包 查看網絡狀態