Linux 性能监控之命令行工具

时间:2023-03-08 17:01:31
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 :
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd root 3u IPv4 0t0 TCP *:ssh (LISTEN)
sshd root 4u IPv6 0t0 TCP *:ssh (LISTEN)
sshd root 3u IPv4 0t0 TCP CentOS7.:ssh->192.168.56.1: (ESTABLISHED)
查看所属root用户进程所打开的文件类型为txt的文件
[root@CentOS7 ~]# lsof -a -u root -d txt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd root txt REG , /usr/lib/systemd/systemd
kthreadd root txt unknown /proc//exe
ksoftirqd root txt unknown /proc//exe
migration root txt unknown /proc//exe
rcu_bh root txt unknown /proc//exe

2. top - 进程活动

       top提供一个当前运行系统实时动态的视图,也就是正在运行进程。在默认情况下,显示系统中CPU使用率最高的任务,并每5秒钟刷新一次。

常用热键

t:显示摘要信息开关

top - :: up  days, :,  users, load average: 0.00, 0.01, 0.05
Tasks: total, running, sleeping, stopped, zombie
%Cpu(s): 0.3/0.7 [| ]
KiB Mem : total, free, used, buff/cache
KiB Swap: total, free, used. avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root S 0.3 0.0 :09.05 kworker/:
root R 0.3 0.4 :02.25 top
root S 0.3 7.7 :39.63 firefox
root S 0.0 0.8 :27.20 systemd
root S 0.0 0.0 :02.22 kthreadd
root S 0.0 0.0 :11.69 ksoftirqd/
root rt S 0.0 0.0 :00.00 migration/
root S 0.0 0.0 :00.00 rcu_bh
root S 0.0 0.0 :00.00 rcuob/
root S 0.0 0.0 :09.07 rcu_sched
root S 0.0 0.0 :11.36 rcuos/
root rt S 0.0 0.0 :03.03 watchdog/
root - S 0.0 0.0 :00.00 khelper
root S 0.0 0.0 :00.00 kdevtmpfs
root - S 0.0 0.0 :00.00 netns
root - S 0.0 0.0 :00.00 perf
m:显示内存信息开关
top - :: up  days, :,  users, load average: 0.00, 0.01, 0.05
Tasks: total, running, sleeping, stopped, 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/ [|||||||||||||||||||||||||||||||||||||||||||||| ]
KiB Swap: 6.4/ [||||| ]
A:分类显示系统不同资源的使用大户,有助于快速识别系统中资源消耗多的任务
:Def - :: up  days, :,  users, load average: 0.00, 0.01, 0.05
Tasks: total, running, sleeping, stopped, 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 : total, free, used, buff/cache
KiB Swap: total, free, used. avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root S 0.3 2.2 :28.34 daomonit
root R 0.3 0.4 :03.00 top
root S 0.0 0.8 :27.20 systemd
PID PPID TIME+ %CPU %MEM PR NI S VIRT RES UID COMMAND
:03.29 0.0 0.0 - S kworker/:2H
:00.04 0.0 0.3 S gvfsd-metadata
:40.25 0.0 7.7 S firefox
PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND
10.7 26k 0.0 gnome-shell
7.7 46k 0.0 firefox
3.2 0.0 dhclient
PID PPID UID USER RUSER TTY TIME+ %CPU %MEM S COMMAND
rtkit rtkit ? :03.06 0.0 0.1 S rtkit-daemon
root root ? :27.20 0.0 0.8 S systemd
root root ? :02.22 0.0 0.0 S kthreadd
root root ? :11.70 0.0 0.0 S ksoftirqd/

f:添加删除所要显示栏位

Fields Management for window :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 = ]

k:结束一个正在运行的进程

PID to signal/kill [default pid = ]

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
nf_conntrack_ffff88001a2d8000
nf_conntrack_ffffffff81a25e00
kcopyd_job
dm_uevent
dm_rq_target_io
每隔3秒5次:
 [root@CentOS7 ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st

4. w - 显示谁已登录

w命令显示系统当前用户及其运行进程的信息。
[root@CentOS7 ~]# w root
:: up days, :, users, load average: 0.05, 0.12, 0.13
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root : : Sat23 ?xdm? :08m .65s gdm-session-worker [pam/gdm-password]
root pts/ 192.168.56.1 Sun22 :35m .61s .00s lsof
root pts/ 192.168.56.1 : .00s .20s .01s w root

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

uptime命令过去只显示系统运行多久。现在,可以显示系统运行多久、当前有多少的用户登录、在过去的1,5,15分钟里平均负载时多少。
[root@CentOS7 ~]# uptime
:: up days, :, 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
S - wait pts/ :: bash
R - - pts/ :: 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 0.0 0.8 ? Ss May20 : /usr/lib/systemd/systemd
root 0.0 0.0 ? S May20 : [kthreadd]
root 0.1 0.0 ? S May20 : [ksoftirqd/]
root 0.0 0.0 ? S May20 : [migration/]
root 0.0 0.0 ? S May20 : [rcu_bh]
root 0.0 0.0 ? S May20 : [rcuob/]
root 0.1 0.0 ? S May20 : [rcu_sched]
root 0.3 0.0 ? S May20 : [rcuos/]
root 0.0 0.0 ? S May20 : [watchdog/]
root 0.0 0.0 ? S< May20 : [khelper]
root 0.0 0.0 ? S May20 : [kdevtmpfs]
root 0.0 0.0 ? S< May20 : [netns]
root 0.0 0.0 ? S< May20 : [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
S - ep_pol ? :: systemd
S - kthrea ? :: kthreadd
S - smpboo ? :: ksoftirqd/
S - - - smpboo ? :: migration/
S - rcu_gp ? :: rcu_bh
S - rcu_no ? :: rcuob/
S - rcu_gp ? :: rcu_sched
S - rcu_no ? :: rcuos/
S - - - smpboo ? :: watchdog/
S - - rescue ? :: khelper
例4.列出类似程序树的程序显示
[root@CentOS7 ~]# ps -axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
? - S : [kthreadd]
? - S : \_ [ksoftirqd/]
? - S : \_ [migration/]
? - S : \_ [rcu_bh]
? - S : \_ [rcuob/]
? - S : \_ [rcu_sched]
? - S : \_ [rcuos/]
例5.找出与 crypto 与 bash 这两个服务有关的 PID 号码
[root@CentOS7 ~]# ps aux | egrep '(crypto|bash)'
root 0.0 0.0 ? S< May20 : [crypto]
root 0.0 0.1 ? S May20 : /bin/bash /usr/sbin/ksmtuned
root 0.0 0.6 pts/ Ss : : -bash
root 0.0 0.0 ? Ss May21 : /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root 0.0 0.1 pts/ S+ : : grep -E --color=auto (crypto|bash)

7. free - 内存使用情况

[root@CentOS7 ~]# free

              total       used       free     shared    buffers     cached
Mem:
-/+ buffers/cache:
Swap:
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.-.el7.x86_64 (CentOS7.) // _x86_64_ ( 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
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
Linux 3.10.-.el7.x86_64 (CentOS7.) // _x86_64_ ( 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
sda1 0.01 0.02 0.01
sda2 43.56 438.87 217.75
sda3 152.42 5671.42 153.45

9. mpstat - 多处理器使用率

mpstat命令可以显示所有可用处理器的使用情况,处理器编号从0开始。mpstat -P ALL显示每个处理器的平均使用率。
[root@CentOS7 ~]# mpstat -P ALL
Linux 3.10.-.el7.x86_64 (CentOS7.) // _x86_64_ ( CPU)
:: PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
:: PM all 5.19 0.00 2.70 3.54 0.00 0.81 0.00 0.00 0.00 87.76
:: PM 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
: -bash
Address Kbytes Mode Offset Device Mapping
r-x-- : bash
00000000006dc000 r---- 00000000000dc000 : bash
00000000006dd000 rw--- 00000000000dd000 : bash
00000000006e6000 rw--- : [ anon ]
000000000221d000 rw--- : [ anon ]
00007f7d3fc3d000 r---- : locale-archive
00007f7d46164000 r-x-- : libnss_files-2.17.so
00007f7d4616f000 ----- 000000000000b000 : libnss_files-2.17.so
00007f7d4636e000 r---- 000000000000a000 : libnss_files-2.17.so
00007f7d4636f000 rw--- 000000000000b000 : libnss_files-2.17.so
00007f7d46370000 rw--- : [ anon ]
00007f7d46376000 r-x-- : libc-2.17.so
00007f7d4652c000 ----- 00000000001b6000 : libc-2.17.so
00007f7d4672c000 r---- 00000000001b6000 : libc-2.17.so
00007f7d46730000 rw--- 00000000001ba000 : libc-2.17.so
00007f7d46732000 rw--- : [ anon ]
00007f7d46737000 r-x-- : libdl-2.17.so
00007f7d4673a000 ----- : libdl-2.17.so
00007f7d46939000 r---- : libdl-2.17.so
00007f7d4693a000 rw--- : libdl-2.17.so
00007f7d4693b000 r-x-- : libtinfo.so.5.9
00007f7d46960000 ----- : libtinfo.so.5.9
00007f7d46b60000 r---- : libtinfo.so.5.9
00007f7d46b64000 rw--- : libtinfo.so.5.9
00007f7d46b65000 r-x-- : ld-2.17.so
00007f7d46d6d000 rw--- : [ anon ]
00007f7d46d7c000 rw--- : [ anon ]
00007f7d46d7d000 r--s- : gconv-modules.cache
00007f7d46d84000 rw--- : [ anon ]
00007f7d46d86000 r---- : ld-2.17.so
00007f7d46d87000 rw--- : ld-2.17.so
00007f7d46d88000 rw--- : [ anon ]
00007fffc4354000 rw--- : [ stack ]
00007fffc43e0000 r-x-- : [ anon ]
ffffffffff600000 r-x-- : [ 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 10.0.2.15: ec2----:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp CentOS7.:ssh 192.168.56.1: ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.138.92:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix [ ] DGRAM /run/systemd/notify
unix [ ] DGRAM /run/systemd/journal/socket
unix [ ] DGRAM /dev/log
unix [ ] DGRAM /run/systemd/shutdownd
unix [ ] DGRAM
unix [ ] DGRAM
unix [ ] STREAM CONNECTED
常见参数
-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 192.168.122.1:domain 0.0.0.0:* LISTEN
tcp 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp localhost:ipp 0.0.0.0:* LISTEN
tcp localhos:x11-ssh-offset 0.0.0.0:* LISTEN
tcp 10.0.2.15: ec2----:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp CentOS7.:ssh 192.168.56.1: ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.87.202:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp6 [::]:ssh [::]:* LISTEN
tcp6 localhost:ipp [::]:* LISTEN
tcp6 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:mdns 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp 192.168.122.1:domain 0.0.0.0:*
udp 0.0.0.0:bootps 0.0.0.0:*
udp localhost: 0.0.0.0:*
udp 0.0.0.0:bootpc 0.0.0.0:*
udp 0.0.0.0:bootpc 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp6 [::]: [::]:*
udp6 localhost: [::]:*
udp6 [::]: [::]:*
[root@CentOS7 ~]# netstat -lt 只列出所有监听 tcp 端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 192.168.122.1:domain 0.0.0.0:* LISTEN
tcp 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp localhost:ipp 0.0.0.0:* LISTEN
tcp localhos:x11-ssh-offset 0.0.0.0:* LISTEN
tcp6 [::]:ssh [::]:* LISTEN
tcp6 localhost:ipp [::]:* LISTEN
tcp6 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:mdns 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp 192.168.122.1:domain 0.0.0.0:*
udp 0.0.0.0:bootps 0.0.0.0:*
udp localhost: 0.0.0.0:*
udp 0.0.0.0:bootpc 0.0.0.0:*
udp 0.0.0.0:bootpc 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp6 [::]: [::]:*
udp6 localhost: [::]:*
udp6 [::]: [::]:*
[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:mdns 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp 192.168.122.1:domain 0.0.0.0:*
udp 0.0.0.0:bootps 0.0.0.0:*
udp localhost: 0.0.0.0:*
udp 0.0.0.0:bootpc 0.0.0.0:*
udp 0.0.0.0:bootpc 0.0.0.0:*
udp 0.0.0.0: 0.0.0.0:*
udp6 [::]: [::]:*
udp6 localhost: [::]:*
udp6 [::]: [::]:*
[root@CentOS7 ~]# netstat -lx 只列出所有监听 UNIX 端口
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
unix [ ACC ] STREAM LISTENING /run/user//pulse/native
unix [ ACC ] STREAM LISTENING /run/lvm/lvmpolld.socket
unix [ ACC ] STREAM LISTENING /run/user//keyring/pkcs11
unix [ ACC ] STREAM LISTENING /run/user//keyring/ssh
unix [ ACC ] STREAM LISTENING /run/user//keyring/control
unix [ ACC ] STREAM LISTENING @/tmp/.X11-unix/X0

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

[root@CentOS7 ~]# netstat -st
IcmpMsg:
InType3:
InType11:
OutType3:
Tcp:
active connections openings
passive connection openings
failed connection attempts
connection resets received
connections established
segments received
segments send out
segments retransmited
bad segments received.
resets sent
UdpLite:
TcpExt:
TCP sockets finished time wait in fast timer
delayed acks sent
delayed acks further delayed because of locked socket
Quick ack mode was activated times
packets directly queued to recvmsg prequeue.
bytes directly in process context from backlog
bytes directly received in process context from prequeue
packet headers predicted
packets header predicted and directly queued to user
acknowledgments not containing data payload received
predicted acknowledgments
congestion windows recovered without slow start after partial ack
retransmits in slow start
other TCP timeouts
TCPLossProbes:
TCPLossProbeRecovery:
DSACKs sent for old packets
DSACKs received
connections reset due to unexpected data
connections reset due to early user close
connections aborted due to timeout
TCPDSACKIgnoredNoUndo:
TCPSpuriousRTOs:
IPReversePathFilter:
TCPRetransFail:
TCPRcvCoalesce:
TCPChallengeACK:
TCPSpuriousRtxHostQueues:
TCPAutoCorking:
TCPSynRetrans:
TCPOrigDataSent:
TCPHystartTrainDetect:
TCPHystartTrainCwnd:
IpExt:
InNoRoutes:
InMcastPkts:
OutMcastPkts:
InBcastPkts:
InOctets:
OutOctets:
InMcastOctets:
OutMcastOctets:
InBcastOctets:
InNoECTPkts:
[root@CentOS7 ~]# netstat -su
IcmpMsg:
InType3:
InType11:
OutType3:
Udp:
packets received
packets to unknown port received.
packet receive errors
packets sent
receive buffer errors
send buffer errors
UdpLite:
IpExt:
InNoRoutes:
InMcastPkts:
OutMcastPkts:
InBcastPkts:
InOctets:
OutOctets:
InMcastOctets:
OutMcastOctets:
InBcastOctets:
InNoECTPkts:
在 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 10.0.2.15: ec2----:https ESTABLISHED /firefox
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED /daotunnel
tcp CentOS7.:ssh 192.168.56.1: ESTABLISHED /sshd: root@pt
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED /daotunnel
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED /daotunnel
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED /daotunnel
tcp 10.0.2.15: 123.59.87.200:https ESTABLISHED /daomonit
netstat 将每隔一秒输出网络信息
[root@CentOS7 ~]# netstat -c
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 10.0.2.15: ec2----:https ESTABLISHED
tcp 10.0.2.15: 123.59.42.81:https ESTABLISHED
tcp CentOS7.:ssh 192.168.56.1: 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 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U eth0
172.17.0.0 0.0.0.0 255.255.0.0 U docker0
192.168.56.0 0.0.0.0 255.255.255.0 U eth1
192.168.122.0 0.0.0.0 255.255.255.0 U virbr0
找出程序运行的端口
[root@CentOS7 ~]# netstat -ap | grep ssh
tcp 0.0.0.0:ssh 0.0.0.0:* LISTEN /sshd
tcp localhos:x11-ssh-offset 0.0.0.0:* LISTEN /sshd: root@pt
tcp CentOS7.:ssh 192.168.56.1: ESTABLISHED /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 BMU
eth0 BMRU
eth1 BMRU
lo LRU
virbr0 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 192.168.122.1:domain *:*
LISTEN *:ssh *:*
LISTEN 127.0.0.1:ipp *:*
LISTEN 127.0.0.1:x11-ssh-offset *:*
ESTAB 10.0.2.15: 54.191.11.118:https
显示 Sockets 摘要
[root@CentOS7 ~]# ss -s
Total: (kernel )
TCP: (estab , closed , orphaned , synrecv , timewait /), ports Transport Total IP IPv6
* - -
RAW
UDP
TCP
INET
FRAG
列出所有打开的网络连接端口
[root@CentOS7 ~]# ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN rtnl: *
nl UNCONN rtnl: *
nl UNCONN rtnl:geoclue/ *
查看进程使用的socket
[root@CentOS7 ~]# ss -pl
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
nl UNCONN rtnl: *
nl UNCONN rtnl: *
显示所有UDP Sockets
[root@CentOS7 ~]# ss -u -a
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN *:mdns *:*
UNCONN *: *:*
ESTAB 10.0.2.15: 120.25.108.11:ntp
UNCONN *: *:*
UNCONN 192.168.122.1:domain *:*
UNCONN *%virbr0:bootps *:*
UNCONN 127.0.0.1: *:*
UNCONN *:bootpc *:*
UNCONN *:bootpc *:*
UNCONN *: *:*
ESTAB 10.0.2.15: 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 bytes
::12.453576 IP 10.0.2.15. > 123.59.138.93.https: Flags [F.], seq , ack , win , length
::12.453863 IP 123.59.138.93.https > 10.0.2.15.: Flags [.], ack , win , length
::12.454352 IP 10.0.2.15. > 112.54.207.8.domain: + PTR? 93.138.59.123.in-addr.arpa. ()
::12.484893 IP 123.59.138.93.https > 10.0.2.15.: Flags [P.], seq :, ack , win , length
::12.484932 IP 10.0.2.15. > 123.59.138.93.https: Flags [R], seq , win , length
::12.485000 IP 123.59.138.93.https > 10.0.2.15.: Flags [F.], seq , ack , win , length
packets captured
packets received by filter
packets dropped by kernel