常用性能分析工具
free
Mem: 1572988 1509260 63728 0 62800 277888
-/+ buffers/cache: 1168572 404416
Swap: 2096472 16628 2079844
Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。
第1行 Mem: total:表示物理内存总量。
used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free:未被分配的内存。
shared:共享内存,一般系统不会用到,这里也不讨论(swap是个什么东东??)。
buffers:系统分配但未被使用的buffers 数量。
cached:系统分配但未被使用的cache 数量(buffers与cached啥区别?), total = used + free 第2行 -/+ buffers/cached: used:也就是第一行中的used - buffers-cached 也是实际使用的内存总量。
free:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。 free 2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行
补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。
参 数:
-b 以Byte为单位显示内存使用情况。
-k 以KB为单位显示内存使用情况。
-m 以MB为单位显示内存使用情况。
-o 不显示缓冲区调节列。
-s<间隔秒数> 持续观察内存使用状况。
-t 显示内存总和列。
-V 显示版本信息。
top
top - 16:24:30 up 36 days, 19:25, 2 users, load average: 0.16, 0.19, 0.12
Tasks: 398 total, 2 running, 396 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.4% us, 2.6% sy, 0.0% ni, 95.9% id, 0.1% wa, 0.0% hi, 0.1% si
Mem: 15360000k total, 15276776k used, 83224k free, 90048k buffers
swap是个什么东东?: 1048568k total, 5928k used, 1042640k free, 7019480k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1332 root 16 0 314m 4436 3044 S 2.3 0.0 471:24.96 noah-agent64
1 root 16 0 4752 480 448 S 0.0 0.0 0:00.29 init
2 root RT 0 0 0 0 S 0.0 0.0 0:15.68 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.77 ksoftirqd/0
4 root 5 -10 0 0 0 S 0.0 0.0 0:00.14 events/0
5 root 5 -10 0 0 0 S 0.0 0.0 0:13.36 khelper
6 root 5 -10 0 0 0 S 0.0 0.0 0:00.31 kthread
7 root 8 -10 0 0 0 S 0.0 0.0 0:00.00 xenwatch
8 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 xenbus
16 root RT -10 0 0 0 S 0.0 0.0 0:14.68 migration/1
17 root 34 19 0 0 0 S 0.0 0.0 0:00.69 ksoftirqd/1
18 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/1
20 root RT -10 0 0 0 S 0.0 0.0 0:07.20 migration/2
21 root 34 19 0 0 0 S 0.0 0.0 0:00.31 ksoftirqd/2
22 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/2
24 root RT -10 0 0 0 S 0.0 0.0 0:04.17 migration/3
25 root 34 19 0 0 0 S 0.0 0.0 0:00.29 ksoftirqd/3
26 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/3
28 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/0
29 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/1
30 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/2
31 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/3
统计信息内容解释:
第一行是任务队列信息,同 uptime 命令的执行结果。
第二行为进程信息。
total 进程总数
running 正在运行的进程数
sleeping 睡眠的进程数
stopped 停止的进程数
zombie 僵尸进程数
第三行为CPU信息。
us 用户空间占用CPU百分比
sy 内核空间占用CPU百分比
ni 用户进程空间内改变过优先级的进程占用CPU百分比
id 空闲CPU百分比
wa 等待输入输出的CPU时间百分比
hi 硬件中断
si 软件中断
最后两行为内存信息。
Mem:total 物理内存总量
used 使用的物理内存总量
free 空闲内存总量
buffers 用作内核缓存的内存量
swap是个什么东东?:total 交换区总量
used 使用的交换区总量
free 空闲交换区总量
cached 缓冲的交换区总量
进程信息区
默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。
PID 进程id
USER 进程所有者的用户名
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR 共享内存大小,单位kb
S 进程状态:
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
%CPU 上次更新到现在的CPU时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的CPU时间总计,单位1/100秒
COMMAND 命令名/命令行
vmstat
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写, 是实时系统监控工具。该命令通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数据,输出信息直接打印在屏幕。vmstat反馈的与CPU相关的信息包括:
1.多少任务在运行
2.CPU使用的情况
3.CPU收到多少中断
4.发生多少上下文切换
vmstat的语法如下: vmstat [delay [count]]
参数 解释
delay 相邻的两次采样的间隔时间
count 采样的次数,count只能和delay一起使用
当没有参数时,vmstat则显示系统启动以后所有信息的平均值。有delay时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个delay时间段的平均信息。当系统有多个CPU时,输出为所有CPU的平均值。
参数 解释
任务的信息(procs)
Procs
r:
运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于1)
b:
处于不可中断状态的进程数,常见的情况是由IO引起的
Memory
swpd:切换到交换内存上的内存(默认以KB为单位)
如果 swpd 的值不为0,或者还比较大,比如超过100M了,但是 si, so 的值长期为 0,这种情况我们可以不用担心,不会影响系统性能。
free: 空闲的物理内存
buff: 作为buffer cache的内存,对块设备的读写进行缓冲
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值大的时候,说明cache住的文件数多,如果频繁访问到的文件都能被cache住,那么磁盘的读IO bi 会非常小
Swap
si: 交换内存使用,由磁盘调入内存
so: 交换内存使用,由内存调入磁盘
内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响。磁盘IO和CPU资源都会被消耗。
我们的测试中,很多情况下,swap都是不打开的。
Io
bi: 从块设备读入的数据总量(读磁盘) (KB/s)
bo: 写入到块设备的数据总理(写磁盘) (KB/s)
随机磁盘读写的时候,这2个 值越大(如超出1M),能看到CPU在IO等待的值也会越大
System
in: 每秒产生的中断次数
cs: 每秒产生的上下文切换次数
上面这2个值越大,会看到由内核消耗的CPU时间会越多
Cpu
us: 用户进程消耗的CPU时间百分比
us 的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超过50% 的使用,那么我们就该考虑优化程序算法或者进行加速了(比如 PHP/Perl)
sy: 内核进程消耗的CPU时间百分比
sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性的表现,我们应该检查原因。
wa: IO等待消耗的CPU时间百分比
wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。
id: CPU处在空闲状态时间百分比
关注点:
Procs r: 运行的进程比较多,系统很繁忙
Io bo: 磁盘写的数据量稍大,如果是大文件的写,10M以内基本不用担心,如果是小文件写2M以内基本正常
Cpu us: 持续大于50,服务高峰期可以接受
Cpu wa: 稍微有些高
Cpu id:持续小于50,服务高峰期可以接受
范例1:average mode (粗略信息)
当vmstat不带参数时,对应的输出值是从系统启动以来的平均值,而r和b则对应的是完成这一命令时,系统的值。从下面例子,可以看出系统基本出去闲置状态(idle)。自启动以来,CPU在用户态消耗时间为5%,在核心态消耗为本1%,剩下的为闲置时间。需要指出的是:这里的用户态时间包括nice值为负的进程的时间。
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 5928 82880 90000 7020048 0 0 9 65 1 3 1 3 96 0
范例2:average mode (详细信息)
命令格式: vmstat –s
这里只讨论与CPU相关信息。“CPU ticks”表示自系统启动CPU运行时间,这里以tick为时间单位。用tick来表示us,sy id 和wa的时间;forks指自从系统启动以来,所创建的新任务的个数。这些信息从/proc/stat 的第一行和”processes”行获得。
15360000 total memory
15294800 used memory
9521016 active memory
4677844 inactive memory
65200 free memory
90004 buffer memory
7022644 swap cache
1048568 total swap
5928 used swap
1042640 free swap
14118647 non-nice user cpu ticks
0 nice user cpu ticks
35108581 system cpu ticks
1220978223 idle cpu ticks
1013122 IO-wait cpu ticks
43266 IRQ cpu ticks
258623 softirq cpu ticks
108845654 pages paged in
830650744 pages paged out
82586 pages swapped in
324491 pages swapped out
4139134525 interrupts
3349850760 CPU context switches
1294232348 boot time
47035870 forks
结果解释
non-nice user cpu ticks 自系统启动以来,CPU在用户态下运行非nice进程的时间,单位为jiffies user
nice user cpu ticks 自系统启动以来,CPU在用户态下运行nice进程的时间,单位为jiffies nice
system cpu ticks 自系统启动以来,CPU处于系统状态的时间,单位为jiffies sys
idle cpu ticks 自系统启动以来,CPU处于闲置状态的时间,单位为jiffies idle
IO-wait cpu ticks 自系统启动以来,CPU处理IO中断的时间,单位为jiffies iowait
IRQ cpu ticks 自系统启动以来,CPU处理硬中断的时间,单位为jiffies irq
softing cpu ticks 自系统启动以来,CPU处理软中断的时间,单位为jiffies Softirq
interrupts 自系统启动以来,发生的所有的中断的次数目 Intr
CPU context switches 自系统启动以来,发生的上下文交换的次数 Ctxt
boot time 自系统启动以来到现在运行的时间,单位为秒。 btime
forks 自系统启动以来所创建的任务的个数目。 Process
范例3:定期采样(delay [count])
定期采样数据是指每隔delay时间,采样一次。当count 为0时,vmstat 将不停地定期报告信息;否则当报告count次后,vmstat 命令停止运行。
第一行的信息如同范例1,是自系统启动以来的平均信息。从第二行开始,每行的意思是:r和b采样那一时刻系统运行队列和等待队列的情况;而usystem参数(in,cs)以及CPU参数(us,sy,id,wa)对应的输出值是系统在前一个delay的情况。
从下面例子可以看出上下文交换的次数小于中断的发生次数。当系统大部分时间是空闲并且中断大部分是时间中断时,这种现象极可能发生。当时间中断发生时, 因为调度器没有什么任务可调度,所以很少发生上下文切换。
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 5928 88984 90012 7015356 0 0 9 65 1 0 1 3 96 0
0 0 5928 88664 90012 7015356 0 0 0 0 3626 34251 1 2 97 0
27 0 5928 89048 90012 7015356 0 0 0 0 2657 34285 1 1 97 0
0 0 5928 88664 90012 7015356 0 0 0 0 3719 34431 2 3 95 0
31 0 5928 88984 90012 7015356 0 0 0 0 4648 34920 1 2 96 0
uptime
uptime是Linux系统常用的命令,用来报告系统已经运行多长时间,依此显示的信息:现在时间,系统已经运行了的时间,目前有多少登陆用户, 1分钟系统平均负载,5分钟系统平均负载,15分钟系统平均负载。该命令从/proc/loadavg 中获得load average的信息。
范例1:系统只用一个CPU
15:38:37 up 93 days, 23:55, 35 users, load average: 0.22, 0.13, 0.10
如果是单CPU的系统来说,平均负载可能会高些。通常来说:如果系统有n个CPU而且平均负载小于n,则说明某些CPU还有空闲的时间片。通过该命令,你能知道CPU是否繁忙,但是无法知道为什么忙。
nestat
使用netstat命令可以监控TCP/IP网络配置和工作状况。它可以显示内核路由表、 活动的网络状态以及每个网络接口的有用的统计数字。欲得详情请阅man page。
-a 显示所有Internet连接的有关信息,包括那些正在监听的信息
-i 显示所有网络设备的统计数字
-c 不断显示网络的更新状态。这个参数使用netstat每秒一次的输出网络状态列表,直到该程序被中断
-n 以数字/原始形式显示远程地址、本地地址和端口信息,而不是解析主机名和服务器
-o 显示计数器的终止时间和每个网络连接的回退(back off)情况
-r 显示内核路由表
-t 只显示TCP socket信息,包括正在监听的信息
-u 只显示UDP socket信息
-v
显示netstat版本信息
-w 显示原始(raw)socket信息
-x 显示UNIX域socket信息
ifconfig
命令位置:
1 ifconfig 查看网络接口状态;
ifconfig 如果不接任何参数,就会输出当前网络接口的情况;
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:C0:9F:94:78:0E
inet addr:192.168.1.88 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::2c0:9fff:fe94:780e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:850 errors:0 dropped:0 overruns:0 frame:0
TX packets:628 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:369135 (360.4 KiB) TX bytes:75945 (74.1 KiB)
Interrupt:10 Base address:0x3000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:57 errors:0 dropped:0 overruns:0 frame:0
TX packets:57 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8121 (7.9 KiB) TX bytes:8121 (7.9 KiB)
解说:
eth0 表示第一块网卡, 其中 HWaddr 表示网卡的物理地址,可以看到目前这个网卡的物理地址(MAC地址)是 00:C0:9F:94:78:0E ; inet addr 用来表示网卡的IP地址,此网卡的 IP地址是 192.168.1.88,广播地址, Bcast:192.168.1.255,掩码地址Mask:255.255.255.0
lo 是表示主机的回坏地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把 HTTPD服务器的指定到回坏地址,在浏览器输入 127.0.0.1 就能看到你所架WEB网站了。但只是您能看得到,局域网的其它主机或用户无从知道;
如果想知道主机所有网络接口的情况,请用下面的命令;
[root@localhost ~]# ifconfig -a
如果想查看某个端口,比如查看eth0 的状态,就可以用下面的方法;
[root@localhost ~]# ifconfig eth0
2 ifconfig 配置网络接口;
ifconfig 可以用来配置网络接口的IP地址、掩码、网关、物理地址等;值得一说的是用ifconfig 为网卡指定IP地址,这只是用来调试网络用的,并不会更改系统关于网卡的配置文件。如果您想把网络接口的IP地址固定下来,目前有三个方法:一是通过各个 发行和版本专用的工具来修改IP地址;二是直接修改网络接口的配置文件;三是修改特定的文件,加入ifconfig 指令来指定网卡的IP地址,比如在redhat或Fedora中,把ifconfig 的语名写入/etc/rc.d/rc.local文件中;
ifconfig 配置网络端口的方法:
ifconfig 工具配置网络接口的方法是通过指令的参数来达到目的的,我们只说最常用的参数;
ifconfig 网络端口 IP地址 hw <HW> MAC地址 netmask 掩码地址 broadcast 广播地址 [up/down]
* 实例一:
比如我们用ifconfig 来调试 eth0网卡的地址
[root@localhost ~]# ifconfig eth0 down
[root@localhost ~]# ifconfig eth0 192.168.1.99 broadcast 192.168.1.255 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0 up
[root@localhost ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:11:00:00:11:11
inet addr:192.168.1.99 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Interrupt:11 Base address:0x3400
注解: 上面的例子我们解说一下;
第一行:ifconfig eth0 down 表示如果eth0是激活的,就把它DOWN掉。此命令等同于 ifdown eth0;
第二行:用ifconfig 来配置 eth0的IP地址、广播地址和网络掩码;
第三行:用ifconfig eth0 up 来激活eth0 ; 此命令等同于 ifup eth0
第四行:用 ifconfig eth0 来查看 eth0的状态;
当然您也可以用直接在指令IP地址、网络掩码、广播地址的同时,激活网卡;要加up参数;比如下面的例子;
[root@localhost ~]# ifconfig eth0 192.168.1.99 broadcast 192.168.1.255 netmask 255.255.255.0 up
* 实例二:在这个例子中,我们要学会设置网络IP地址的同时,学会设置网卡的物理地址(MAC地址);
比如我们设置网卡eth1的IP地址、网络掩码、广播地址,物理地址并且激活它;
[root@localhost ~]# ifconfig eth1 192.168.1.252 hw ether 00:11:00:00:11:11 netmask 255.255.255.0 broadcast 192.168.1.255 up
或
[root@localhost ~]# ifconfig eth1 hw ether 00:11:00:00:11:22
[root@localhost ~]# ifconfig eth1 192.168.1.252 netmask 255.255.255.0 broadcast 192.168.1.255 up
其中 hw 后面所接的是网络接口类型, ether表示乙太网, 同时也支持 ax25 、ARCnet、netrom等,详情请查看 man ifconfig ;
3.3 如何用ifconfig 来配置虚拟网络接口;
有时我们为了满足不同的需要还需要配置虚拟网络接口,比如我们用不同的IP地址来架运行多个HTTPD服务器,就要用到虚拟地址;这样就省却了同一个IP地址,如果开设两个的HTTPD服务器时,要指定端口号。
虚拟网络接口指的是为一个网络接口指定多个IP地址,虚拟接口是这样的 eth0:0 、 eth0:1、eth0:2 ... .. eth1N。当然您为eth1 指定多个IP地址,也就是 eth1:0、eth1:1、eth1:2 ... ...以此类推;
其实用ifconfig 为一个网卡配置多个IP地址,就用前面我们所说的ifconfig的用法,这个比较简单;看下面的例子;
[root@localhost ~]# ifconfig eth1:0 192.168.1.251 hw ether 00:11:00:00:11:33 netmask 255.255.255.0 broadcast 192.168.1.255 up
或
[root@localhost ~]# ifconfig eth1 hw ether 00:11:00:00:11:33
[root@localhost ~]# ifconfig eth1 192.168.1.251 netmask 255.255.255.0 broadcast 192.168.1.255 up
注意:指定时,要为每个虚拟网卡指定不同的物理地址;
在 Redhat/Fedora 或与Redhat/Fedora类似的系统,您可以把配置网络IP地址、广播地址、掩码地址、物理地址以及激活网络接口同时放在一个句子中,写入/etc/rc.d/rc.local中。比如下面的例子;
ifconfig eth1:0 192.168.1.250 hw ether 00:11:00:00:11:44 netmask 255.255.255.0 broadcast 192.168.1.255 up
ifconfig eth1:1 192.168.1.249 hw ether 00:11:00:00:11:55 netmask 255.255.255.0 broadcast 192.168.1.255 up
解说:上面是为eth1的网络接口,设置了两个虚拟接口;每个接口都有自己的物理地址、IP地址... ...
3.4 如何用ifconfig 来激活和终止网络接口的连接;
激活和终止网络接口的用 ifconfig 命令,后面接网络接口,然后加上 down或up参数,就可以禁止或激活相应的网络接口了。当然也可以用专用工具ifup和ifdown 工具;
[root@localhost ~]# ifconfig eth0 down
[root@localhost ~]# ifconfig eth0 up
[root@localhost ~]# ifup eth0
[root@localhost ~]# ifdown eth0