1. 程式人生 > >free、ps、netstat、tcpdump命令工具介紹

free、ps、netstat、tcpdump命令工具介紹

技巧 prot groups ps命令 request ted dump 部分 sha

1. 監控io性能

# iostat -x 查看磁盤使用

Linux 3.10.0-514.el7.x86_64 (ccj-01) 2018年1月23日 _x86_64_ (1 CPU)


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

0.05 0.00 0.11 0.00 0.00 99.84


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.00 0.03 0.03 1.17 0.53 60.11 0.00 3.50 2.43 4.69 0.91 0.01

sdb 0.00 0.00 0.00 0.00 0.01 0.00 12.35 0.00 0.07 0.07 0.00 0.05 0.00

scd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 2.09 2.09 0.00 2.00 0.00

dm-0 0.00 0.00 0.00 0.00 0.00 0.00 15.20 0.00 0.07 0.07 0.00 0.07 0.00

說明:%util這列就是表示磁盤io百分比,如果百分比很大,那就會導致讀與寫也很大,會影響磁盤性能。



iotop命令

#yum install -y iotop 安裝


#iotop 查看磁盤io,動態顯示:

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

21 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.38 % [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]

3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]

517 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug [JS GC Helper]

518 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug [JS Sour~ Thread]

7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]

8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh]

9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]

10 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]

12 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khelper]

13 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kdevtmpfs]

14 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]

15 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khungtaskd]

16 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [writeback]

17 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kintegrityd]

18 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bioset]

19 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kblockd]

20 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [md]

535 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % NetworkManager --no-daemon

26 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kswapd0]

27 be/5 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksmd]

28 be/7 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khugepaged]

29 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [fsnotify_mark]

30 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [crypto]



2. free命令

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


# free

total used free shared buff/cache available

Mem: 999940 126608 541660 6808 331672 682536

Swap: 2097148 0 2097148

[root@aminglinux-01 ~]# free -m

total used free shared buff/cache available

Mem: 976 123 528 6 323 666

Swap: 2047 0 2047

[root@aminglinux-01 ~]# free -h

total used free shared buff/cache available

Mem: 976M 123M 528M 6.6M 323M 666M

Swap: 2.0G 0B 2.0G

[root@aminglinux-01 ~]# free -g

total used free shared buff/cache available

Mem: 0 0 0 0 0 0

Swap: 1 0 1


解釋:

  1. total:內存總大小。

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

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

  4. shared:共享內存大小,不用關註它。

  5. buff/cache:分配給buffer和cache的內存總共有多大。buffer和cache都是一部分內存,內存的作用就是緩解CPU和IO(如,磁盤)的速度差距的,可以如下理解:

    數據經過CPU計算,即將要寫入磁盤,這時用的內存為buffer。

    CPU要計算時,需要把數據從磁盤中讀出來,臨時先放到內存中,這部分內存就是cache。

  6. available:系統可使用內存有多大,它包含了free,同時還有buffert和cache這部分還未占用的內存。

  7. free命令可以加上-m和-g、-h選項(分別以MB或GB為單位)打印內存的使用狀況


總結:

  1. 公式:total=used+free+buff/cache

  2. avaliable包含free和buffer/cache剩余部分




3. ps命令

#ps aux 或 #ps -elf都是查看系統進程命令


# ps aux 查看所有系統進程

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1 0.0 0.6 128104 6708 ? Ss 1月25 0:04 /usr/lib/systemd/systemd --switched-root --system --d

root 2 0.0 0.0 0 0 ? S 1月23 0:00 [kthreadd]

root 3 0.0 0.0 0 0 ? S 1月23 0:16 [ksoftirqd/0]

root 7 0.0 0.0 0 0 ? S 1月23 0:00 [migration/0]

root 8 0.0 0.0 0 0 ? S 1月23 0:00 [rcu_bh]

root 9 0.0 0.0 0 0 ? R 1月23 1:41 [rcu_sched]

root 10 0.0 0.0 0 0 ? S 1月23 0:04 [watchdog/0]

root 12 0.0 0.0 0 0 ? S< 1月23 0:00 [khelper]

root 13 0.0 0.0 0 0 ? S 1月23 0:00 [kdevtmpfs]

root 14 0.0 0.0 0 0 ? S< 1月23 0:00 [netns]

root 15 0.0 0.0 0 0 ? S 1月23 0:00 [khungtaskd]

root 16 0.0 0.0 0 0 ? S< 1月23 0:00 [writeback]

root 17 0.0 0.0 0 0 ? S< 1月23 0:00 [kintegrityd]

root 18 0.0 0.0 0 0 ? S< 1月23 0:00 [bioset]

root 19 0.0 0.0 0 0 ? S< 1月23 0:00 [kblockd]


# ps aux |grep nginx 查看nginx服務進程是否存在

root 5821 0.0 0.0 112676 976 pts/0 R+ 19:33 0:00 grep --color=auto nginx


解釋說明:

PID:表示進程的ID,在想要殺死進程的時候就有作用

命令 kill PID號 例子:#kill 1346


#ps aux |grep qmgr 會看到的該進程被殺掉了

在遇到一個不知道的進程(有可能是被入侵的進程),在殺死的時候,就需要先查看進程的PID號。


STAT:進程的狀態。

D:不能中斷的進程,通常為IO (正在等待IO資源的進程,類似於vmstat中的b)。

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

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

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

X:已經死掉的進程。

Z:僵屍進程。

<:高優先級進程。

N:低優先級進程。

s:主進程。

+:前臺的進程,例如此時ps aux就是前臺的進程。

l:多線程進程。



使用ps連同管理符一起使用,用來查看某個進程或者它的數量

# ps aux |grep -c sshd

3

# ps aux |grep sshd

root 867 0.0 0.1 82480 1372 ? Ss 1月23 0:00 /usr/sbin/sshd

root 3542 0.0 0.5 143104 5180 ? Ss 1月23 1:21 sshd: root@pts/0

root 5835 0.0 0.0 112676 976 pts/0 S+ 19:47 0:00 grep --color=auto sshd

上例中的3不準確,需要減掉1,因為使用grep命令時,grep命令本身也算一個進程。



4. 查看網絡狀態

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


常用的命令:

#netstat 查看網絡狀態

#netstat -lnp 查看監聽端口

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

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

#ss -an 和nestat異曲同工,也是查看網絡狀態


# netstat

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 52 aminglinux-01:ssh 192.168.4.84:51554 ESTABLISHED

udp 0 0 aminglinux-01:41402 leontp.ccgs.wa.edu.:ntp ESTABLISHED

Active UNIX domain sockets (w/o servers)

Proto RefCnt Flags Type State I-Node Path

unix 2 [ ] DGRAM 12652 /run/systemd/shutdownd

unix 2 [ ] DGRAM 8332 /run/systemd/notify

unix 2 [ ] DGRAM 8334 /run/systemd/cgroups-agent

unix 5 [ ] DGRAM 8355 /run/systemd/journal/socket

unix 12 [ ] DGRAM 8357 /dev/log

unix 3 [ ] STREAM CONNECTED 15304 /var/run/dbus/system_bus_socket

unix 2 [ ] DGRAM 15259

unix 3 [ ] DGRAM 13529

unix 2 [ ] DGRAM 367481

unix 2 [ ] DGRAM 19035

unix 3 [ ] STREAM CONNECTED 15199 /run/systemd/journal/stdout

unix 3 [ ] STREAM CONNECTED 19144

unix 2 [ ] DGRAM 13508

....省略


# 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 867/sshd

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1277/master

tcp6 0 0 :::22 :::* LISTEN 867/sshd

tcp6 0 0 ::1:25 :::* LISTEN 1277/master

udp 0 0 127.0.0.1:323 0.0.0.0:* 503/chronyd

udp6 0 0 ::1:323 :::* 503/chronyd

raw6 0 0 :::58 :::* 7 535/NetworkManager

Active UNIX domain sockets (only servers)

Proto RefCnt Flags Type State I-Node PID/Program name Path

unix 2 [ ACC ] STREAM LISTENING 14863 1/systemd /var/run/dbus/system_bus_socket

unix 2 [ ACC ] STREAM LISTENING 19087 1277/master private/rewrite

unix 2 [ ACC ] STREAM LISTENING 19090 1277/master private/bounce

unix 2 [ ACC ] STREAM LISTENING 19084 1277/master private/tlsmgr

unix 2 [ ACC ] STREAM LISTENING 19094 1277/master private/defer

unix 2 [ ACC ] STREAM LISTENING 19097 1277/master private/trace

unix 2 [ ACC ] STREAM LISTENING 19100 1277/master private/verify

unix 2 [ ACC ] STREAM LISTENING 19106 1277/master private/proxymap

unix 2 [ ACC ] STREAM LISTENING 19109 1277/master private/proxywrite

unix 2 [ ACC ] STREAM LISTENING 19112 1277/master private/smtp

.....省略


# netstat -lntp

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 867/sshd

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1277/master

tcp6 0 0 :::22 :::* LISTEN 867/sshd

tcp6 0 0 ::1:25 :::* LISTEN 1277/master

# ss -an

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port

nl UNCONN 0 0 0:0 *

nl UNCONN 0 0 0:-46136809 *

nl UNCONN 0 0 0:-46136809 *

nl UNCONN 768 0 4:0 *

nl UNCONN 4352 0 4:5885 *

nl UNCONN 0 0 6:0 *

nl UNCONN 0 0 7:1 *

nl UNCONN 0 0 7:500 *

nl UNCONN 0 0 7:0 *

nl UNCONN 0 0 7:500 *

nl UNCONN 0 0 7:1 *


小技巧:

可以查看所有狀態的數字,使用命令:netstat -an | awk '/^tcp/ {++sta[$NF]} END {for(key in sta) print key,"\t",sta[key]}'


示例命令如下:

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

LISTEN 4

ESTABLISHED 1

備註:如果你管理是一臺提供Web服務(80端口)的服務器,那麽就可以使用命令netstat -an |grep 80來查看當前連接Web服務的有哪些IP。



5. linux下抓包


tcpdump工具

#yum install -y tcpdump 安裝

用法:#tcpdump -nn -i ens33


只關註第3-4列,顯示為哪一個IP地址+端口號在連接哪一個IP+端口號。

-i表示網卡,後面跟的ens33是網卡名稱,如果想抓取其他網卡上的數據包,後面則要跟其他網卡的名字。

-nn選項的作用是讓第三列和第四列顯示成“ip+端口號”的形式,如果不加-nn選項則顯示“主機名+服務名稱”。



# tcpdump -nn 由於網卡關系找不到

tcpdump: packet printing is not supported for link type NFLOG: use -w

# ifconfig 查看網卡

# tcpdump -nn -i ens33 正確用法

20:19:58.421641 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 158748:158928, ack 1, win 340, length 180

20:19:58.422758 IP 192.168.4.84.51554 > 192.168.1.185.22: Flags [.], ack 158928, win 25374, length 0

20:19:58.425049 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 158928:159204, ack 1, win 340, length 276

20:19:58.426438 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 159204:159384, ack 1, win 340, length 180

20:19:58.426978 IP 192.168.4.84.51554 > 192.168.1.185.22: Flags [.], ack 159384, win 25260, length 0

20:19:58.427349 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 159384:159660, ack 1, win 340, length 276

20:19:58.427693 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 159660:159840, ack 1, win 340, length 180

20:19:58.428668 IP 192.168.4.84.51554 > 192.168.1.185.22: Flags [.], ack 159840, win 25146, length 0

20:19:58.428879 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 159840:160116, ack 1, win 340, length 276

20:19:58.429372 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 160116:160296, ack 1, win 340, length 180

20:19:58.429621 IP 192.168.4.84.51554 > 192.168.1.185.22: Flags [.], ack 160296, win 25032, length 0

20:19:58.429787 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 160296:160572, ack 1, win 340, length 276

20:19:58.430281 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 160572:160752, ack 1, win 340, length 180

20:19:58.430596 IP 192.168.4.84.51554 > 192.168.1.185.22: Flags [.], ack 160752, win 24918, length 0

20:19:58.432366 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 160752:161028, ack 1, win 340, length 276

20:19:58.432823 IP 192.168.1.185.22 > 192.168.4.84.51554: Flags [P.], seq 161028:161208, ack 1, win 340, length 180

...省略



其它用法:

#tcpdump -nn -i ens33 -c 100 -c作用是指定抓包數量,抓夠了就自動退出,不用人為取消。

#tcpdump -nn -i ens33 port 80 指定只抓80端口的包

#tcpdump -nn -i ens33 not port 22 不要22端口的包

#tcpdump -nn -i ens33 tcp and not port 22 指定抓tcp的包,但是不要22端口的

#tcpdump -nn -i ens33 port 22 and port 53 只抓22和53端口的包

#tcpdump -nn -i ens33 not port 22 and host 192.168.0.100 只要這個ip的包

#tcpdump -nn -c 100 -w /tmp/12.cap 指定打印數據包條數,然後存儲到指定文件裏。

#tcpdump -r /tmp/12.cap 12.cap是二進制數據包,不是文本,所以不能cat,應該用這種方式讀取。



wireshark工具

#yum install -y wireshark 安裝


下面這條命令可以查看指定網卡80端口的一個web訪問的情況,如果服務器沒有提供web服務,沒有任何的80端口在監聽,就無法顯示效果。

#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"

free、ps、netstat、tcpdump命令工具介紹