linux和性能相关的命令及系统性能诊断

一.命令详解
二.识别cpu/io/内存/network瓶颈,及决方法啊

常用的和性能有关的命令
Iostat/vmstat/top/mpstat/time/strace/ipcs/ipcrm/ifconfig/tethereal/netstat/free/uptime


一.命令详解

1.Top命令详解:
参考:http://bbs.linuxtone.org/thread-1684-1-1.html

[root@localhost ~]# top

top - 12:08:54 up 1 day, 21:06, 2 users, load average: 0.16, 0.11, 0.06
Tasks: 123 total, 2 running, 121 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0% us, 0.0% sy, 0.0% ni, 99.9% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 8173076k total, 3188184k used, 4984892k free, 147472k buffers
Swap: 10223608k total, 0k used, 10223608k free, 2833104k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 16 0 4772 564 468 S 0.0 0.0 0:01.34 init
2 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/1
5 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/2
7 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/2
8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/3
9 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/3
10 root RT 0 0 0 0 S 0.0 0.0 0:00.01 migration/4
11 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/4
12 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/5
13 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/5
14 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/6
15 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/6
16 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/7
17 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/7



top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器; top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。

1.更改显示内容通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。

2.按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。


3.按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。


统计信息区前五行是系统整体的统计信息。第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:

12:08:54
当前时间
up 1 day, 21:06
系统运行时间,格式为时:分
2 user
当前登录用户数
load average: 0.16, 0.11, 0.06
系统负载,即任务队列的平均长度。
三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。


第二、三行为进程和CPU的信息。当有多个CPU时,通过按键“1“可以在总cpu和每个cpu信息之间切换,这些内容可能会超过两行。内容如下:

Tasks: 123 total
进程总数
2 running
正在运行的进程数
121 sleeping
睡眠的进程数
0 stopped
停止的进程数
0 zombie
僵尸进程数
Cpu(s): 0.0% us
用户空间占用CPU百分比
0.0% sy
内核空间占用CPU百分比
0.0% ni
用户进程空间内改变过优先级的进程占用CPU百分比
99.9% id
空闲CPU百分比
0.0% wa
等待输入输出的CPU时间百分比
0.0% hi

0.0% si


最后两行为内存信息。内容如下:

Mem: 8173076k total
物理内存总量
3188184k used
使用的物理内存总量
4984892k free
空闲内存总量
147472k buffers
用作内核缓存的内存量
Swap: 10223608k total
交换区总量
0k used
使用的交换区总量
10223608k free
空闲交换区总量
2833104k cached
缓冲的交换区总量。
内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
该数值即为这些内容已存在于内存中的交换区的大小。
相应的内存再次被换出时可不必再对交换区写入。


进程信息区统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
序号
列名
含义
a
PID
进程id
b
PPID
父进程id
c
RUSER
Real user name
d
UID
进程所有者的用户id
e
USER
进程所有者的用户名
f
GROUP
进程所有者的组名
g
TTY
启动进程的终端名。不是从终端启动的进程则显示为 ?
h
PR
优先级
i
NI
nice值。负值表示高优先级,正值表示低优先级
j
P
最后使用的CPU,仅在多CPU环境下有意义
k
%CPU
上次更新到现在的CPU时间占用百分比
l
TIME
进程使用的CPU时间总计,单位秒
m
TIME+
进程使用的CPU时间总计,单位1/100秒
n
%MEM
进程使用的物理内存百分比
o
VIRT
进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p
SWAP
进程使用的虚拟内存中,被换出的大小,单位kb。
q
RES
进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r
CODE
可执行代码占用的物理内存大小,单位kb
s
DATA
可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t
SHR
共享内存大小,单位kb
u
nFLT
页面错误次数
v
nDRT
最后一次写入到现在,被修改过的页面数。
w
S
进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
x
COMMAND
命令名/命令行
y
WCHAN
若该进程在睡眠,则显示睡眠中的系统函数名
z
Flags
任务标志,参考 sched.h
2. vmstat命令详解

[root@localhost ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 4886396 147552 2905036 0 0 1 4 4 3 0 0 100 0
0 0 0 4886396 147552 2905036 0 0 0 228 4144 4103 1 1 98 0
0 0 0 4886396 147552 2905036 0 0 0 88 1964 1286 0 0 99 0
0 0 0 4886396 147552 2905036 0 0 0 100 2321 2007 1 0 99 0
1 0 0 4886332 147552 2905036 0 0 0 156 2647 2265 1 0 99 0
[root@localhost ~]#



usage: vmstat [-V] [-n] [delay [count]]
-V prints version.
-n causes the headers not to be reprinted regularly.
-a print inactive/active page stats.
-d prints disk statistics
-D prints disk table
-p prints disk partition statistics
-s prints vm table
-m prints slabinfo
-S unit size
delay is the delay between updates in seconds.
unit size k:1000 K:1024 m:1000000 M:1048576 (default is K)
count is the number of updates.



vmstat是一个相当全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下问切换、CPU使用等性能信息


Procs
r: The number of processes waiting for run time.(运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于cpu个数))
b: The number of processes in uninterruptible sleep.(处于不可中断状态的进程数,这个值一般为2-3倍cpu的个数就表明cpu排队比较严要了,常见的情况是由IO引起的)


Memory
swpd: the amount of virtual memory used.(现在已经使用的虚拟内存,单位k)
free: the amount of idle memory.(空闲物理内存,单位k)
buff: the amount of memory used as buffers.(作为buffer使用的物理内存,对块设备读写进行缓冲,单位k)
cache: the amount of memory used as cache. (作为cache使用的物理内存,对文件系统的缓冲,单位k)
inact: the amount of inactive memory. (-a option) (没有活动的物理内存,单位k)
active: the amount of active memory. (-a option) (有活动的物理内存,单位k)

buffer和cache的区别:
buffers are only used for file metadata (inodes, etc) and data from raw block devices. It's accessed via block device and block number.
Cache has file data blocks, and memory mapped information (i.e. files mapped with mmap() calls). It's accessed primarily via inode number.
So, the main difference would be scope, One's more concerened with blocks on a device, the other with information in a file.
buffer and cache both can flush to disk, however. The buffer to the device file and the cache through the file system layer to the block device.

Swap
si: Amount of memory swapped in from disk (k/s). (每秒由磁盘调入内存的数量)
so: Amount of memory swapped to disk (k/s). (每秒由内存调入磁盘的数量)

IO
bi: Blocks received from a block device (blocks/s). (从块设备读入的数据块数量)
bo: Blocks sent to a block device (blocks/s). (写到块设备的数据块数量)
如果这两个值比较大,说明io的压力也较大,cpu在io的等待可能也会大

System
in: The number of interrupts per second, including the clock. (每秒产生中断的次数)
cs: The number of context switches per second.(每秒产生上下文切换的次数)
这个两个值比较大说明,说明消耗内核上cpu较多,可能不合理的使用cpu


CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time) (用户进程使用cpu的时间)
sy: Time spent running kernel code. (system time) (内核进程使用cpu的时间)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.(空闲事件使用cpu的时间,这个值越小,说明cpu可能很忙)
wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero. (等待io使用cpu的时间)


3.iostat命令详解

iostat用于监控cpu的统计信息和磁盘的统计信息

[oracle@localhost ~]$ iostat
Linux 2.6.9-78.ELsmp (localhost) 09/29/2010

avg-cpu: %user %nice %sys %iowait %idle
0.18 0.00 0.08 0.02 99.72

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 8.48 26.06 111.87 6429617 27601457
sda1 0.00 0.00 0.00 628 0
sda2 0.00 0.01 0.00 1654 33
sda3 8.48 26.05 111.87 6426351 27601424
dm-0 14.65 26.04 111.87 6425698 27601424
dm-1 0.00 0.00 0.00 360 0


cpu的统计信息,如果是多cpu系统,显示的所有cpu的平均统计信息。

%user:用户进程消耗cpu的比例
%nice:用户进程优先级调整消耗的cpu比例
%sys:系统内核消耗的cpu比例
%iowait:等待磁盘io所消耗的cpu比例
%idle:闲置cpu的比例(不包括等待磁盘io的s)

磁盘的统计信息:

Device:设备的名称
Tps:设备上每秒的io传输(可能多个io被组成一个io)的次数
Blk_read/s:每秒从设备读取block(kernel 2.4以上,block=512byte)的数量
Blk_wrtn/s:每秒写到设备block(kernel 2.4以上,block=512byte)的数量
Blk_read:间隔时间内,从设备读取总的block数量
Blk_wrtn:间隔时间内,写到设备总的block数量


默认iostat不带任何参数显示的是概要信息,如果要看更比较详细的信息,可以用“iostat –x“,例子如下:


[root@localhost ~]# iostat -x
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010

avg-cpu: %user %nice %sys %iowait %idle
0.14 0.00 0.07 0.01 99.78

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.04 5.08 0.46 6.74 19.21 94.55 9.60 47.27 15.80 0.01 0.93 0.18 0.13
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 26.17 0.00 3.08 2.83 0.00
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17.57 0.00 0.99 0.84 0.00
sda3 0.03 5.08 0.46 6.74 19.20 94.55 9.60 47.27 15.80 0.01 0.93 0.18 0.13
dm-0 0.00 0.00 0.49 11.82 19.19 94.55 9.60 47.27 9.24 0.36 29.58 0.11 0.13
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 6.22 0.62 0.00

字段说明:

rrqm/s:每秒进行merge(多个io的合并)读操作的数量
wrqm/s:每秒进行merge(多个io的合并)写操作的数量
r/s:每秒完成读io设备的次数
w/s:每秒完成写io设备的次数
rsec/s:每秒读扇区的次数
wsec/s:每秒写扇区的次数
rkB/s:每秒读多少k字节,在kernel2.4以上,rkB/s=2×rsec/s,因为一个扇区为512bytes
wkB/s:每秒写多少k字节,在kernel2.4以上,wkB/s =2×wsec/s,因为一个扇区为512bytes
avgrq-sz:平均每次io设备的大小(以扇区为单位),因为有merge读或写,所以每次io大小需要计算
avgqu-sz:平均I/O队列长度
await:每次io设备的等待时间,也包括io服务时间(毫秒)。
await的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。
如果 svctm 比较接近 await,说明I/O 几乎没有等待时间;
如果 await 远大于 svctm,说明 I/O队列太长,应用得到的响应时间变慢,
如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator算法,优化应用,或者升级 CPU。
队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水

svctm:每次io设备的服务时间(毫秒),它的大小一般和磁盘性能有关:CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加

%util:处理io操作的cpu比例,如果这个着接近100%,说明io请求非常多,cpu的所有时间都用来处理io请求,io系统负载很大(也有可能cpu资源不足),磁盘可能存在瓶颈;在%util等于70%的时候,io的读取就会有很多等待。


下面是别人写的这个参数输出的分析
# iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/cciss/c0d0
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p1
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p2
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: 总IO(io)/s = r/s(读) +w/s(写) = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。

平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上 78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是同时发出的,那么平均等待时间可以这样计算:
平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + ... + 请求总数-1) / 请求总数
应用到上面的例子: 平均等待时间 = 5ms * (1+2+...+28)/29 = 70ms,和 iostat 给出的78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。

每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。

一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里 I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。
delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s=78.21 * delta(io)/s = 78.21*28.57 =2232.8,表明每秒内的I/O请求总共需要等待2232.8ms。所以平均队列长度应为 2232.8ms/1000ms = 2.23,而iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有 bug,avgqu-sz值应为 2.23,而不是 22.35。



4.sar命令详解

sar的常用参数:
-A:所有报告的总和。
-u:CPU利用率
-v:进程、I节点、文件和锁表状态。
-d:硬盘使用报告。
-r:内存和交换空间的使用统计。
-g:串口I/O的情况。
-b:缓冲区使用情况。
-a:文件读写情况。
-c:系统调用情况。
-q:报告队列长度和系统平均负载
-R:进程的活动情况。
-y:终端设备活动情况。
-w:系统交换活动。
-x { pid | SELF | ALL }:报告指定进程ID的统计信息,SELF关键字是sar进程本身的统计,ALL关键字是所有系统进程的统计



查看cpu
[root@localhost ~]# sar -u 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010

06:08:27 PM CPU %user %nice %system %iowait %idle
06:08:28 PM all 0.00 0.00 0.00 0.00 100.00
06:08:29 PM all 0.00 0.00 0.12 0.00 99.88
06:08:30 PM all 0.00 0.00 0.00 0.00 100.00

06:08:30 PM CPU %user %nice %system %iowait %idle
06:08:31 PM all 0.00 0.00 0.00 0.00 100.00
06:08:32 PM all 0.00 0.00 0.00 0.00 100.00
Average: all 0.00 0.00 0.02 0.00 99.98

在显示内容包括:

  %user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
  %system:CPU处在系统模式下的时间百分比。
  %iowait:CPU等待输入输出完成时间的百分比。
%idle:CPU空闲时间百分比。
在所有的显示中,我们应主要注意%iowait和%idle,%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。


查看io
[root@localhost ~]# sar -b 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010

06:10:06 PM tps rtps wtps bread/s bwrtn/s
06:10:07 PM 0.00 0.00 0.00 0.00 0.00
06:10:08 PM 3.00 0.00 3.00 0.00 48.00
06:10:09 PM 2.00 0.00 2.00 0.00 112.00

06:10:09 PM tps rtps wtps bread/s bwrtn/s
06:10:10 PM 21.78 0.00 21.78 0.00 213.86
06:10:11 PM 3.00 0.00 3.00 0.00 48.00
Average: 5.99 0.00 5.99 0.00 84.63

查看物理内存和swap空间使用信息
[root@localhost ~]# sar -r 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010

06:12:21 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
06:12:22 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
06:12:23 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
06:12:24 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0

06:12:24 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
06:12:25 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
06:12:26 PM 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0
Average: 1272620 6900456 84.43 176328 6388732 10223608 0 0.00 0



查看网卡流量统计
root@localhost ~]# sar -n EDEV 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010

06:18:22 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:23 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:23 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:23 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:23 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

06:18:23 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:24 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:24 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:24 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:24 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

06:18:24 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:25 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:25 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:25 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:25 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

06:18:25 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:26 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:26 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:26 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:26 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

06:18:26 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
06:18:27 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:27 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:27 PM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:18:27 PM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00


查看运行进程队列长度
[root@localhost ~]# sar -q 1 5
Linux 2.6.9-78.ELsmp (localhost) 09/30/2010

08:00:04 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
08:00:05 PM 0 127 0.02 0.16 0.10
08:00:06 PM 0 127 0.02 0.16 0.10
08:00:07 PM 0 127 0.02 0.16 0.10

08:00:07 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
08:00:08 PM 0 127 0.02 0.16 0.10
08:00:09 PM 0 127 0.01 0.16 0.10
Average: 0 127 0.02 0.16 0.10

字段说明:
runq-sz: 准备运行的进程运行队列。
plist-sz: 进程队列里的进程和线程的数量
ldavg-1: 前一分钟的系统平均负载(load average)
ldavg-5 : 前五分钟的系统平均负载(load average)
ldavg-15 : 前15分钟的系统平均负载(load average)

一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的性能有严重问题。负载/cpu数量,表示每个cpu的活动进程数


5.ps命令详解
ps用户查看进程的相关信息,和top类似

查看系统当前运行的所有进程
ps –ef 或ps auxw
其中参数a表示显示系统中所有用户的的进程;u表示输出进程用户所属信息; x表示也显示没有控制台的进程;w表示加宽可以显示较多的资讯;若显示行太长而被截断则可以使用f参数


[root@localhost ~]# ps -auxw|more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4772 564 ? S Sep26 0:01 init [5]

root 2 0.0 0.0 0 0 ? S Sep26 0:00 [migration/0]
root 3 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S Sep26 0:00 [migration/1]
root 5 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/1]
root 6 0.0 0.0 0 0 ? S Sep26 0:00 [migration/2]
root 7 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/2]
root 8 0.0 0.0 0 0 ? S Sep26 0:00 [migration/3]
root 9 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/3]
root 10 0.0 0.0 0 0 ? S Sep26 0:00 [migration/4]
root 11 0.0 0.0 0 0 ? SN Sep26 0:00 [ksoftirqd/4]

字段说明:
USER: 行程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
D: 不可中断的静止 (通悸□□缜b进行 I/O 动作)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令



6.time命令详解
查看命令运行的时间

[root@localhost ~]# time ps -ef | wc -l
134

real 0m0.009s
user 0m0.004s
sys 0m0.006s

7.pstree命令详解
显示进程的树形结构

[root@localhost ~]# pstree |more
init─┬─acpid
├─atd
├─crond
├─cups-config-dae
├─cupsd
├─dbus-daemon-1
├─dhclient
├─events/0─┬─aio/0
│ ├─aio/1
│ ├─aio/2
│ ├─aio/3
│ ├─aio/4
│ ├─aio/5
│ ├─aio/6
│ ├─aio/7
│ ├─kacpid
│ ├─kblockd/0
│ ├─kblockd/1
│ ├─kblockd/2
│ ├─kblockd/3
│ ├─kblockd/4
│ ├─kblockd/5
│ ├─kblockd/6
│ ├─kblockd/7
--More—

8.进程的跟踪命令介绍

进程无法启动,软件运行速度突然变慢,程序的"SegmentFault"等等都是让每个Unix系统用户头痛的问题,可以用这些进程跟踪命令来诊断(在aix上有类似gdb命令)

truss和strace:用来跟踪一个进程的系统调用或信号产生的情况,
ltrace:用来跟踪进程调用库函数的情况。


这三个命令的用户基本相同,介绍下常用的参数

-f :除了跟踪当前进程外,还跟踪其子进程。
-o file :将输出信息写到文件file中,而不是显示到标准错误输出(stderr)。
-p pid :绑定到一个由pid对应的正在运行的进程。此参数常用来调试后台进程。
-e execve :只记录 execve 这类系统调用


9.网络相关命令

ifconfig # 查看所有网络接口的属性
netstat -lntp # 查看所有监听端口
netstat -antp # 查看所有已经建立的连接
netstat -s # 查看网络统计信息进程
tethereal

iptraf:可以监控网络流量

安装方式:
1.官网及下载 http://iptraf.seul.org/download.html
2. get ftp://iptraf.seul.org/pub/iptraf/iptraf-3.0.0.tar.gz
3. yum install -y iptraf






带说明:

10.Ipcs和Ipcrm命令详解

Ipcs和ipcrm是管理System V IPC对象的(消息、信号量(semaphores)和共享内存),在日常工作中,有时会遇到共享内存无法释放。这个时候就可以通过ipcs查询,ipcrm删除
样例:
ipcs [-m|-q|-s]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出有关“遮断器”(semaphore)的信息
#ipcs -m

删除ipc
ipcrm -m|-q|-s shm_id
#ipcrm -m 105

参考:http://www.52rd.com/Blog/Detail_RD.Blog_wqyuwss_6519.html


性能分析分类汇总:
进程性能分析相关的命令:
top,ps,pstree

Cpu性能分析相关命令:
vmstat,sar,time,top

Memory性能分析相关命令:
vmstat,top,ipcs,ipcrm,cat /proc/meminfo,cat /proc/slabinfo,cat /proc/<pid #>/maps

io性能分析相关命令:
vmstat,iostat,

网络性能分析相关命令:
Ifconfig,netstat,tethereal,sar –n EDEV








二.识别cpu/io/内存/network瓶颈,及决方法啊

1.识别cpu性能瓶颈

衡量Cpu性能指标:

1. 用户使用CPU的情况;
CPU运行常规用户进程
CPU运行niced process
CPU运行实时进程
2. 系统使用CPU情况;
用于I/O管理:中断和驱动
用于内存管理:页面交换
用户进程管理:进程开始和上下文切换
3.WIO:用于进程等待磁盘I/O而使CPU处于空闲状态的比率。
4.CPU的空闲率,除了上面的WIO以外的空闲时间
5.CPU用于上下文交换的比率
6.nice
7.real-time
8.运行进程队列的长度
9.平均负载

用于查看cpu性能的命令有:vmstat,iostat,sar,top,strace
既然已经知道cpu性能指标了,那就用命令查看确认

步骤一:先用vmstat查看系统的cpu整体运行状况

[root@localhost ~]# vmstat -n 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 1282844 176332 6389000 0 0 1 6 10 8 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 0 1028 120 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 8 1011 41 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 28 1033 146 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 40 1009 31 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 0 1048 156 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 24 1010 35 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 0 1026 119 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 0 1017 63 0 0 100 0
0 0 0 1282844 176332 6389000 0 0 0 24 1032 141 0 0 100 0

红色的字表是和cpu性能有关的
r: 如果在procs中运行的序列(process r)是连续的大于在系统中的CPU的个数,表示cpu比较忙,系统现在运行比较慢,有多数的进程等待CPU.。如果r的输出数大于系统中可用CPU个数的4倍的话, 则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢.
b : 如果在procs中运行的序列(process b), 即处于不可中断状态的进程数,连续我为cpu的2-3倍就表明cpu排队比较严要了

SYSTEM
in:每秒产生的中断次数
cs:每秒产生的上下文切换次数
上面2个值越大,会看到由内核消耗的CPU时间会越大

CPU
us:用户进程消耗的CPU时间百分,
us的值比较高时,说明用户进程消耗的CPU时间多,在服务高峰期持续大于50-60,是可以接受,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速

sy: 内核进程消耗的CPU时间百分比
sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因
wa: IO等待消耗的CPU时间百分比
wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id:CPU处于空闲状态时间百分比,如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us) 系统则面临着CPU资源的短缺. 在服务高峰期持续小于50,可以接受

通过这个命令可以观察cpu性能的结果是:
A.如果r连续大于cpu的个数,甚至几倍cpu个数;b也有持续有值,甚至cpu的2-3倍,并且id也持续小于50%,wa也比较小,这就表明cpu符合很严重。
B 再详细确认可以用:sar -u 1 5,sar -q 1 5可以观察cpu的使用率和cpu运行进程队列长度及负载。
C. 如果想再看看具体是什么进程在消耗cpu,就要使用命令:top,ps –auxw | more
D. 如果知道了某个进程消耗大量的cpu,想主要知道这个进程在做成什么,那就用命令:strace


2.识别memory性能瓶颈

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache有效缩短了I/O系统调用(比如read,write,getdents)的时间.
内存活动基本上可以用3个数字来量化:活动虚拟内存总量,交换(swapping)率和调页(paging)率.其中第一个数字表明内存的总需求量,后两个数字表示那些内存中有多少比例正处在使用之中.目标是减少内存活动或增加内存量,直到调页率保持在一个可以接受的水平上为止.
活动虚拟内存的总量(VM)=实际内存大小(size of real memory)(物理内存)+使用的交换空间大小(amount of swap space used)

当程序运行需要的内存大于物理内存时,UNIX系统采用了调页机制,即系统copy一些内存中的页面到磁盘上,腾出来空间供进程使用。

大多数系统可以忍受偶尔的调页,但是频繁的调页会使系统性能急剧下降。

UNIX内存管理:UNIX系统通过2种方法进行内存管理,“调页算法”,“交换技术”。

调页算法:是将内存中最近不常使用的页面换到磁盘上,把常使用的页面(活动页面)保留
在内存中供进程使用。
交换技术:是系统将整个进程,而不是部分页面,全部换到磁盘上。正常情况下,系统会发
生一些交换过程。

当内存严重不足时,系统会频繁使用调页和交换,这增加了磁盘I/O的负载。进一步降低了系统对作业的执行速度,即系统I/O资源问题又会影响到内存资源的分配。

Unix的虚拟内存
Unix的虚拟内存是一个十分复杂的子系统,它实现了进程间代码与数据共享机制的透明性,并能够分配比系统现有物理内存更多的内存,某些操作系统的虚存甚至能通过提供缓存功能影响到文件系统的性能,各种风格的UNIX的虚存的实现方式区别很大,但都离不开下面的4个概念。

1:实际内存
实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序,现在的RAM的形式有多种:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用纠错机制(ECC)。

2:交换空间
交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时使用,通常推荐交换空间的大小应该是物理内存的二到四倍。

3:页面调度
页面调度是指从磁盘向内存传输数据,以及相反的过程,这个过程之所以被称为页面调度,是因为Unix内存被平均划分成大小相等的页面;通常页面大小为4KB和8KB(在Solaris中可以用pagesize命令查看)。当可执行程序开始运行时,它的映象会一页一页地从磁盘中换入,与此类似,当某些内存在一段时间内空闲,就可以把它们换出到交换空间中,这样就可以把空闲的RAM交给其他需要它的程序使用。

4:交换
页面调度通常容易和交换的概念混淆,页面调度是指把一个进程所占内存的空闲部分传输到磁盘上,而交换是指当系统中实际的内存已不够满足新的分配需求时,把整个进程传输到磁盘上,交换活动通常意味着内存不足。

[root@ticketA ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 81616 105616 122168 31284140 1 1 16 24 0 0 2 0 98 0
3 0 81616 105616 122168 31284140 0 0 0 12 5594 4285 3 1 96 0
2 0 81616 105616 122172 31284136 0 0 0 16 5574 4176 3 1 96 0
1 0 81616 105552 122172 31284136 0 0 0 108 5545 4329 3 1 96 0
3 0 81616 105360 122172 31284136 0 0 0 36 5533 4195 3 1 96 0
0 0 81616 105360 122180 31284128 0 0 0 60 5538 4341 3 1 96 0
0 0 81616 105360 122180 31284128 0 0 0 48 5473 4179 3 1 96 0
1 0 81616 105360 122180 31284128 0 0 0 8 5553 4299 3 1 96 0
0 0 81616 105360 122180 31284128 0 0 0 20 5608 4231 3 1 96 0
0 0 81616 105360 122180 31284128 0 0 0 60 5585 4285 3 0 96 0


MEMORY
-swap:切换到交换内存上的内存(默认以KB为单位)
如果SWAP的值不为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资源都会被消耗。
我发现有些朋友看到空闲内存(FREE)很少的或接近于0时,就认为内存不够用了,实际上不能光看这一点,Linux是抢占内存式的OS,还要结合si,so,如果free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。


3.识别io性能瓶颈

首先用命令vmstat大概了解系统状况

[root@localhost ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 1225516 176836 6452620 0 0 0 4 3 3 0 0 100 0
0 0 0 1225524 176836 6452620 0 0 0 32 1021 66 0 0 100 0
0 0 0 1225524 176836 6452620 0 0 0 0 1028 122 0 0 100 0
0 0 0 1225524 176836 6452620 0 0 0 40 1009 36 0 0 100 0
0 0 0 1225524 176836 6452620 0 0 0 0 1028 124 0 0 100 0

如果b的值为2-3倍cpu数量,bi和bo的值很大(有时bi和bo值很小,但in和cs很大,也会引起磁盘io负载重),wa的值持续很高,如高于40,id也持续高于70,这些现象都表明系统的io可能出现性能问题。可以进一步通过iostat命令分析。

root@localhost ~]# iostat -x 1 5
Linux 2.6.9-78.ELsmp (localhost) 10/08/2010

avg-cpu: %user %nice %sys %iowait %idle
0.07 0.00 0.03 0.01 99.89

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.01 3.26 0.16 4.36 6.42 60.99 3.21 30.49 14.91 0.00 0.56 0.16 0.07
sda1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 26.17 0.00 3.08 2.83 0.00
sda2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 17.57 0.00 0.99 0.84 0.00
sda3 0.01 3.26 0.16 4.36 6.42 60.99 3.21 30.49 14.91 0.00 0.56 0.16 0.07
dm-0 0.00 0.00 0.17 7.62 6.42 60.99 3.21 30.49 8.65 0.12 15.45 0.09 0.07
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 8.00 0.00 6.22 0.62 0.00

查看iostat的结果,首先看%util(服务io的时间占总时间的百分比),如果这个值接近100%,表示io的请求很多(表示任务服务的所有时间几乎都用在io上),这种现象表明磁盘io性能出现瓶颈。
再看await(表示每次io设备等待时间)和svctm(表示每次io设备服务时间,一般性能越好的磁盘,这个值越小)。
如果svctm接近await,说明io几乎没有等待,每个io设备都得到及时的响应
如果svctm远小于await,说明io等待队列可能很长,io的得到服务的时间将延长(排队+服务时间)。

avgqu-sz表示io排队的现象,如果排队过长会影响io的响应时间

r/s+w/s:可以计算当前系统的iops(可以结合硬盘的测试或者硬件参数来衡量是否超过磁盘的iops最大值)


4.网络性能识别与分析

可以通过命令netstat,iptraf命令来识别

可以通过ifconfig,netstat连接网络基本情况

ifconfig # 查看所有网络接口的属性
netstat -lntp # 查看所有监听端口
netstat -antp # 查看所有已经建立的连接
netstat -s # 查看网络统计信息进程

用iptraf连接网络的速率,如果网络的带宽达到极限,那一般系统的支持的进程数或者最大连接数也会成为瓶颈


知道哪有问题了,接下来就是调整了,调整的方法如下:

Cpu的调整:
一般在cpu的wa小于5%就需要调整cpu,调整的相关参数在目录下:/proc/sys/kernel/;一边调整参数threads-max,pid_max,如下:
[root@localhost ~]# sysctl kernel.pid_max
kernel.pid_max = 32768
[root@localhost ~]# sysctl kernel.pid_max=32769
kernel.pid_max = 32769

memory调整:
当出现严重的换页现象,应该注意内存不足的影响
1. 关闭不必要的非核心进程

2. 调整/proc/sys/vm/下的系统参数

保证linux有足够的物理内存,可以调整vm的如下参数

vm.min_free_kbytes=409600;//默认值是3797,保证物理内存有足够空闲空间,防止突发性换页
vm.vfs_cache_pressure=200;//默认是100,增大这个参数设置了虚拟内存回收directory和i-node缓冲的倾向,这个值越大。越易回收
vm.swappiness=40 //缺省60,减少这个参数会使系统尽快通过swapout不使用的进程资源来释放更多的物理内存
3. 配置较大的swap,一般为物理内存2倍


Io的调整:
1.负载平衡,磁盘io均分
2.启用异步io
查看是否启用异步io
[root@localhost ~]# cat /proc/slabinfo |grep kio
kioctx 0 0 384 10 1 : tunables 54 27 8 : slabdata 0 0 0
kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0

3.块设备调大预读扇区readahead
[root@localhost ~]# blockdev --report
RO RA SSZ BSZ StartSec Size Device
rw 256 512 4096 0 570949632 /dev/sda
rw 256 512 1024 63 80262 /dev/sda1
rw 256 512 1024 80325 208845 /dev/sda2
rw 256 512 512 289170 570644865 /dev/sda3
rw 256 512 4096 289170 550109184 /dev/dm-0
rw 256 512 4096 289170 20447232 /dev/dm-1
[root@localhost ~]# blockdev --setra 2048 /dev/sda1
[root@localhost ~]# blockdev --report
RO RA SSZ BSZ StartSec Size Device
rw 2048 512 4096 0 570949632 /dev/sda
rw 2048 512 1024 63 80262 /dev/sda1
rw 2048 512 1024 80325 208845 /dev/sda2
rw 2048 512 512 289170 570644865 /dev/sda3
rw 256 512 4096 289170 550109184 /dev/dm-0
rw 256 512 4096 289170 20447232 /dev/dm-1

4.调整vm相关参数

改善io系统的性能的vm参数
overcommit_memory = 0
vm.overcommit_ratio = 10 //默认值是50,用于虚拟内存的物理内存的百分比
vm.dirty_ratio = 20 //默认值是40,为了保持稳定,持续的写入,把这个值调整的小一些,经验值是20
vm.dirty_background_ratio //缺省数值是500,也就是5秒,如果系统要求稳定持续的写,可以适当降低该值,把峰值的写操作平均多次,也避免宕机丢失更多的数据
vm.dirty_expire_centisecs //缺省是3000,也就是30秒,如果系统写操作压力很大,可以适当减小该值,但也不要太小;建议设置为 1500

posted @ 2013-04-09 10:57  cybean  阅读(385)  评论(0编辑  收藏  举报