linux cmd

20个命令行工具监控 Linux 系统性能

linux常用的监控命令

25个Linux性能监控工具

Linux free -m 详解命令

top

选项

-b:以批处理模式操作;

-c:显示完整的治命令;

-d:屏幕刷新间隔时间;

-I:忽略失效过程;

-s:保密模式;

-S:累积模式;

-i<时间>:设置间隔时间;

-u<用户名>:指定用户名;

-p<进程号>:指定进程;

-n<次数>:循环显示的次数。

交互命令

h:显示帮助画面,给出一些简短的命令总结说明;

k:终止一个进程;

i:忽略闲置和僵死进程,这是一个开关式命令;

q:退出程序;

r:重新安排一个进程的优先级别;

S:切换到累计模式;

s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;

f或者F:从当前显示中添加或者删除项目;

o或者O:改变显示项目的顺序;

l:切换显示平均负载和启动时间信息;

m:切换显示内存信息;

t:切换显示进程和CPU状态信息;

c:切换显示命令名称和完整命令行;

M:根据驻留内存大小进行排序;

P:根据CPU使用百分比大小进行排序;

T:根据时间/累计时间进行排序;

w:将当前设置写入~/.toprc文件中。

实例

top - 09:44:56 up 16 days, 21:23, 1 user, load average: 9.59, 4.75, 1.92

Tasks: 145 total, 2 running, 143 sleeping, 0 stopped, 0 zombie

Cpu(s): 99.8%us, 0.1%sy, 0.0%ni, 0.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 4147888k total, 2493092k used, 1654796k free, 158188k buffers

Swap: 5144568k total, 56k used, 5144512k free, 2013180k cached

解释

top - 09:44:56[当前系统时间],

16 days[系统已经运行了16天],

1 user[个用户当前登录],

load average: 9.59, 4.75, 1.92[系统负载,即任务队列的平均长度]

Tasks: 145 total[总进程数],

2 running[正在运行的进程数],

143 sleeping[睡眠的进程数],

0 stopped[停止的进程数],

0 zombie[冻结进程数],

Cpu(s): 99.8%us[用户空间占用CPU百分比],

0.1%sy[内核空间占用CPU百分比],

0.0%ni[用户进程空间内改变过优先级的进程占用CPU百分比],

0.2%id[空闲CPU百分比], 0.0%wa[等待输入输出的CPU时间百分比],

0.0%hi[],

0.0%st[],

Mem: 4147888k total[物理内存总量],

2493092k used[使用的物理内存总量],

1654796k free[空闲内存总量],

158188k buffers[用作内核缓存的内存量]

Swap: 5144568k total[交换区总量],

56k used[使用的交换区总量],

5144512k free[空闲交换区总量],

2013180k cached[缓冲的交换区总量],

free

选项

-b:以Byte为单位显示内存使用情况;

-k:以KB为单位显示内存使用情况;

-m:以MB为单位显示内存使用情况;

-o:不显示缓冲区调节列;

-s<间隔秒数>:持续观察内存使用状况;

-t:显示内存总和列;

-V:显示版本信息。

实例

free -m

total used free shared buffers cached

Mem: 2016 1973 42 0 163 1497

-/+ buffers/cache: 312 1703

Swap: 4094 0 4094

###第一部分mem行解释:
total:内存总数;

used:已经使用的内存数;

free:空闲的内存数;

shared:当前已经废弃不用;

buffers Buffer:缓存内存数;

cached Page:缓存内存数。

关系:total = used + free

第二部分(-/+ buffers/cache)解释:

(-buffers/cache) used内存数:第一部分Mem行中的 used – buffers – cached

(+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

第三部分是指交换分区。

我想大家看了上面,还是很晕.第一部分(Mem)与第二部分(-/+ buffers/cache)的结果中有关used和free为什么这么奇怪.

其实我们可以从二个方面来解释.

对操作系统来讲是Mem的参数.buffers/cached 都是属于被使用,所以它认为free只有232.

对应用程序来讲是(-/+ buffers/cach).buffers/cached 是等同可用的,因为buffer/cached是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用.

所以,以应用来看看,以(-/+ buffers/cache)的free和used为主.所以我们看这个就好了.另外告诉大家一些常识.Linux为了提高磁盘和内存存取效率, Linux做了很多精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache能有效缩短了 I/O系统调用(比如read,write,getdents)的时间.

记住内存是拿来用的,不是拿来看的.不象windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读.这也就是windows为什么常常提示虚拟空间不足的原因.你们想想,多无聊,在内存还有大部分的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准哦.

vmstat

选项

-a:显示活动内页;

-f:显示启动后创建的进程总数;

-m:显示slab信息;

-n:头信息仅显示一次;

-s:以表格方式显示事件计数器和内存状态;

-d:报告磁盘状态;

-p:显示指定的硬盘分区状态;

-S:输出信息的单位。

参数

事件间隔:状态信息刷新的时间间隔;

次数:显示报告的次数。

实例

vmstat 3

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 320 42188 167332 1534368 0 0 4 7 1 0 0 0 99 0 0

0 0 320 42188 167332 1534392 0 0 0 0 1002 39 0 0 100 0 0

0 0 320 42188 167336 1534392 0 0 0 19 1002 44 0 0 100 0 0

0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0

0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0

字段说明:

Procs(进程)

r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)

b: 等待IO的进程数量。

Memory(内存)

swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。

free: 空闲物理内存大小。

buff: 用作缓冲的内存大小。

cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

Swap

si: 每秒从交换区写到内存的大小,由磁盘调入内存。

so: 每秒写入交换区的内存大小,由内存调入磁盘。

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO(现在的Linux版本块的大小为1kb)

bi: 每秒读取的块数

bo: 每秒写入的块数

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system(系统)

in: 每秒中断数,包括时钟中断。

cs: 每秒上下文切换数。

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU(以百分比表示)

us: 用户进程执行时间百分比(user time)

us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

sy: 内核系统进程执行时间百分比(system time)

sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

wa: IO等待时间百分比

wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

id: 空闲时间百分比

lsof

tcpdump — 网络数据包分析器

netstat — 网络统计

语法

netstat(选项)

选项

-a或–all:显示所有连线中的Socket;

-A<网络类型>或–<网络类型>:列出该网络类型连线中的相关地址;

-c或–continuous:持续列出网络状态;

-C或–cache:显示路由器配置的快取信息;

-e或–extend:显示网络其他相关信息;

-F或–fib:显示FIB;

-g或–groups:显示多重广播功能群组组员名单;

-h或–help:在线帮助;

-i或–interfaces:显示网络界面信息表单;

-l或–listening:显示监控中的服务器的Socket;

-M或–masquerade:显示伪装的网络连线;

-n或–numeric:直接使用ip地址,而不通过域名服务器;

-N或–netlink或–symbolic:显示网络硬件外围设备的符号连接名称;

-o或–timers:显示计时器;

-p或–programs:显示正在使用Socket的程序识别码和程序名称;

-r或–route:显示Routing Table;

-s或–statistice:显示网络工作信息统计表;

-t或–tcp:显示TCP传输协议的连线状况;

-u或–udp:显示UDP传输协议的连线状况;

-v或–verbose:显示指令执行过程;

-V或–version:显示版本信息;

-w或–raw:显示RAW传输协议的连线状况;

-x或–unix:此参数的效果和指定”-A unix”参数相同;

–ip或–inet:此参数的效果和指定”-A inet”参数相同。

实例

列出所有端口 (包括监听和未监听的)



netstat -a #列出所有端口

netstat -at #列出所有tcp端口

netstat -au #列出所有udp端口

列出所有处于监听状态的 Sockets



netstat -l #只显示监听端口

netstat -lt #只列出所有监听 tcp 端口

netstat -lu #只列出所有监听 udp 端口

netstat -lx #只列出所有监听 UNIX 端口

显示每个协议的统计信息



netstat -s 显示所有端口的统计信息

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

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

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



netstat -pt

netstat -p可以与其它开关一起使用,就可以添加“PID/进程名称”到netstat输出中,这样debugging的时候可以很方便的发现特定端口运行的程序。



在netstat输出中不显示主机,端口和用户名(host, port or user)



当你不想让主机,端口和用户名显示,使用netstat -n。将会使用数字代替那些名称。同样可以加速输出,因为不用进行比对查询。



netstat -an

如果只是不想让这三个名称中的一个被显示,使用以下命令:



netsat -a –numeric-ports

netsat -a –numeric-hosts

netsat -a –numeric-users

持续输出netstat信息



netstat -c #每隔一秒输出网络信息

显示系统不支持的地址族(Address Families)



netstat –verbose

在输出的末尾,会有如下的信息:



netstat: no support for AF IPX' on this system.<br> netstat: no support forAF AX25’ on this system.

netstat: no support for AF X25' on this system.<br> netstat: no support forAF NETROM’ on this system.

显示核心路由信息



netstat -r

使用netstat -rn显示数字格式,不查询主机名称。



找出程序运行的端口



并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。



netstat -ap | grep ssh

找出运行在指定端口的进程:



netstat -an | grep ‘:80’

显示网络接口列表



netstat -i

显示详细信息,像是ifconfig使用netstat -ie。



IP和TCP分析



查看连接某服务端口最多的的IP地址:



netstat -ntu | grep :80 | awk ‘{print $5}’ | cut -d: -f1 | awk ‘{++ip[$1]} END {for(i in ip) print ip[i],”\t”,i}’ | sort -nr

TCP各种状态列表:



netstat -nt | grep -e 127.0.0.1 -e 0.0.0.0 -e ::: -v | awk ‘/^tcp/ {++state[$NF]} END {for(i in state) print i,”\t”,state[i]}’

查看phpcgi进程数,如果接近预设值,说明不够用,需要增加:



netstat -anpo | grep “php-cgi” | wc -l


sh-4.2# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 1 55a14df955d5:54350 ti-in-f139.1e100.:https SYN_SENT
tcp 0 0 55a14df955d5:55322 123.125.114.32:http ESTABLISHED
tcp6 0 0 [::]:squid [::]:* LISTEN
tcp6 1 0 55a14df955d5:squid 172.17.0.1:41604 CLOSE_WAIT
tcp6 0 0 55a14df955d5:squid 172.17.0.1:41596 ESTABLISHED
tcp6 1 0 55a14df955d5:squid 172.17.0.1:41626 CLOSE_WAIT
udp 0 0 0.0.0.0:55157 0.0.0.0:*
udp6 0 0 [::]:43257 [::]:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 3 [ ] STREAM CONNECTED 29565
unix 3 [ ] STREAM CONNECTED 29564


sh-4.2# netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 1 172.17.0.3:46868 74.125.204.138:443 SYN_SENT
tcp 0 1 172.17.0.3:46864 74.125.204.138:443 SYN_SENT
tcp 0 1 172.17.0.3:52454 74.125.204.100:443 SYN_SENT
tcp6 1 0 172.17.0.3:3128 172.17.0.1:41660 CLOSE_WAIT
tcp6 0 0 172.17.0.3:3128 172.17.0.1:41596 ESTABLISHED
tcp6 1 0 172.17.0.3:3128 172.17.0.1:41626 CLOSE_WAIT
tcp6 1 0 172.17.0.3:3128 172.17.0.1:41642 CLOSE_WAIT
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 3 [ ] STREAM CONNECTED 29565
unix 3 [ ] STREAM CONNECTED 29564




sh-4.2# netstat -g
IPv6/IPv4 Group Memberships
Interface RefCnt Group
--------------- ------ ---------------------
lo 1 all-systems.mcast.net
eth0 1 all-systems.mcast.net
lo 1 ip6-allnodes
lo 1 ff01::1
ip6tnl0 1 ip6-allnodes
ip6tnl0 1 ff01::1
eth0 1 ip6-allnodes
eth0 1 ff01::1


sh-4.2# netstat -i
Kernel Interface table
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 78029 0 0 0 67480 0 0 0 BMRU
lo 65536 0 0 0 0 0 0 0 0 LRU



sh-4.2# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp6 0 0 [::]:squid [::]:* LISTEN
udp 0 0 0.0.0.0:55157 0.0.0.0:*
udp6 0 0 [::]:43257 [::]:*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path


sh-4.2# netstat -p
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 1 55a14df955d5:41400 ti-in-f101.1e100.:https SYN_SENT -
tcp6 0 0 55a14df955d5:squid 172.17.0.1:41596 ESTABLISHED -
tcp6 1 0 55a14df955d5:squid 172.17.0.1:41700 CLOSE_WAIT -
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 3 [ ] STREAM CONNECTED 29565 -
unix 3 [ ] STREAM CONNECTED 29564 -

sh-4.2# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

sh-4.2# netstat -s
Ip:
78155 total packets received
0 forwarded
0 incoming packets discarded
78155 incoming packets delivered
67684 requests sent out
Icmp:
0 ICMP messages received
0 input ICMP message failed.
ICMP input histogram:
3 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 3


### iostat — 输入/输出统计

ps

选项

-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。

a:显示现行终端机下的所有程序,包括其他用户的程序。

-A:显示所有程序。

-c:显示CLS和PRI栏位。

c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。

-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。

-d:显示所有程序,但不包括阶段作业领导者的程序。

-e:此选项的效果和指定”A”选项相同。

e:列出程序时,显示每个程序所使用的环境变量。

-f:显示UID,PPIP,C与STIME栏位。

f:用ASCII字符显示树状结构,表达程序间的相互关系。

-g<群组名称>:此选项的效果和指定”-G”选项相同,当亦能使用阶段作业领导者的名称来指定。

g:显示现行终端机下的所有程序,包括群组领导者的程序。

-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。

h:不显示标题列。

-H:显示树状结构,表示程序间的相互关系。

-j或j:采用工作控制的格式显示程序状况。

-l或l:采用详细的格式来显示程序状况。

L:列出栏位的相关信息。

-m或m:显示所有的执行绪。

n:以数字来表示USER和WCHAN栏位。

-N:显示所有的程序,除了执行ps指令终端机下的程序之外。

-p<程序识别码>:指定程序识别码,并列出该程序的状况。

p<程序识别码>:此选项的效果和指定”-p”选项相同,只在列表格式方面稍有差异。

r:只列出现行终端机正在执行中的程序。

-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。

s:采用程序信号的格式显示程序状况。

S:列出程序时,包括已中断的子程序资料。

-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。

t<终端机编号>:此选项的效果和指定”-t”选项相同,只在列表格式方面稍有差异。

-T:显示现行终端机下的所有程序。

-u<用户识别码>:此选项的效果和指定”-U”选项相同。

u:以用户为主的格式来显示程序状况。

-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。

U<用户名称>:列出属于该用户的程序的状况。

v:采用虚拟内存的格式显示程序状况。

-V或V:显示版本信息。

-w或w:采用宽阔的格式来显示程序状况。 

x:显示所有程序,不以终端机来区分。

X:采用旧式的Linux i386登陆格式显示程序状况。

-y:配合选项”-l”使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。

-<程序识别码>:此选项的效果和指定”p”选项相同。

–cols<每列字符数>:设置每列的最大字符数。

–columns<每列字符数>:此选项的效果和指定”–cols”选项相同。

–cumulative:此选项的效果和指定”S”选项相同。

–deselect:此选项的效果和指定”-N”选项相同。

–forest:此选项的效果和指定”f”选项相同。

–headers:重复显示标题列。

–help:在线帮助。

–info:显示排错信息。

–lines<显示列数>:设置显示画面的列数。

–no-headers:此选项的效果和指定”h”选项相同,只在列表格式方面稍有差异。

–group<群组名称>:此选项的效果和指定”-G”选项相同。

–Group<群组识别码>:此选项的效果和指定”-G”选项相同。

–pid<程序识别码>:此选项的效果和指定”-p”选项相同。

–rows<显示列数>:此选项的效果和指定”–lines”选项相同。

–sid<阶段作业>:此选项的效果和指定”-s”选项相同。

–tty<终端机编号>:此选项的效果和指定”-t”选项相同。

–user<用户名称>:此选项的效果和指定”-U”选项相同。

–User<用户识别码>:此选项的效果和指定”-U”选项相同。

–version:此选项的效果和指定”-V”选项相同。

–widty<每列字符数>:此选项的效果和指定”-cols”选项相同。

由于ps命令能够支持的系统类型相当的多,所以选项多的离谱!