Linux-系统监测命令
# Linux-系统监测命令
# 1、tcpdump
tcpdump给使用者提供了大量的选项,用以过滤数据包或者定制输出格式
- -n,使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称
- -i,指定要监听的网卡接口。“-i any”表示抓取所有网卡接口上的数据包
- -v,输出一个稍微详细的信息,例如,显示IP数据包中的TTL和TOS信息
- -t,不打印时间戳
- -e,显示以太网帧头部信息。
- -c,仅抓取指定数量的数据包
- -x,以十六进制数显示数据包的内容,但不显示包中以太网帧的头部信息。
- -X,与-x选项类似,不过还打印每个十六进制字节对应的ASCII字符
- -XX,与-X相同,不过还打印以太网帧的头部信息
- -s,设置抓包时的抓取长度。当数据包的长度超过抓取长度时,tcpdump抓取到的将是被截断的数据包。在4.0以及之前的版本中,默认的抓包长度是68字节。这对于IP、TCP和UDP等协议就已经足够了,但对于像DNS、NFS这样的协议,68字节通常不能容纳一个完整的数据包。不过4.0之后的版本,默认的抓包长度被修改为65 535字节,因此我们不用再担心抓包长度的问题了
- -S,以绝对值来显示TCP报文段的序号,而不是相对值
- -w,将tcpdump的输出以特殊的格式定向到某个文件
- -r,从文件读取数据包信息并显示之
除了使用选项外,tcpdump还支持用表达式来进一步过滤数据包。tcpdump表达式的操作数分为3种:类型(type)、方向(dir)和协议(proto)
类型,解释其后面紧跟着的参数的含义。tcpdump支持的类型包括host、net、port和portrange。它们分别指定主机名(或IP地址),用CIDR方法表示的网络地址,端口号以及端口范围。比如,要抓取整个1.2.3.0/255.255.255.0网络上的数据包,可以使用如下命令:
$tcpdump net 1.2.3.0/24
方向,src指定数据包的发送端,dst指定数据包的目的端。比如要抓取进入端口13579的数据包,可以使用如下命令:
$tcpdump dst port 13579
协议,指定目标协议。比如要抓取所有ICMP数据包,可以使用如下命令:
$tcpdump icmp
我们还可以使用逻辑操作符来组织上述操作数以创建更复杂的表达式。tcpdump支持的逻辑操作符和编程语言中的逻辑操作符完全相同,包括and(或者&&)、or(或者||)、not(或者!)。比如要抓取主机ernest-laptop和所有非Kongming20的主机之间交换的IP数据包,可以使用如下命令:
$tcpdump ip host ernest-laptop and not Kongming20
# 2、lsof
lsof(list open file)是一个列出当前系统打开的文件描述符的工具。通过它我们可以了解感兴趣的进程打开了哪些文件描述符,或者我们感兴趣的文件描述符被哪些进程打开了
-i,显示socket文件描述符。该选项的使用方法是
$lsof-i[46][protocol][@hostname|ipaddr][:service|port]
其中,4表示IPv4协议,6表示IPv6协议;protocol指定传输层协议,可以是TCP或者UDP;hostname指定主机名;ipaddr指定主机的IP地址;service指定服务名;port指定端口号。比如,要显示所有连接到主机192.168.1.108的ssh服务的socket文件描述符,可以使用命令:
$lsof-i@192.168.1.108:22
如果-i选项后不指定任何参数,则lsof命令将显示所有socket文件描述符
-u,显示指定用户启动的所有进程打开的所有文件描述符
-c,显示指定的命令打开的所有文件描述符。
比如要查看websrv程序打开了哪些文件描述符,可以使用如下命令:
$lsof-c websrv
-p,显示指定进程打开的所有文件描述符
-t,仅显示打开了目标文件描述符的进程的PID
lsof命令的输出内容相当丰富,其中每行内容都包含如下字段:
- COMMAND,执行程序所使用的终端命令(默认仅显示前9个字符)
- PID,文件描述符所属进程的PID。
- USER,拥有该文件描述符的用户的用户名。
- FD,文件描述符的描述。其中cwd表示进程的工作目录,rtd表示用户的根目录,txt表示进程运行的程序代码,mem表示直接映射到内存中的文件(本例中都是动态库)。有的FD是以“数字+访问权限”表示的,其中数字是文件描述符的具体数值,访问权限包括r(可读)、w(可写)和u(可读可写)
- TYPE,文件描述符的类型。其中DIR是目录,REG是普通文件,CHR是字符设备文件,IPv4是IPv4类型的socket文件描述符,0000是未知类型
- DEVICE,文件所属设备。对于字符设备和块设备,其表示方法是“主设备号,次设备号”。
- SIZE/OFF,文件大小或者偏移值。如果该字段显示为“0t*”或者“0x*”,就表示这是一个偏移值,否则就表示这是一个文件大小
- NODE,文件的i节点号。对于socket,则显示为协议类型,比如“TCP“
- NAME,文件的名字。
# 3、nc
nc(netcat)命令短小精干、功能强大,有着“瑞士军刀”的美誉。
它主要被用来快速构建网络连接。我们可以让它以服务器方式运行,监听某个端口并接收客户连接,因此它可用来调试客户端程序。我们也可以使之以客户端方式运行,向服务器发起连接并收发数据,因此它可以用来调试服务器程序,此时它有点像telnet程序
- -i,设置数据包传送的时间间隔
- -l,以服务器方式运行,监听指定的端口。nc命令默认以客户端方式运行
- -k,重复接受并处理某个端口上的所有连接,必须与-l选项一起使用
- -n,使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称。
- -p,当nc命令以客户端方式运行时,强制其使用指定的端口号
- -s,设置本地主机发送出的数据包的IP地址。
- -C,将CR和LF两个字符作为行结束符
- -U,使用UNIX本地域协议通信
- -u,使用UDP协议。nc命令默认使用的传输层协议是TCP协议
- -w,如果nc客户端在指定的时间内未检测到任何输入,则退出
- -X,当nc客户端和代理服务器通信时,该选项指定它们之间使用的通信协议。目前nc支持的代理协议包括“4”(SOCKSv.4),“5”(SOCKS v.5)和“connect”(HTTPS proxy)。nc默认使用的代理协议是SOCKS v.5
- -x,指定目标代理服务器的IP地址和端口号
- -z,扫描目标机器上的某个或某些服务是否开启(端口扫描)
举例来说,我们可以使用如下方式来连接websrv服务器并向它发送数据
$nc-C 127.0.0.1 13579(服务器监听端口13579)GET http://localhost/a.htmlHTTP/1.1(回车)Host:localhost(回车)(回车)HTTP/1.1 404 Not FoundContent-Length:49Connection:closeThe requested file was not found onthis server.
# 4、strace
strace是测试服务器性能的重要工具。它跟踪程序运行过程中执行的系统调用和接收到的信号,并将系统调用名、参数、返回值及信号名输出到标准输出或者指定的文件。
-c,统计每个系统调用执行时间、执行次数和出错次数
-f,跟踪由fork调用生成的子进程
-t,在输出的每一行信息前加上时间信息。
-e,指定一个表达式,用来控制如何跟踪系统调用(或接收到的信号,下同)。其格式是
[qualifier=][!]value1[,value2]...
- -e trace=set,只跟踪指定的系统调用。例如,-e trace=open,close,read,write表示只跟踪open、close、read和write这四种系统调用
- -e trace=file,只跟踪与文件操作相关的系统调用
- -e trace=process,只跟踪与进程控制相关的系统调用
- -e trace=network,只跟踪与网络相关的系统调用
-o,将strace的输出写入指定的文件
# 5、netstat
netstat是一个功能很强大的网络信息统计工具。它可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等
- -n,使用IP地址表示主机,而不是主机名;使用数字表示端口号,而不是服务名称
- -a,显示结果中也包含监听socket
- -t,仅显示TCP连接
- -r,显示路由信息
- -i,显示网卡接口的数据流量
- -c,每隔1 s输出一次
- -o,显示socket定时器(比如保活定时器)的信息
- -p,显示socket所属的进程的PID和名字
netstat的每行输出都包含如下6个字段(默认情况)
- Proto,协议名
- Recv-Q,socket内核接收缓冲区中尚未被应用程序读取的数据量
- Send-Q,未被对方确认的数据量
- Local Address,本端的IP地址和端口号。
- Foreign Address,对方的IP地址和端口号。
- State,socket的状态。对于无状态协议,比如UDP协议,这一字段将显示为空。而对面向连接的协议而言,netstat支持的State包括ESTABLISHED、SYN_SENT、SYN_RCVD、FIN_WAIT1、FIN_WAIT2、TIME_WAIT、CLOSE、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN
# 6、vmstat
vmstat是virtual memory statistics的缩写,它能实时输出系统的各种资源的使用情况,比如进程信息、内存使用、CPU使用率以及I/O使用情况
- -f,显示系统自启动以来执行的fork次数
- -s,显示内存相关的统计信息以及多种系统活动的数量(比如CPU上下文切换次数)
- -d,显示磁盘相关的统计信息。
- -p,显示指定磁盘分区的统计信息。
- -S,使用指定的单位来显示。参数k、K、m、M分别代表1000、1024、1 000000和1 048 576字节
- delay,采样间隔(单位是s),即每隔delay的时间输出一次统计信息。
- count,采样次数,即共输出count次统计信息。
输出结果:
- procs,进程信息。“r”表示等待运行的进程数目;“b”表示处于不可中断睡眠状态的进程数目。
- memory,内存信息,各项的单位都是千字节(KB)。“swpd”表示虚拟内存的使用数量。“free”表示空闲内存的数量。“buff”表示作为“buffer cache”的内存数量。从磁盘读入的数据可能被保持在“buffercache”中,以便下一次快速访问。“cache”表示作为“page cache”的内存数量。待写入磁盘的数据将首先被放到“page cache”中,然后由磁盘中断程序写入磁盘
- swap,交换分区(虚拟内存)的使用信息,各项的单位都是KB/s。“si”表示数据由磁盘交换至内存的速率;“so”表示数据由内存交换至磁盘的速率。如果这两个值经常发生变化,则说明内存不足。
- io,块设备的使用信息,单位是block/s。“bi”表示从块设备读入块的速率;“bo”表示向块设备写入块的速率
- system,系统信息。“in”表示每秒发生的中断次数;“cs”表示每秒发生的上下文切换(进程切换)次数。
- cpu,CPU使用信息。“us”表示系统所有进程运行在用户空间的时间占CPU总运行时间的比例;“sy”表示系统所有进程运行在内核空间的时间占CPU总运行时间的比例;“id”表示CPU处于空闲状态的时间占CPU总运行时间的比例;“wa”表示CPU等待I/O事件的时间占CPU总运行时间的比例
# 7、ifstat
ifstat是interface statistics的缩写,它是一个简单的网络流量监测工具
- -a,监测系统上的所有网卡接口
- -i,指定要监测的网卡接口。
- -t,在每行输出信息前加上时间戳
- -b,以Kbit/s为单位显示数据,而不是默认的KB/s。
- delay,采样间隔(单位是s),即每隔delay的时间输出一次统计信息。
- count,采样次数,即共输出count次统计信息。
# 8、mpstat
mpstat是multi-processor statistics的缩写,它能实时监测多处理器系统上每个CPU的使用情况。mpstat命令和iostat命令通常都集成在包sysstat中,安装sysstat即可获得这两个命令。
mpstat命令的典型用法是(mpstat命令的选项不多,这里不再专门介绍):
mpstat[-P{|ALL}][interval[count]]
选项P指定要监控的CPU号(0~CPU个数-1),其值“ALL”表示监听所有的CPU。interval参数是采样间隔(单位是s),即每隔interval的时间输出一次统计信息。count参数是采样次数,即共输出count次统计信息,但mpstat最后还会输出这count次采样结果的平均值。与vmstat命令一样,mpstat命令输出的第一次结果是自系统启动以来的平均结果,而后面(count-1)次输出结果则是采样间隔内的平均结果
每条信息都包含如下几个字段:
- CPU,指示该条信息是哪个CPU的数据。“0”表示是第1个CPU的数据,“1”表示是第2个CPU的数据,“all”则表示是这两个CPU数据的平均值
- %usr,除了nice值为负的进程,系统上其他进程运行在用户空间的时间占CPU总运行时间的比例。
- %nice,nice值为负的进程运行在用户空间的时间占CPU总运行时间的比例。
- %sys,系统上所有进程运行在内核空间的时间占CPU总运行时间的比例,但不包括硬件和软件中断消耗的CPU时间。
- %iowait,CPU等待磁盘操作的时间占CPU总运行时间的比例。
- %irq,CPU用于处理硬件中断的时间占CPU总运行时间的比例。
- %soft,CPU用于处理软件中断的时间占CPU总运行时间的比例。
- %steal,一个物理CPU可以包含一对虚拟CPU,这一对虚拟CPU由超级管理程序管理。当超级管理程序在处理某个虚拟CPU时,另外一个虚拟CPU则必须等待它处理完成才能运行。这部分等待时间就是所谓的steal时间。该字段表示steal时间占CPU总运行时间的比例
- %guest,运行虚拟CPU的时间占CPU总运行时间的比例。
- %idle,系统空闲的时间占CPU总运行时间的比例。
在所有这些输出字段中,我们最关心的是%user、%sys和%idle。它们基本上反映了我们的代码中业务逻辑代码和系统调用所占的比例,以及系统还能承受多大的负载