你的位置:首页 > 操作系统

[操作系统]Linux 性能监控之命令行工具


引言
对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作。这些命令行工具可以在各种Linux系统下使用,可以用于监控和查找产生性能问题的原因。这个命令行工具列表提供了足够的工具,您可以挑选适用于您的监控场景的工具。

1. lsof - 列出打开的文件

        在许多Linux或者类Unix系统里都有lsof命令,它常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。
      使用这条命令的主要情形之一就是在无法挂载磁盘和显示正在使用或者打开某个文件的错误信息的时候。
常用的参数列表:
lsof filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
例: 查看22端口现在运行的情况
[root@CentOS7 ~]# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 925 root 3u IPv4 18374 0t0 TCP *:ssh (LISTEN)
sshd 925 root 4u IPv6 18383 0t0 TCP *:ssh (LISTEN)
sshd 9452 root 3u IPv4 1169003 0t0 TCP CentOS7.2:ssh->192.168.56.1:61347 (ESTABLISHED)


查看所属root用户进程所打开的文件类型为txt的文件
[root@CentOS7 ~]# lsof -a -u root -d txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root txt REG 0,34 1489960 56083 /usr/lib/systemd/systemd
kthreadd 2 root txt unknown /proc/2/exe
ksoftirqd 3 root txt unknown /proc/3/exe
migration 7 root txt unknown /proc/7/exe
rcu_bh 8 root txt unknown /proc/8/exe



2. top - 进程活动

       top提供一个当前运行系统实时动态的视图,也就是正在运行进程。在默认情况下,显示系统中CPU使用率最高的任务,并每5秒钟刷新一次。
常用热键
t:显示摘要信息开关
top - 11:20:12 up 2 days, 18:39, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3/0.7 1[| ]
KiB Mem : 500780 total, 13236 free, 249296 used, 238248 buff/cache
KiB Swap: 8388604 total, 7848788 free, 539816 used. 200108 avail Mem
 
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17166 root 20 0 0 0 0 S 0.3 0.0 0:09.05 kworker/0:2
19196 root 20 0 146144 2056 1420 R 0.3 0.4 0:02.25 top
23944 root 20 0 1239128 38724 8388 S 0.3 7.7 6:39.63 firefox
1 root 20 0 191492 4212 2328 S 0.0 0.8 0:27.20 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:02.22 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 7:11.69 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
10 root 20 0 0 0 0 S 0.0 0.0 6:09.07 rcu_sched
11 root 20 0 0 0 0 S 0.0 0.0 14:11.36 rcuos/0
12 root rt 0 0 0 0 S 0.0 0.0 0:03.03 watchdog/0
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 perf



m:显示内存信息开关
top - 11:22:12 up 2 days, 18:41, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 60.0/500780 [|||||||||||||||||||||||||||||||||||||||||||||| ]
KiB Swap: 6.4/8388604 [||||| ]


A:分类显示系统不同资源的使用大户,有助于快速识别系统中资源消耗多的任务
1:Def - 11:23:40 up 2 days, 18:42, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 174 total, 1 running, 173 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 500780 total, 21124 free, 249376 used, 230280 buff/cache
KiB Swap: 8388604 total, 7848788 free, 539816 used. 200072 avail Mem
1 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
920 root 20 0 644044 11096 3360 S 0.3 2.2 10:28.34 daomonit
19196 root 20 0 146144 2056 1420 R 0.3 0.4 0:03.00 top
1 root 20 0 191492 4212 2328 S 0.0 0.8 0:27.20 systemd
2 PID PPID TIME+ %CPU %MEM PR NI S VIRT RES UID COMMAND
24416 2 0:03.29 0.0 0.0 0 -20 S 0 0 0 kworker/0:2H
24365 1 0:00.04 0.0 0.3 20 0 S 238724 1380 0 gvfsd-metadata
23944 23598 6:40.25 0.0 7.7 20 0 S 1239128 38724 0 firefox
3 PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND
23598 10.7 1473588 53752 16 746528 8912 26k 0 0.0 gnome-shell
23944 7.7 1239128 38724 108 582752 8388 46k 0 0.0 firefox
18581 3.2 110512 15824 392 12292 3364 23 0 0.0 dhclient
4 PID PPID UID USER RUSER TTY TIME+ %CPU %MEM S COMMAND
536 1 172 rtkit rtkit ? 0:03.06 0.0 0.1 S rtkit-daemon
1 0 0 root root ? 0:27.20 0.0 0.8 S systemd
2 0 0 root root ? 0:02.22 0.0 0.0 S kthreadd
3 2 0 root root ? 7:11.70 0.0 0.0 S ksoftirqd/0


f:添加删除所要显示栏位
Fields Management for window 1:Def, whose current sort field is PPID
Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,
'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end!
 
* PID = Process Id GROUP = Group Name TGID = Thread Group Id
* USER = Effective User Name PGRP = Process Group Id ENVIRON = Environment vars* PR = Priority TTY = Controlling Tty vMj = Major Faults delta
* NI = Nice Value TPGID = Tty Process Grp Id vMn = Minor Faults delta
* VIRT = Virtual Image (KiB) SID = Session Id USED = Res+Swap Size (KiB)
* RES = Resident Size (KiB) nTH = Number of Threads nsIPC=IPC namespace Inode
* SHR = Shared Memory (KiB) P = Last Used Cpu (SMP) nsMNT = MNT namespace Inode
* S = Process Status TIME = CPU Time nsNET = NET namespace Inode
* %MEM = Memory Usage (RES) SWAP = Swapped Size (KiB) nsPID=PID namespace Inode
* TIME+ = CPU Time, hundredths CODE = Code Size (KiB) nsUSER=USER namespace Inode
* COMMAND = Command Name/Line DATA = Data+Stack (KiB) nsUTS= UTS namespace Inode
* %CPU = CPU Usage nMaj = Major Page Faults
PPID = Parent Process pid nMin = Minor Page Faults
UID = Effective User Id nDRT = Dirty Pages Count
RUID = Real User Id WCHAN = Sleeping in Function
RUSER = Real User Name Flags = Task Flags <sched.h>
SUID = Saved User Id CGROUPS = Control Groups
SUSER = Saved User Name SUPGIDS = Supp Groups IDs
GID = Group Id SUPGRPS = Supp Groups Names



r:调整一个正在运行的进程Nice值
PID to renice [default pid = 920]


k:结束一个正在运行的进程
PID to signal/kill [default pid = 19156]


z:彩色/黑白显示开关


3. vmstat -系统活动、硬件及系统信息

      使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。
r:表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没 
     什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关
     系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危
     险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造
     成CPU使用率很高。
b:表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内
           存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free:空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff:Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300
         多M
cache:cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是
            Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了
            提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露
      了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小
      是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)
      的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒。
bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不
       然就是IO过于频繁,需要调整。
in:每秒CPU的中断次数,包括时间中断
cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要
      进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在
      apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发
      的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个
      比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,
      我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用
      系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经
      事的时间少了,CPU没有充分利用,是不可取的。
us:用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队
       列达到80(机器在做压力测试,性能表现不佳)。
sy:系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用
      户CPU使用率,sy是系统CPU使用率。
wt:等待IO CPU时间。

[root@CentOS7 ~]# vmstat -m
Cache Num Total Size Pages
fuse_inode 10 10 768 10
nf_conntrack_ffff88001a2d8000 0 0 320 12
nf_conntrack_ffffffff81a25e00 180 180 320 12
kcopyd_job 0 0 3312 9
dm_uevent 0 0 2608 12
dm_rq_target_io 0 0 136 30


每隔3秒5次:
[root@CentOS7 ~]# vmstat 3 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 539680 17040 8 234828 508 252 7085 420 84 176 6 4 86 4 0
0 0 539680 17040 8 234828 0 0 0 0 29 53 0 0 100 0 0
1 0 539680 17040 8 234828 0 0 0 0 31 58 0 0 100 0 0
0 0 539680 17008 8 234828 0 0 0 0 34 67 0 0 100 0 0
1 0 539680 16668 8 234828 0 0 0 0 71 151 1 2 97 0 0 




4. w - 显示谁已登录

    w命令显示系统当前用户及其运行进程的信息。

[root@CentOS7 ~]# w root
12:26:14 up 2 days, 19:45, 3 users, load average: 0.05, 0.12, 0.13
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 Sat23 ?xdm? 1:08m 0.65s gdm-session-worker [pam/gdm-password]
root pts/0 192.168.56.1 Sun22 4:35m 0.61s 0.00s lsof
root pts/1 192.168.56.1 11:09 6.00s 0.20s 0.01s w root



5. uptime - 告诉系统已经运行了多久

      uptime命令过去只显示系统运行多久。现在,可以显示系统运行多久、当前有多少的用户登录、在过去的1,5,15分钟里平均负载时多少。
[root@CentOS7 ~]# uptime
12:30:39 up 2 days, 19:49, 3 users, load average: 0.06, 0.08, 0.12


何为系统负载呢?
      系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树。如果一个进程满足以下条件则其就会位于运行队列中: 
       - 它没有在等待I/O操作的结果 
       - 它没有主动进入等待状态(也就是没有调用'wait') 
       - 没有被停止(例如:等待终止)
      一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好!当然这里说的是每个cpu内核,也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重。当然如果达到20,那就表示当前系统负载非常严重。


6. ps - 显示进程

       Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。
      要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
       ps为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。
linux上进程有5种状态: 
       1. 运行(正在运行或在运行队列中等待) 
       2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)        
       3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)        
       4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)       
       5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)  

ps工具标识进程的5种状态码: 

       D 不可中断 uninterruptible sleep (usually IO) 
       R 运行 runnable (on run queue) 
       S 中断 sleeping 
       T 停止 traced or stopped 
       Z 僵死 a defunct (”zombie”) process
[root@linux ~]# ps aux
[root@linux ~]# ps -lA
[root@linux ~]# ps axjf
参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。
特别说明:由于 ps 能够支持的 OS 类型相当的多,所以他的参数多的离谱!而且有没有加上 - 差很多!详细的用法应该要参考 man ps。


例1.将目前属于您自己这次登入的 PID 与相关信息列示出来
[root@CentOS7 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 19160 19156 0 80 0 - 29172 wait pts/1 00:00:00 bash
0 R 0 20465 19160 0 80 0 - 34343 - pts/1 00:00:00 ps


上面这个信息其实很多,各相关信息的意义为:
F:代表这个程序的flag,4代表使用者为super user
S:代表这个程序的状态
PID:这个程序的ID
C:CPU 使用的资源百分比
PRI:这个是 Priority (优先执行序) 的缩写
NI:这个是 Nice 值
ADDR:这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是『 - 』的啦!
SZ:使用掉的内存大小
WCHAN:目前这个程序是否正在运作当中,若为 - 表示正在运作
TTY:登入者的终端
TIME:使用掉的CPU时间
CMD:所下达的指令



例2.列出目前所有的正在内存当中的程序

[root@CentOS7 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.8 191492 4300 ? Ss May20 0:28 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S May20 0:02 [kthreadd]
root 3 0.1 0.0 0 0 ? S May20 7:12 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S May20 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S May20 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S May20 0:00 [rcuob/0]
root 10 0.1 0.0 0 0 ? S May20 6:10 [rcu_sched]
root 11 0.3 0.0 0 0 ? S May20 14:13 [rcuos/0]
root 12 0.0 0.0 0 0 ? S May20 0:03 [watchdog/0]
root 13 0.0 0.0 0 0 ? S< May20 0:00 [khelper]
root 14 0.0 0.0 0 0 ? S May20 0:00 [kdevtmpfs]
root 15 0.0 0.0 0 0 ? S< May20 0:00 [netns]
root 16 0.0 0.0 0 0 ? S< May20 0:00 [perf]


USER:该 process 属于那个使用者账号的
PID :该 process 的号码
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者
程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序
STAT:该程序目前的状态,主要的状态有:
R:该程序目前正在运作,或者是可被运作
S:该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号 (signal) 唤醒。
T:该程序目前正在侦测或者是停止了;
Z:该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令为
例3.显示出所有的程序

[root@CentOS7 ~]# ps -lA
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 47873 ep_pol ? 00:00:29 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:02 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:07:13 ksoftirqd/0
1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:00 migration/0
1 S 0 8 2 0 80 0 - 0 rcu_gp ? 00:00:00 rcu_bh
1 S 0 9 2 0 80 0 - 0 rcu_no ? 00:00:00 rcuob/0
1 S 0 10 2 0 80 0 - 0 rcu_gp ? 00:06:12 rcu_sched
1 S 0 11 2 0 80 0 - 0 rcu_no ? 00:14:16 rcuos/0
5 S 0 12 2 0 -40 - - 0 smpboo ? 00:00:03 watchdog/0
1 S 0 13 2 0 60 -20 - 0 rescue ? 00:00:00 khelper


例4.列出类似程序树的程序显示

[root@CentOS7 ~]# ps -axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:02 [kthreadd]
2 3 0 0 ? -1 S 0 7:13 \_ [ksoftirqd/0]
2 7 0 0 ? -1 S 0 0:00 \_ [migration/0]
2 8 0 0 ? -1 S 0 0:00 \_ [rcu_bh]
2 9 0 0 ? -1 S 0 0:00 \_ [rcuob/0]
2 10 0 0 ? -1 S 0 6:12 \_ [rcu_sched]
2 11 0 0 ? -1 S 0 14:16 \_ [rcuos/0]


例5.找出与 crypto 与 bash 这两个服务有关的 PID 号码

[root@CentOS7 ~]# ps aux | egrep '(crypto|bash)'
root 30 0.0 0.0 0 0 ? S< May20 0:00 [crypto]
root 597 0.0 0.1 115240 772 ? S May20 0:14 /bin/bash /usr/sbin/ksmtuned
root 23362 0.0 0.6 116556 3272 pts/0 Ss 16:50 0:00 -bash
root 23521 0.0 0.0 52852 44 ? Ss May21 0:01 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root 25992 0.0 0.1 112648 956 pts/0 S+ 20:08 0:00 grep -E --color=auto (crypto|bash)




7. free - 内存使用情况 

[root@CentOS7 ~]# free
                   1          2          3          4          5          6
1              total       used       free     shared    buffers     cached
2 Mem:      24677460   23276064    1401396          0     870540   12084008
3 -/+ buffers/cache:   10321516   14355944
4 Swap:     25151484     224188   24927296


free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free),这个比较清楚,不说太多。
  free输出地第二行和第三行是比较让人迷惑的。这两行都是说明内存使用情况的。第一列是总量(total),第二列是使用量(used),第三列是可用量(free)。
  第一行的输出时从操作系统(OS)来看的。也就是说,从OS的角度来看,计算机上一共有:
  • 24677460KB(缺省时free的单位为KB)物理内存,即FO[2][1];
  • 在这些物理内存中有23276064KB(即FO[2][2])被使用了;
  • 还用1401396KB(即FO[2][3])是可用的;
这里得到第一个等式:
  • FO[2][1] = FO[2][2] + FO[2][3]
FO[2][4]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。

FO[2][5]表示被OS buffer住的内存。FO[2][6]表示被OS cache的内存。在有些时候buffer和cache这两个词经常混用。不过在一些比较低层的软件里是要区分这两个词的,看老外的洋文:
  • A buffer is something that has yet to be "written" to disk. 
  • A cache is something that has been "read" from the disk and stored for later use.
free输出的第二行是从一个应用程序的角度看系统内存的使用情况。
  • 对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;
  • 对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存;
因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[3][3]比FO[2][3]会大很多。
这里还用两个等式:

也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

  • FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
  • FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6] 

8. iostat - CPU平均负载,硬盘活动

       iostat命令可报告中央处理器(CPU)的统计信息,各种设备、分区及网络文件系统输入/输出的统计信息。

[root@CentOS7 ~]# iostat
Linux 3.10.0-327.el7.x86_64 (CentOS7.2) 05/23/2016 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.20 0.00 3.53 3.54 0.00 87.73
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 197.17 6120.99 371.74 1677443445 101873448


avg-cpu段:
%user: 在用户级别运行所使用的CPU的百分比
%nice: nice操作所使用的CPU的百分比
%sys: 在系统级别(kernel)运行所使用CPU的百分比
%iowait: CPU等待硬件I/O时,所占用CPU百分比
%idle: CPU空闲时间的百分比
Device段:
tps: 每秒钟发送到的I/O请求数
Blk_read /s: 每秒读取的block数
Blk_wrtn/s: 每秒写入的block数
Blk_read:   读入的block总数
Blk_wrtn:  写入的block总数


例.每隔2秒显示一次sda及上面所有分区的统计信息,共输出1次

[root@CentOS7 ~]# iostat -p sda 2 1
Linux 3.10.0-327.el7.x86_64 (CentOS7.2) 05/23/2016 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.19 0.00 3.52 3.54 0.00 87.75
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 196.83 6110.31 371.21 1677443609 101907192
sda1 0.01 0.02 0.01 4585 2060
sda2 43.56 438.87 217.75 120482400 59778512
sda3 152.42 5671.42 153.45 1556955824 42126620 


9. mpstat - 多处理器使用率

    mpstat命令可以显示所有可用处理器的使用情况,处理器编号从0开始。mpstat -P ALL显示每个处理器的平均使用率。

[root@CentOS7 ~]# mpstat -P ALL
Linux 3.10.0-327.el7.x86_64 (CentOS7.2) 05/23/2016 _x86_64_ (1 CPU) 
10:45:33 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:45:33 PM all 5.19 0.00 2.70 3.54 0.00 0.81 0.00 0.00 0.00 87.76
10:45:33 PM 0 5.19 0.00 2.70 3.54 0.00 0.81 0.00 0.00 0.00 87.76


 10. pmap - 进程的内存使用

      pmap命令可以显示进程的内存映射,使用这个命令可以找出造成内存瓶颈的原因。

[root@CentOS7 ~]# pmap -d 23362
23362: -bash
Address Kbytes Mode Offset Device Mapping
0000000000400000 884 r-x-- 0000000000000000 000:00020 bash
00000000006dc000 4 r---- 00000000000dc000 000:00020 bash
00000000006dd000 36 rw--- 00000000000dd000 000:00020 bash
00000000006e6000 24 rw--- 0000000000000000 000:00000 [ anon ]
000000000221d000 1576 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d3fc3d000 103580 r---- 0000000000000000 000:00020 locale-archive
00007f7d46164000 44 r-x-- 0000000000000000 000:00020 libnss_files-2.17.so
00007f7d4616f000 2044 ----- 000000000000b000 000:00020 libnss_files-2.17.so
00007f7d4636e000 4 r---- 000000000000a000 000:00020 libnss_files-2.17.so
00007f7d4636f000 4 rw--- 000000000000b000 000:00020 libnss_files-2.17.so
00007f7d46370000 24 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46376000 1752 r-x-- 0000000000000000 000:00020 libc-2.17.so
00007f7d4652c000 2048 ----- 00000000001b6000 000:00020 libc-2.17.so
00007f7d4672c000 16 r---- 00000000001b6000 000:00020 libc-2.17.so
00007f7d46730000 8 rw--- 00000000001ba000 000:00020 libc-2.17.so
00007f7d46732000 20 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46737000 12 r-x-- 0000000000000000 000:00020 libdl-2.17.so
00007f7d4673a000 2044 ----- 0000000000003000 000:00020 libdl-2.17.so
00007f7d46939000 4 r---- 0000000000002000 000:00020 libdl-2.17.so
00007f7d4693a000 4 rw--- 0000000000003000 000:00020 libdl-2.17.so
00007f7d4693b000 148 r-x-- 0000000000000000 000:00020 libtinfo.so.5.9
00007f7d46960000 2048 ----- 0000000000025000 000:00020 libtinfo.so.5.9
00007f7d46b60000 16 r---- 0000000000025000 000:00020 libtinfo.so.5.9
00007f7d46b64000 4 rw--- 0000000000029000 000:00020 libtinfo.so.5.9
00007f7d46b65000 132 r-x-- 0000000000000000 000:00020 ld-2.17.so
00007f7d46d6d000 12 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46d7c000 4 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46d7d000 28 r--s- 0000000000000000 000:00020 gconv-modules.cache
00007f7d46d84000 8 rw--- 0000000000000000 000:00000 [ anon ]
00007f7d46d86000 4 r---- 0000000000021000 000:00020 ld-2.17.so
00007f7d46d87000 4 rw--- 0000000000022000 000:00020 ld-2.17.so
00007f7d46d88000 4 rw--- 0000000000000000 000:00000 [ anon ]
00007fffc4354000 132 rw--- 0000000000000000 000:00000 [ stack ]
00007fffc43e0000 8 r-x-- 0000000000000000 000:00000 [ anon ]
ffffffffff600000 4 r-x-- 0000000000000000 000:00000 [ anon ]
mapped: 116688K writeable/private: 1864K shared: 28K


最后一行非常重要:
mapped: 116688K 内存映射所占空间大小
writeable/private: 1864K 私有地址空间大小
shared: 28K 共享地址空间大小


11. netstat和ss - 网络相关信息

       Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

 从整体上看,netstat的输出结果可以分为两个部分:
 一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指%0A的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
 另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。
[root@CentOS7 ~]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.0.2.15:33164 ec2-54-191-11-118:https ESTABLISHED
tcp 0 0 10.0.2.15:52665 123.59.42.81:https ESTABLISHED
tcp 0 52 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED
tcp 0 0 10.0.2.15:53607 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:52666 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:52321 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:40108 123.59.138.92:https ESTABLISHED
tcp 0 0 10.0.2.15:55494 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55490 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:53608 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55495 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:54883 123.59.42.81:https ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 6846 /run/systemd/notify
unix 5 [ ] DGRAM 6858 /run/systemd/journal/socket
unix 22 [ ] DGRAM 6860 /dev/log
unix 2 [ ] DGRAM 9469 /run/systemd/shutdownd
unix 2 [ ] DGRAM 14069
unix 2 [ ] DGRAM 1048183
unix 3 [ ] STREAM CONNECTED 1046317




常见参数
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。
提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到
[root@CentOS7 ~]# netstat -at 列出所有 tcp 端口
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.122.1:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhos:x11-ssh-offset 0.0.0.0:* LISTEN
tcp 0 0 10.0.2.15:33164 ec2-54-191-11-118:https ESTABLISHED
tcp 0 0 10.0.2.15:52665 123.59.42.81:https ESTABLISHED
tcp 0 52 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED
tcp 0 0 10.0.2.15:53607 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:52666 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:37671 123.59.87.202:https ESTABLISHED
tcp 0 0 10.0.2.15:52321 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55494 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55490 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:53608 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:55495 123.59.42.81:https ESTABLISHED
tcp 0 0 10.0.2.15:54883 123.59.42.81:https ESTABLISHED
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhos:x11-ssh-offset [::]:* LISTEN


 
[root@CentOS7 ~]# netstat -au 列出所有 udp 端口
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 0.0.0.0:53491 0.0.0.0:*
udp 0 0 0.0.0.0:47643 0.0.0.0:*
udp 0 0 192.168.122.1:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:14662 0.0.0.0:*
udp6 0 0 [::]:49441 [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:61519 [::]:*


  



[root@CentOS7 ~]# netstat -lt 只列出所有监听 tcp 端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.122.1:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhos:x11-ssh-offset 0.0.0.0:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 localhos:x11-ssh-offset [::]:* LISTEN


 
[root@CentOS7 ~]# netstat -lu 只列出所有监听 udp 端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 0.0.0.0:53491 0.0.0.0:*
udp 0 0 0.0.0.0:47643 0.0.0.0:*
udp 0 0 192.168.122.1:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 0.0.0.0:14662 0.0.0.0:*
udp6 0 0 [::]:49441 [::]:*
udp6 0 0 localhost:323 [::]:*
udp6 0 0 [::]:61519 [::]:*


 

[root@CentOS7 ~]# netstat -lx 只列出所有监听 UNIX 端口
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 1046533 /run/user/0/pulse/native
unix 2 [ ACC ] STREAM LISTENING 9738 /run/lvm/lvmpolld.socket
unix 2 [ ACC ] STREAM LISTENING 1046289 /run/user/0/keyring/pkcs11
unix 2 [ ACC ] STREAM LISTENING 1046292 /run/user/0/keyring/ssh
unix 2 [ ACC ] STREAM LISTENING 1044502 /run/user/0/keyring/control
unix 2 [ ACC ] STREAM LISTENING 19100 @/tmp/.X11-unix/X0


显示 TCP 或 UDP 端口的统计信息 netstat -st 或 -su

[root@CentOS7 ~]# netstat -st
IcmpMsg:
InType3: 42
InType11: 24
OutType3: 48
Tcp:
71276 active connections openings
26415 passive connection openings
443 failed connection attempts
22567 connection resets received
13 connections established
6169222 segments received
6167435 segments send out
1531 segments retransmited
0 bad segments received.
101775 resets sent
UdpLite:
TcpExt:
4160 TCP sockets finished time wait in fast timer
159348 delayed acks sent
243 delayed acks further delayed because of locked socket
Quick ack mode was activated 64 times
119 packets directly queued to recvmsg prequeue.
113274 bytes directly in process context from backlog
346692 bytes directly received in process context from prequeue
642042 packet headers predicted
151 packets header predicted and directly queued to user
2108179 acknowledgments not containing data payload received
833025 predicted acknowledgments
49 congestion windows recovered without slow start after partial ack
6 retransmits in slow start
172 other TCP timeouts
TCPLossProbes: 855
TCPLossProbeRecovery: 831
48 DSACKs sent for old packets
863 DSACKs received
20455 connections reset due to unexpected data
44 connections reset due to early user close
21 connections aborted due to timeout
TCPDSACKIgnoredNoUndo: 833
TCPSpuriousRTOs: 4
IPReversePathFilter: 314
TCPRetransFail: 10
TCPRcvCoalesce: 30786
TCPChallengeACK: 7
TCPSpuriousRtxHostQueues: 29
TCPAutoCorking: 1236
TCPSynRetrans: 616
TCPOrigDataSent: 1370187
TCPHystartTrainDetect: 4
TCPHystartTrainCwnd: 82
IpExt:
InNoRoutes: 32
InMcastPkts: 1724
OutMcastPkts: 738
InBcastPkts: 43901
InOctets: 1655483718
OutOctets: 1440836672
InMcastOctets: 374261
OutMcastOctets: 119692
InBcastOctets: 3810738
InNoECTPkts: 6421160


 

[root@CentOS7 ~]# netstat -su
IcmpMsg:
InType3: 42
InType11: 24
OutType3: 48
Udp:
115000 packets received
48 packets to unknown port received.
0 packet receive errors
114624 packets sent
0 receive buffer errors
0 send buffer errors
UdpLite:
IpExt:
InNoRoutes: 32
InMcastPkts: 1724
OutMcastPkts: 738
InBcastPkts: 43901
InOctets: 1655485325
OutOctets: 1440841862
InMcastOctets: 374261
OutMcastOctets: 119692
InBcastOctets: 3810738
InNoECTPkts: 6421188


在 netstat 输出中显示 PID 和进程名称

[root@CentOS7 ~]# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.0.2.15:33164 ec2-54-191-11-118:https ESTABLISHED 23944/firefox
tcp 0 0 10.0.2.15:52665 123.59.42.81:https ESTABLISHED 24872/daotunnel
tcp 0 388 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED 23358/sshd: root@pt
tcp 0 0 10.0.2.15:53607 123.59.42.81:https ESTABLISHED 24872/daotunnel
tcp 0 0 10.0.2.15:52666 123.59.42.81:https ESTABLISHED 24872/daotunnel
tcp 0 0 10.0.2.15:52321 123.59.42.81:https ESTABLISHED 24872/daotunnel
tcp 0 0 10.0.2.15:40833 123.59.87.200:https ESTABLISHED 920/daomonit


netstat 将每隔一秒输出网络信息

[root@CentOS7 ~]# netstat -c
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.0.2.15:33164 ec2-54-191-11-118:https ESTABLISHED
tcp 0 0 10.0.2.15:52665 123.59.42.81:https ESTABLISHED
tcp 0 52 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED


显示系统不支持的地址族


[root@CentOS7 ~]# netstat --verbose
netstat: no support for `AF IPX' on this system.
netstat: no support for `AF AX25' on this system.
netstat: no support for `AF X25' on this system.
netstat: no support for `AF NETROM' on this system.


显示核心路由信息

[root@CentOS7 ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0


找出程序运行的端口

[root@CentOS7 ~]# netstat -ap | grep ssh
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 925/sshd
tcp 0 0 localhos:x11-ssh-offset 0.0.0.0:* LISTEN 23358/sshd: root@pt
tcp 0 52 CentOS7.2:ssh 192.168.56.1:61340 ESTABLISHED 23358/sshd: root@pt


显示网络接口列表

[root@CentOS7 ~]# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0 1500 186339 0 0 0 186275 0 0 0 BMU
eth0 1500 866623 0 0 0 747980 0 0 0 BMRU
eth1 1500 101288 0 0 0 83187 0 0 0 BMRU
lo 65536 5276771 0 0 0 5276771 0 0 0 LRU
virbr0 1500 0 0 0 0 0 0 0 0 BMU


ss是Socket Statistics的缩写。顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

命令参数:
-h, --help 帮助信息
-V, --version 程序版本信息
-n, --numeric 不解析服务名称
-r, --resolve        解析主机名
-a, --all 显示所有套接字(sockets)
-l, --listening 显示监听状态的套接字(sockets)
-o, --options        显示计时器信息
-e, --extended       显示详细的套接字(sockets)信息
-m, --memory         显示套接字(socket)的内存使用情况
-p, --processes 显示使用套接字(socket)的进程
-i, --info 显示 TCP内部信息
-s, --summary 显示套接字(socket)使用概况
-4, --ipv4           仅显示IPv4的套接字(sockets)
-6, --ipv6           仅显示IPv6的套接字(sockets)
-0, --packet         显示 PACKET 套接字(socket)
-t, --tcp 仅显示 TCP套接字(sockets)
-u, --udp 仅显示 UCP套接字(sockets)
-d, --dccp 仅显示 DCCP套接字(sockets)
-w, --raw 仅显示 RAW套接字(sockets)
-x, --unix 仅显示 Unix套接字(sockets)
-f, --family=FAMILY  显示 FAMILY类型的套接字(sockets),FAMILY可选,支持  unix, inet, inet6, link, netlink
-A, --query=QUERY, --socket=QUERY
      QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
-D, --diag=FILE     将原始TCP套接字(sockets)信息转储到文件
 -F, --filter=FILE   从文件中都去过滤器信息
       FILTER := [ state TCP-STATE ] [ EXPRESSION ]
显示TCP连接
[root@CentOS7 ~]# ss -t -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 192.168.122.1:domain *:*
LISTEN 0 128 *:ssh *:*
LISTEN 0 128 127.0.0.1:ipp *:*
LISTEN 0 128 127.0.0.1:x11-ssh-offset *:*
ESTAB 0 0 10.0.2.15:33164 54.191.11.118:https


显示 Sockets 摘要
[root@CentOS7 ~]# ss -s
Total: 555 (kernel 567)
TCP: 21 (estab 13, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0
 
Transport Total IP IPv6
* 567 - -
RAW 2 0 2
UDP 14 11 3
TCP 20 17 3
INET 36 28 8
FRAG 0 0 0


列出所有打开的网络连接端口

[root@CentOS7 ~]# ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:1216349100 *
nl UNCONN 0 0 rtnl:2059403794 *
nl UNCONN 0 0 rtnl:geoclue/23600 *


查看进程使用的socket


[root@CentOS7 ~]# ss -pl
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN 0 0 rtnl:1216349100 *
nl UNCONN 0 0 rtnl:2059403794 *


显示所有UDP Sockets
[root@CentOS7 ~]# ss -u -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:mdns *:*
UNCONN 0 0 *:53491 *:*
ESTAB 0 0 10.0.2.15:42245 120.25.108.11:ntp
UNCONN 0 0 *:47643 *:*
UNCONN 0 0 192.168.122.1:domain *:*
UNCONN 0 0 *%virbr0:bootps *:*
UNCONN 0 0 127.0.0.1:323 *:*
UNCONN 0 0 *:bootpc *:*
UNCONN 0 0 *:bootpc *:*
UNCONN 0 0 *:14662 *:*
ESTAB 0 0 10.0.2.15:39026 202.118.1.81:ntp


12. tcpdump:详细的网络流量分析



      用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
参数:
-nn,直接以 IP 及 Port Number 显示,而非主机名与服务名称。
-i,后面接要「监听」的网络接口,例如 eth0, lo, ppp0 等等的接口。
-w,如果你要将监听所得的数据包数据储存下来,用这个参数就对了。后面接文件名。
-c,监听的数据包数,如果没有这个参数, tcpdump 会持续不断的监听,
直到用户输入 [ctrl]-c 为止。
-A,数据包的内容以 ASCII 显示,通常用来捉取 WWW 的网页数据包资料。
-e,使用资料连接层 (OSI 第二层) 的 MAC 数据包数据来显示。
-q,仅列出较为简短的数据包信息,每一行的内容比较精简。
-X,可以列出十六进制 (hex) 以及 ASCII 的数据包内容,对于监听数据包内容很有用。
-r,从后面接的文件将数据包数据读出来。那个「文件」是已经存在的文件,
并且这个「文件」是由 -w 所制作出来的。
所欲捕获的数据内容:我们可以专门针对某些通信协议或者是 IP 来源进行数据包捕获。
那就可以简化输出的结果,并取得最有用的信息。常见的表示方法有。
'host foo', 'host 127.0.0.1' :针对单台主机来进行数据包捕获。
'net 192.168' :针对某个网段来进行数据包的捕获。
'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制。
'tcp port 21':还可以针对通信协议检测,如tcp、udp、arp、ether 等。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'||'
[root@CentOS7 ~]# tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
02:58:12.453576 IP 10.0.2.15.41384 > 123.59.138.93.https: Flags [F.], seq 3046243613, ack 2957421906, win 42600, length 0
02:58:12.453863 IP 123.59.138.93.https > 10.0.2.15.41384: Flags [.], ack 1, win 65535, length 0
02:58:12.454352 IP 10.0.2.15.43009 > 112.54.207.8.domain: 15449+ PTR? 93.138.59.123.in-addr.arpa. (44)
02:58:12.484893 IP 123.59.138.93.https > 10.0.2.15.41384: Flags [P.], seq 1:54, ack 1, win 65535, length 53
02:58:12.484932 IP 10.0.2.15.41384 > 123.59.138.93.https: Flags [R], seq 3046243614, win 0, length 0
02:58:12.485000 IP 123.59.138.93.https > 10.0.2.15.41384: Flags [F.], seq 54, ack 1, win 65535, length 0
35 packets captured
162 packets received by filter
97 packets dropped by kernel