您的位置:首页 > 运维架构 > Linux

centos/linux 下安装监控工具 sar,iosta,syssta

2012-03-30 16:57 971 查看
通过IOStat命令监控IO性能

iostat - CPU平均负载,硬盘活动

# iostat

Linux 2.6.18-274.el5xen (uiddev1) 2012年04月05日

avg-cpu: %user %nice %system %iowait %steal %idle

0.78 0.37 0.88 1.01 0.01 96.96

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn

sda 18.18 554.48 270.75 2549242 1244764

iostat命令可报告中央处理器(CPU)的统计信息,各种设备、分区及网络文件系统输入/输出的统计信息。

tcpdump -i eth0 'tcp port 80'

查看设备使用率(%util)、响应时间(await)

[b]iostat -d -x -k 1 1


[/b]

安装监控工具 sysstat

yum -y install sysstat

如果在redhat下面用rpm包安装的话可以先去系统盘或则是http://rpmfind.net/查找 sysstat相对应的rpm包
1. 基本使用

$iostat -d -k 1 10

参数
-d 表示,显示设备(磁盘)使用状态;
-k某些使用block为单位的列强制使用Kilobytes为单位;
1 10表示,数据显示每隔1秒刷新一次,共显示10次。

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

sda 39.29 21.14 1.44 441339807 29990031

sda1 0.00 0.00 0.00 1623 523

sda2 1.32 1.43 4.54 29834273 94827104

sda3 6.30 0.85 24.95 17816289 520725244

sda5 0.85 0.46 3.40 9543503 70970116

sda6 0.00 0.00 0.00 550 236

sda7 0.00 0.00 0.00 406 0

sda8 0.00 0.00 0.00 406 0

sda9 0.00 0.00 0.00 406 0

sda10 60.68 18.35 71.43 383002263 1490928140

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

sda 327.55 5159.18 102.04 5056 100

sda1 0.00 0.00 0.00 0 0

tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。

kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据,当时统计的磁盘总TPS是39.29,下面是各个分区的TPS。(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)

2.-x参数

# iostat -x 1 1

Linux 2.6.18-274.el5xen (uid) 2012年04月01日

avg-cpu: %user %nice %system %iowait %steal %idle

0.83 0.03 0.63 0.59 0.01 97.92

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util

sda 2.02 17.98 5.01 5.52 264.50 187.97 42.99 0.26 24.96 2.78 2.93

sda1 0.08 0.00 0.01 0.00 0.18 0.00 27.97 0.00 3.50 3.17 0.00

sda2 1.93 17.98 5.00 5.52 264.30 187.97 43.00 0.26 24.98 2.78 2.93

dm-0 0.00 0.00 6.91 23.50 264.20 187.97 14.87 0.57 18.85 0.96 2.93

dm-1 0.00 0.00 0.01 0.00 0.06 0.00 8.00 0.00 4.86 1.90 0.00

rrqm/s:队列中每秒钟合并的请求数量

wrqm/s:队列中每秒钟合并的请求数量

r/s:每秒钟完成的读请求数量

w/s:每秒钟完成的写请求数量

rsec/s:每秒钟读取的扇区数量

wsec/s:每秒钟写入的扇区数量

avgrq-sz:平均请求数据的大小

avgqu-sz:平均请求队列的长度

await:平均每次请求的等待时间

svctm:平均每次请求的服务时间

util:设备的利用率,该参数暗示了设备的繁忙程度

分析

1.如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

2.如果 idle 小于 70% IO压力就较大了,一般读取速度有较多的wait。

3.同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)

4.另外还可以参考

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核
elevator 算法,优化应用,或者升级 CPU。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。

###############

#

# 例子解释

#

###############

I/O 系统 vs. 超市排队

举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队排了。还有就是收银员的速度了,如果碰上了连 钱都点不清楚的新手,那就有的等了。另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的)。

I/O 系统也和超市排队有很多类似之处:

r/s+w/s 类似于交款人的总数

平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数

平均服务时间(svctm)类似于收银员的收款速度

平均等待时间(await)类似于平均每人的等待时间

平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少

I/O 操作率 (%util)类似于收款台前有人排队的时间比例。

平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + ... + 请求总数-1) / 请求总数

3. -c 参数

iostat还可以用来获取cpu部分状态值:

iostat -c 1 10
avg-cpu: %user %nice %sys %iowait %idle 1.98 0.00 0.35 11.45 86.22 avg-cpu: %user %nice %sys %iowait %idle 1.62 0.00 0.25 34.46 63.67

4. 常见用法
#查看TPS和吞吐量信息

$iostat -d -k 1 10
#查看设备使用率(%util)、响应时间(await)

iostat -d -x -k 1 1
5. 实例分析

$$iostat -d -k 1 |grep sda10

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

sda10 60.72 18.95 71.53 395637647 1493241908

sda10 299.02 4266.67 129.41 4352 132

sda10 483.84 4589.90 4117.17 4544 4076

sda10 218.00 3360.00 100.00 3360 100

sda10 546.00 8784.00 124.00 8784 124

sda10 827.00 13232.00 136.00 13232 136

上面看到,磁盘每秒传输次数平均约400;每秒磁盘读取约5MB,写入约1MB。

iostat -d -x -k 1

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 1.56 28.31 7.84 31.50 43.65 3.16 21.82 1.58 1.19 0.03 0.80 2.61 10.29

sda 1.98 24.75 419.80 6.93 13465.35 253.47 6732.67 126.73 32.15 2.00 4.70 2.00 85.25

sda 3.06 41.84 444.90 54.08 14204.08 2048.98 7102.04 1024.49 32.57 2.10 4.21 1.85 92.24

可以看到磁盘的平均响应时间<5ms,磁盘使用率>80。磁盘响应正常,但是已经很繁忙了。

Linux系统出现了性能问题,一般我们可以通过top、iostat、free、vmstat等命令来查看初步定位问题。其中iostat可以给我们提供丰富的IO状态数据。

6、IOStat信息的获得

使用strace命令能跟踪到答案:

# strace -eopen iostat

需要监控Linux服务器系统性能吗?尝试下面这些系统内置或附件的工具吧。大多数Linux发行版本都装备了大量的监控工具。这些工具提供了能用作取得相关信息和系统活动的量度指标。你能使用这些工具发现造成性能问题可能原因。此次讨论到的工具只是分析和调试服务器下面问题时最基本工具中的一部分。

1.找出瓶颈

2.硬盘(存储)瓶颈

3.CPU及内存瓶颈

4.网络瓶颈

# top

top - 10:38:49 up 2:07, 1 user, load average: 0.21, 0.07, 0.06

Tasks: 202 total, 2 running, 200 sleeping, 0 stopped, 0 zombie

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

Mem: 7793040k total, 4227764k used, 3565276k free, 98264k buffers

Swap: 10223608k total, 0k used, 10223608k free, 3165244k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

4474 oracle 16 0 264m 33m 14m S 0.7 0.4 0:01.92 emagent

26867 root 15 0 12760 1188 828 R 0.3 0.0 0:00.92 top

1 root 15 0 10368 684 572 S 0.0 0.0 0:00.21 init

2 root RT -5 0 0 0 S 0.0 0.0 0:00.04 migration/0

3 root 34 19 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0


#1: top - 进程活动(实时的)

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

用法: top -hv | -bcisSHM -d delay -n iterations [-u user | -U user] -p pid [,pid ...]

-b : 批次模式运行。通常用作来将top的输出的结果传送给其他程式或储存成文件。

-c : 显示执行任务的命令行。

-d : 设定延迟时间

-h : 帮助

-H : 显示线程。当这个设定开启时,将显示所有进程产生的线程。

-i : 显示空闲的进程。

-n : 执行次数。一般与-b搭配使用

-u : 监控指定用户相关进程

-U : 监控指定用户相关进程

-p : 监控指定的进程。当监控多个进程时,进程ID以逗号分隔。这个选项只能在命令行下使用。

-s : 安全模式操作

-S : 累计时间模式

-v : 显示top版本,然后退出。

-M : 自动显示内存单位(k/M/G)

# top

top - 11:26:26 up 2:54, 1 user, load average: 0.04, 0.09, 0.07

Tasks: 207 total, 1 running, 206 sleeping, 0 stopped, 0 zombie

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

Mem: 7793040k total, 4249072k used, 3543968k free, 102040k buffers

Swap: 10223608k total, 0k used, 10223608k free, 3168776k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

2291 root 15 0 12756 1072 728 R 2.0 0.0 0:00.01 top

栏位信息

在top中,分别使用26个英文字母对应进程相关信息栏位。可已通过f来添加或移除指定的栏位,通过o来调整对栏位显示顺序。下面我们针对这些栏位进行说明。

a: PID (Process Id):任务的进程ID

b: PPID (Parent Process Pid):父任务的进程ID

c: RUSER (Real User Name):任务的所有者真实名称

d: UID (User Id):任务所有者ID

e: USER (User Name):任务所有者名称

f: GROUP (Group Name):任务所有者群组名

g: TTY (Controlling Tty):终端

h: PR (Priority):优先级

i: NI (Nice value):Nice值

j: P (Last used CPU (SMP)):

k: %CPU (CPU usage):CPU使用率

TIME (CPU Time):CPU时间

TIME+ (CPU Time, hundredths):CPU时间,精确到秒

%MEM (Memory usage (RES)):内存使用率

VIRT (Virtual Image (kb)):虚拟内存。VIRT = SWAP + RES

p: SWAP (Swapped size (kb)):交换空间

q: RES (Resident size (kb)):常驻内存。RES = CODE + DATA

r: CODE (Code size (kb)):

s: DATA (Data+Stack size (kb)):

t: SHR (Shared Mem size (kb)):共享内存。

u: nFLT (Page Fault count):

v: nDRT (Dirty Pages count):

w: S (Process Status):进程状态

分别有以下几种:

D = uninterruptible sleep = 不可被唤醒睡眠

R = running = 正在运行中

S = sleeping = 睡眠状态

T = traced or stopped = 出错或停止状态

Z = zombie = 僵尸状态

x: Command (Command line or Program name):进程名或命令行

y: WCHAN (Sleeping in Function):

z: Flags (Task Flags):

一、相关设定默认值

全局

'A' - 交替显示模式

* 'd' - 刷新时间间隔

'I' - Irix mode

* 'p' - 监控特定PID

* 's' - 安全模式

'B' - 粗体显示

Off (默认为全屏显示,On时交替显示)

3.0秒

On

Off

Off

Off
摘要区

'l'- 平均负载及系统运行时间

't'- 任务及CPU状态

'm'- 内存及交换空间状态

'1'- 单CPU显示
On

On

On

On (如果为系统包含多处理器,只显示在一行中)
任务区域

'b'- 黑体/反色显示高亮的行/列

* 'c'- 任务执行的命令行

* 'H'- 显示线程

* 'i'- 空闲任务显示

'R'- 反序显示

* 'S'- 累计时间

'x'- 高亮显示排序的列

'y'- 高亮显示正在运行的任务

'z'- 彩色/黑白显示
On (off)

Off (只显示任务名称,不显示任务全格式信息)

Off

On

On

Off

Off

On

Off
注:*标示的设定,可以在启动top时,使用命令行参数覆盖指定参数值。

二、命令行启动参数:

用法: top -hv | -bcisSHM -d delay -n iterations [-uuser | -Uuser] -ppid [,pid ...]

-b : 批次模式运行。通常用作来将top的输出的结果传送给其他程式或储存成文件。

-c : 显示执行任务的命令行。

-d : 设定延迟时间

-h : 帮助

-H : 显示线程。当这个设定开启时,将显示所有进程产生的线程。

-i : 显示空闲的进程。

-n : 执行次数。一般与-b搭配使用

-u : 监控指定用户相关进程

-U : 监控指定用户相关进程

-p : 监控指定的进程。当监控多个进程时,进程ID以逗号分隔。这个选项只能在命令行下使用。

-s : 安全模式操作

-S : 累计时间模式

-v : 显示top版本,然后退出。

-M : 自动显示内存单位(k/M/G)

三、栏位信息

在top中,分别使用26个英文字母对应进程相关信息栏位。可已通过f来添加或移除指定的栏位,通过o来调整对栏位显示顺序。下面我们针对这些栏位进行说明。

a: PID (Process Id):任务的进程ID

b: PPID (Parent Process Pid):父任务的进程ID

c: RUSER (Real User Name):任务的所有者真实名称

d: UID (User Id):任务所有者ID

e: USER (User Name):任务所有者名称

f: GROUP (Group Name):任务所有者群组名

g: TTY (Controlling Tty):终端

h: PR (Priority):优先级

i: NI (Nice value):Nice值

j: P (Last used CPU (SMP)):

k: %CPU (CPU usage):CPU使用率

l: TIME (CPU Time):CPU时间

m: TIME+ (CPU Time, hundredths):CPU时间,精确到秒

n: %MEM (Memory usage (RES)):内存使用率

o: VIRT (Virtual Image (kb)):虚拟内存。VIRT = SWAP + RES

p: SWAP (Swapped size (kb)):交换空间

q: RES (Resident size (kb)):常驻内存。RES = CODE + DATA

r: CODE (Code size (kb)):

s: DATA (Data+Stack size (kb)):

t: SHR (Shared Mem size (kb)):共享内存。

u: nFLT (Page Fault count):

v: nDRT (Dirty Pages count):

w: S (Process Status):进程状态

分别有以下几种:

D = uninterruptible sleep = 不可被唤醒睡眠

R = running = 正在运行中

S = sleeping = 睡眠状态

T = traced or stopped = 出错或停止状态

Z = zombie = 僵尸状态

x: Command (Command line or Program name):进程名或命令行

y: WCHAN (Sleeping in Function):

z: Flags (Task Flags):

示例1:增加和移除进程信息栏位(输入f)

示例2:调整进程信息栏位显示顺序(输入o)

四、交互命令

1.全局命令

回车、空格 : 刷新显示信息

?、h : 帮助

= : 移除所有任务显示的限制

A : 交替显示模式切换

B : 粗体显示切换

d、s : 更改界面刷新时间间隔

G : 选择其它窗口/栏位组

I : Irix或Solaris模式切换

u、U : 监控指定用户相关进程

k : 结束进程

q : 退出top

r : 重新设定进程的nice值

W : 存储当前设定

Z : 改变颜色模板

2.摘要区命令

l : 平均负载及系统运行时间显示开关

m : 内存及交换空间使用率显示开关

t : 当前任务及CPU状态显示开关

1 : 汇总显示CPU状态或分开显示每个CPU状态
3.任务区命令

外观样式

b
: 黑体/反色显示高亮的行/列。控制x和y交互命令的顯示樣式。

x : 高亮显示排序的列

y : 高亮显示正在运行的任务

z : 彩色/黑白显示。

显示内容

c
: 任务执行的命令行或进程名称

f、o : 增加和移除进程信息栏位及调整进程信息栏位显示顺序

H : 显示线程

S : 时间累计模式

u : 监控指定用户相关进程

任务显示的数量

i
: 显示空闲的进程

n或# : 设置任务显示最大数量

任务排序

M : 按内存使用率排序

N : 按PID排序

P : 按CPU使用率排序

T
: 按Time+排序

< : 按当前排序栏位左边相邻栏位排序

> : 按当前排序栏位右边相邻栏位排序

F 或 O : 选择排序栏位

R : 反向排序

其他

五、练习

1.怎么让top外观显示类似下图?

2.怎样监控httpd进程状况?

3.怎么提高httpd进程运行优先权等级?

#2:vmstat -系统活动、硬件及系统信息

使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息

#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 0 2540988 522188 5130400 0 0 2 32 4 2 4 1 96 0 0 1 0 0 2540988 522188 5130400 0 0 0 720 1199 665 1 0 99 0 0 0 0 0 2540956 522188 5130400 0 0 0 0 1151 1569 4 1 95 0 0 0 0 0 2540956 522188 5130500 0 0 0 6 1117 439 1 0 99 0 0 0 0 0 2540940 522188 5130512 0 0 0 536 1189 932 1 0 98 0 0 0 0 0 2538444 522188 5130588 0 0 0 0 1187 1417 4 1 96 0 0 0 0 0 2490060 522188 5130640 0 0 0 18 1253 1123 5 1 94 0 0

显示内存使用详细信息

# vmstat -m

显示内存活动/不活动的信息

# vmstat -a

相关链接:How do I find out Linux Resource utilization to detect system bottlenecks?

译者推荐链接:Linux系统管理员必备工具系列之vmstat(原创)

#3: w - 显示谁已登录,他们正在做什么?

w命令显示系统当前用户及其运行进程的信息。

# w username

# w vivek

输出样例:

17:58:47 up 5 days, 20:28, 2 users, load average: 0.36, 0.26, 0.24 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.1.3.145 14:55 5.00s 0.04s 0.02s vim /etc/resolv.conf root pts/1 10.1.3.145 17:43 0.00s 0.03s 0.00s w

#4:uptime - 告诉系统已经运行了多久?

uptime命令过去只显示系统运行多久。现在,可以显示系统运行多久、当前有多少的用户登录、在过去的1,5,15分钟里平均负载时多少。

# uptime

输入样例:

18:02:41 up 41 days, 23:42, 1 user, load average: 0.00, 0.00, 0.00

1可以被认为是最优的负载值。负载是会随着系统不同改变得。单CPU系统1-3和SMP系统6-10都是可能接受的。

Linux系统监控的过程中少不了对主机运行时间和系统负责等信息进行查询,这时候就可以使用Linux uptime命令。uptime命令可以显示系统运行多久、当前有多少的用户登录、在过去的1,5,15分钟里平均负载时多少,其用法十分简单。
AD:

linux uptime命令主要用于获取主机运行时间和查询linux系统负载等信息。uptime命令过去只显示系统运行多久。现在,可以显示系统已经运行了多长时间,信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。

uptime命令用法十分简单:直接输入

# uptime

即可。

输入样例:

18:02:41 up 41 days, 23:42, 1 user, load average: 0.00, 0.00, 0.00

1可以被认为是最优的负载值。负载是会随着系统不同改变得。单CPU系统1-3和SMP系统6-10都是可能接受的。

另外还有一个参数 -V ,是用来查询版本的。 (注意是大写的字母v)

[linux @ localhost]$ uptime -V

procps version 3.2.7

[linux @ localhost]$ uptime

显示结果为:

10:19:04 up 257 days, 18:56, 12 users, load average: 2.10, 2.10,2.09

显示内容说明:

10:19:04 //系统当前时间

up 257 days, 18:56 //主机已运行时间,时间越大,说明你的机器越稳定。

12 user //用户连接数,是总连接数而不是用户数

load average // 系统平均负载,统计最近1,5,15分钟的系统平均负载

那么什么是系统平均负载呢? 系统平均负载是指在特定时间间隔内运行队列中的平均进程数。

如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。

如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。

11 strace

strace截取和记录系统进程调用,以及进程收到的信号。是一个非常有效的检测、指导和调试工具。系统管理员可以通过该命令容易地解决程序问题。

使用该命令需要指明进程的ID(PID),例如:

strace -p <pid>

图14-11 shows an example of the output of strace.



12 ulimit

ulimit内置在bash shell中,用来提供对shell和进程可用资源的控制

使用选项-a列出可以设置的所有参数:

ulimit -a



-H和-S选项指明所给资源的软硬限制。如果超过了软限制,系统管理员会收到警告信息。硬限制指在用户收到超过文件句炳限制的错误信息之前,可以达到的最大值。

例如可以设置对文件句炳的硬限制:ulimit -Hn 4096

例如可以设置对文件句炳的软限制:ulimit -Sn 1024

查看软硬值,执行如下命令:

ulimit -Hn

ulimit -Sn

例如限制Oracle用户. 在/etc/security/limits.conf输入以下行:

soft nofile 4096

hard nofile 10240

对于Red Hat Enterprise Linux AS,确定文件/etc/pam.d/system-auth包含如下行

session required /lib/security/$ISA/pam_limits.so

对于SUSE LINUX Enterprise Server,确定文件/etc/pam.d/login 和/etc/pam.d/sshd包含如下行:

session required pam_limits.so

这一行使这些限制生效。

2.使用说明

例子1:每2秒输出一条结果



字段说明:

Procs(进程):

r: 运行队列中进程数量

b: 等待IO的进程数量

Memory(内存):

swpd: 使用虚拟内存大小

free: 可用内存大小

buff: 用作缓冲的内存大小

cache: 用作缓存的内存大小

Swap:

si: 每秒从交换区写到内存的大小

so: 每秒写入交换区的内存大小

IO:(现在的Linux版本块的大小为1024bytes)

bi: 每秒读取的块数

bo: 每秒写入的块数

系统:

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

cs: 每秒上下文切换数。

CPU(以百分比表示):

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

sy: 系统进程执行时间(system time)

id: 空闲时间(包括IO等待时间)

wa: 等待IO时间

例子2:显示活跃和非活跃内存



使用-a选项显示活跃和非活跃内存时,所显示的内容除增加inact和active外,其他显示内容与例子1相同。

字段说明:

Memory(内存):

inact: 非活跃内存大小(当使用-a选项时显示)

active: 活跃的内存大小(当使用-a选项时显示)

本文来源:http://hi.baidu.com/imlidapeng/blog/item/51872329329ab8335243c1c9.html

#5:ps - 显示进程

ps命令显示当前运行进程的快照。使用-A或-e显示所有进程。

# ps -A

输出样例:

PID TTY TIME CMD 1 ? 00:00:02 init 2 ? 00:00:02 migration/0 3 ? 00:00:01 ksoftirqd/0 4 ? 00:00:00 watchdog/0 5 ? 00:00:00 migration/1 6 ? 00:00:15 ksoftirqd/1 .... ..... 4881 ? 00:53:28 java 4885 tty1 00:00:00 mingetty 4886 tty2 00:00:00 mingetty 4887 tty3 00:00:00 mingetty 4888 tty4 00:00:00 mingetty 4891 tty5 00:00:00 mingetty 4892 tty6 00:00:00 mingetty 4893 ttyS1 00:00:00 agetty 12853 ? 00:00:00 cifsoplockd 12854 ? 00:00:00 cifsdnotifyd 14231 ? 00:10:34 lighttpd 14232 ? 00:00:00 php-cgi 54981 pts/0 00:00:00 vim 55465 ? 00:00:00 php-cgi 55546 ? 00:00:00 bind9-snmp-stat 55704 pts/1 00:00:00 ps

ps与top非常相似,但ps提供更多的信息。

输出长格式

# ps -Al

输出附加全格式(显示进程在执行时传入的参数)

# ps -AlF

显示进程结构

# ps -AlFH

在进程后显示线程

# ps -AlLm

打印服务器上所有进程

# ps ax

# ps axu

打印进程树

# ps -ejH

# ps axjf

# pstree
打印安全信息

# ps -eo euser,ruser,suser,fuser,f,comm,label

# ps axZ

# ps -eM

查看使用Vivek用户名运行的进程

# ps -U vivek -u vivek u

设置自定义输出格式

# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm

# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

# ps -eopid,tt,user,fname,tmout,f,wchan

只显示Lighttpd的进程ID

# ps -C lighttpd -o pid=
或者

# pgrep lighttpd
或者

# pgrep -u vivek php-cgi

显示PID为55977的进程名称

# ps -p 55977 -o comm=
找出消耗内存最多的前10名进程

# ps -auxf | sort -nr -k 4 | head -10
找出使用CPU最多的前10名进程

# ps -auxf | sort -nr -k 3 | head -10

#6:free - 内存使用情况

free命令显示系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。

# free -m

# free -m

total used free shared buffers cached

Mem: 3939 1242 2697 0 69 583

-/+ buffers/cache: 589 3349

Swap: 5951 0 5951

# free

total used free shared buffers cached

Mem: 4033580 1272560 2761020 0 70844 597056

-/+ buffers/cache: 604660 3428920

Swap: 6094840 0 6094840

# free -k

total used free shared buffers cached

Mem: 4033580 1273320 2760260 0 70908 597056

-/+ buffers/cache: 605356 3428224

Swap: 6094840 0 6094840

# free -g

total used free shared buffers cached

Mem: 3 1 2 0 0 0

-/+ buffers/cache: 0 3

Swap: 5 0 5





前段时间有个项目的用C写的,性能测试时发现内存泄露问题。关于怎么观察内存使用问题,free是很好用的一个命令。

bash-3.00$
freetotal used free shared buffers cachedMem: 1572988 1509260 63728 0 62800 277888-/+ buffers/cache: 1168572 404416Swap: 2096472 16628 2079844

Mem:表示物理内存统计-/+
buffers/cached:表示物理内存的缓存统计Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。第1行
Mem: total:表示物理内存总量。used:表示总计分配给缓存(包含buffers
与cache )使用的数量,但其中可能部分缓存并未实际使用。free:未被分配的内存。shared:共享内存,一般系统不会用到,这里也不讨论。buffers:系统分配但未被使用的buffers 数量。cached:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。 total
= used + free 第2行
-/+ buffers/cached:used:也就是第一行中的used
– buffers-cached 也是实际使用的内存总量。free:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。 free
2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行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 第3行: 第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached
是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free
memory+buffers+cached.


接下来解释什么时候内存会被交换,以及按什么方交换。当可用内存少于额定值的时候,就会开会进行交换.如何看额定值(RHEL4.0):#cat /proc/meminfo交换将通过三个途径来减少系统中使用的物理页面的个数:1.减少缓冲与页面cache的大小,2.将系统V类型的内存页面交换出去,3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。事实上,少量地使用swap是不是影响到系统性能的。

下面是buffers与cached的区别。buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及
tracking in-flight pages.
cached是用来给文件做缓冲。那就是说:buffers是用来存储,目录里面有什么内容,权限等等。而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man
X ,你就可以明显的感觉到第二次的开打的速度快很多。实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。#free#man X#free#man X#free你可以先后比较一下free后显示buffers的大小。另一个实验:#free#ls /dev#free你比较一下两个的大小,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。

因为Linux将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,系统会自动释放(不像windows那样,即使你有很多空闲内存,他也要访问一下磁盘中的pagefiles)使用free命令将used的值减去 buffer和cache的值就是你当前真实内存使用 ————– 对操作系统来讲是Mem的参数.buffers/cached
都是属于被使用,所以它认为free只有16936.对应用程序来讲是(-/+
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看 内存是否够用的标准哦.———————————————语  法:
free [-bkmotV][-s <间隔秒数>]

补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。

参  数:-b  以Byte为单位显示内存使用情况。-k  以KB为单位显示内存使用情况。-m  以MB为单位显示内存使用情况。-o  不显示缓冲区调节列。-s<间隔秒数>  持续观察内存使用状况。-t  显示内存总和列。-V  显示版本信息。

用途

报告虚拟内存统计信息。

语法

vmstat [
-f ] [
-i ] [
-s ] [
-I ] [
-t ] [
-v ] [
PhysicalVolume ... ] [ Interval [
Count ] ]

描述

vmstat 命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由vmstat
命令生成的报告可以用于平衡系统负载活动。系统范围内的这些统计信息(所有的处理器中)都计算出以百分比表示的平均值,或者计算其总和。

如果调用 vmstat 命令时不带标志,则报告包含系统启动后虚拟内存活动的摘要。如果指定-f 标志,则vmstat 命令报告自从系统启动后派生的数量。PhysicalVolume 参数指定物理卷的名称。

Interval 参数指定每个报告之间的时间量(以秒计)。第一个报告包含系统启动后时间的统计信息。后续报告包含自从前一个报告起的时间间隔过程中所收集的统计信息。如果没有指定Interval 参数,vmstat 命令生成单个报告然后退出。Count
参数只能和Interval 参数一起指定。如果指定了 Count 参数,其值决定生成的报告数目和相互间隔的秒数。如果Interval 参数被指定而没有Count 参数,则连续生成报告。Count 参数不允许为 0。

在 AIX 4.3.3 及更新版本包含有此方法的增强,用于计算 CPU 等待磁盘 I/O 所花时间(wio 时间)的百分比。某些情况下,AIX 4.3.2 以及该操作系统更早的版本中使用的该方法在
SMP 上会给出夸张的 wio 时间报告。

AIX 4.3.2 和更早版本中使用的方法如下:在每个处理器的每一次时钟中断(每个处理器一秒钟 100 次),确定上一个 10 毫秒时间要归入四种类别(usr/sys/wio/idle)中的哪一个。如果在时钟中断的时候,CPU 正忙于 usr 方式,那么 usr 将获取该时钟周期添加到其类别中。如果在时钟中断的时候,CPU 正忙于内核方式,那么 sys 类别获取该时钟周期。如果 CPU 不忙的话,则检测是否有磁盘 I/O 正在进行。如果有任何正在进行的磁盘
I/ O,则累加 wio 类别。如果没有磁盘 I/O 正在进行且 CPU 不忙,则 idle 类别获取该时钟周期。由于所有的空闲 CPU 都被归入 wio 类别,而不管正在等待 I/O 的线程数量,所以会产生夸大的 wio 时间报告。例如,只有一个 I/O 线程的系统可能会报告 90% 以上的 wio 时间,而不管它拥有的 CPU 数量。sar(%wio)、vmstat(wa)和iostat(%
iowait)命令报告 wio 时间。

操作系统 AIX 4.3.3 及其更新版本使用的方法如下:如果一个未完成的 I/O 在空闲的 CPU 上启动,则操作系统 AIX 4.3.3 中的更改将只把该 CPU 标记成 wio。当只有少量线程在进行 I/O 而系统其它部分是空闲的,此方法能报告低得多的 wio 时间。例如,一个有四个 CPU 和一个正在进行 I/O 的线程的系统将报告最多 25% 的 wio 时间。有 12 个 CPU 和一个正在进行 I/O 的线程的系统只报告最大为 8% 的
wio 时间。NFS 客户机通过 VMM 读取/写入,biods 在 VMM 中花费的等待 I/O 完成的时间现在报告为 I/O 等待时间。
内核为内核线程、调页和中断活动维护统计信息,vmstat 命令通过使用perfstat 内核扩展来对其进行访问。磁盘输入/输出统计信息由设备驱动程序维护。对于磁盘,利用活动时间和传送信息数量来确定平均传送速率。活动时间的百分数根据报告期间驱动器忙的时间量来计算。

由 vmstat 命令生成的以下报告示例包含栏标题及其描述:

kthr:内核线程状态在采样间隔期间每秒钟更改一次。

r置于运行队列中的内核线程数目。
b置于等待队列(等待资源、等待输入/输出)的内核线程数目。
内存:关于使用虚拟内存和实内存的信息。如果虚拟页已经被访问的话,虚拟页可以被认为是活动的。一页为 4096 个字节。

avm活动虚拟页。
fre空闲列表的大小。
注:
大部分实内存都用作文件系统数据的高速缓存。对于保持较小的空闲列表,这是很正常的。
页:关于缺页故障和调页活动的信息。这些是间隔的平均值,以秒为单位给出。

re页面调度程序输入/输出列表。
pi从调页空间调度进的页面。
po调出到调页空间的页面。
fr释放的页(页面替换)。
sr通过页替换算法扫描的页面。
cy按页替换算法的时钟周期。
故障:采样间隔平均每秒的捕获和中断率。

in设备中断
sy系统调用。
cs内核线程上下文切换。
Cpu:CPU 使用时间故障百分比。

us用户时间。
sy系统时间。
idCPU 空闲时间。
waCPU 空闲时间,在此期间系统有未完成的磁盘/NFS I/O 请求。请参阅上面的详细描述。
磁盘:每秒向指定物理卷提供的传送数目,该过程在采样间隔中发生。PhysicalVolume 参数可以用于指定一到四个名称。每个指定驱动器的传送统计信息按指定顺序给出。该计数代表向物理设备的请求数。它并不暗示读取或写入的数据量。几个逻辑请求可以组合成为一个物理请求。
如果指定一个 -I 标志,I/O 定向视图将会出现以下栏目变化。

kthr除了栏 r 和 b之外,栏p 也将显示。
p 每秒等待实际物理 I/O 的线程数。
将显示新栏 fi 和 fo,代替
re 和 cy 栏。
fi 每秒调入的文件。 fo 每秒调出的文件。

标志

注:
如果在命令行中输入了 -f(或 -s)标志,系统将仅接受-f(或-s)标志,将忽略其它标志。如果同时指定了-f 和-s 标志,系统将仅接受第一个标志,忽略第二个标志。

-f报告从系统启动后的派生数目。
-i显示从系统启动后每个设备造成的中断数目。
-I用新的输出栏显示 I/O 定向视图,p 在标题 kthr 下;栏fi 和fo 在标题页面下,而不是栏下;re 和cy 在页标题中。
-s将总数结构中的内容写入到标准输出,该结构包含从系统初始化后调页事件的绝对计数。-s 标志只能与
-v 标志一起使用。如下描述了这些事件:
地址翻译错误每次发生地址转换页面故障时增加。解决页面故障可能需要 I/O,也可能不需要。存储保护页面故障(失去锁定)不包含在此计数之内。 入页随虚拟内存管理器读入的每页增加。计数随调页空间和文件空间的入页增加。它和出页统计信息一起表示实际 I/O(由虚拟内存管理器启动)的总量。 出页随虚拟内存管理器写出的每页增加。计数随调页空间和文件空间的出页而增加。它和入页统计信息一起表示实际 I/O(由虚拟内存管理器启动)的总量。 调页空间入页只随 VMM 启动的来自调页空间的入页而增加。 调页空间出页只随 VMM 启动的来自调页空间的出页而增加。 总回收当不启用一个新的 I/O 请求也可以满足地址翻译错误时增加。如果页面以前已经被 VMM 请求过的,但是 I/O 还没有完成;或者页面被预读算法提前提取,但是被故障段隐藏了;或者如果页面已经被放入空闲列表中,但还没有重新使用,则会发生此情况。零填充页面故障如果页面故障针对的是工作存储器,且可以通过指定一个帧并以零填充帧来满足它的话,则该值增加。 可执行填充页面故障随着每个指令页面故障而增加。 用时钟检查页面VMM 利用时钟算法实施伪最近最少使用(1ru)的页面替换模式。时钟检查过的页面是 aged。为每个时钟检查过的页面增加此计数值。时钟指针的转动随着每次 VMM 时钟旋转而增加(即在每一次完整的内存扫描后)。 用时钟释放的页面随着时钟算法从实内存中选择释放的每一个页面而增加。
回溯随着解决前一个页面故障时出现的每一个页面故障而增加。(必须首先解决新的页面故障,然后可以回溯到最初的页面故障。)锁定丢失VMM 通过除去对页面的寻址能力来强制并发性锁定。锁定丢失可能产生一个页面故障,每当此类情况发生时,此计数增加。 空闲帧等待在收集可用帧时,每次 VMM 等待一个进程时增加。 扩展 XPT 等待每次正在进行提交而使得 VMM 等待一个进程时,随着正在被访问的段而增加。 暂挂 I/O 等待每次 VMM 等待一个进程时随着要完成的入页 I/O 而增加。 启动 I/O随着每个被 VMM 启动的读取或写入 I/O 请求而增加。此计数应该与入页和出页的总数相等。 iodones在每次完成 VMM I/O 请求时增加。 CPU 上下文交换随着每次 CPU 上下文交换而增加(新进程的分派)。 设备中断每次硬件中断时增加。 软件中断每次软件中断时增加。一次软件中断是一个类似于硬件中断(保存一些状态和服务器例程分支)的机器指令。系统调用用软件中断指令来完成,该指令转换控制到系统调用处理程序例程。陷阱不通过操作系统来维护。 syscalls随着每次系统调用而增加。
-t打印 vmstat 的每一输出行旁边的时间戳记。时间戳记按照 HH:MM:SS 格式显示。
注:
如果指定了 -f、-s 或-i 标志,将不打印时间戳记。
-v将虚拟内存管理器维护的不同统计信息写入标准输出。-v 标志只能与
-s 标志一起使用。
内存页 实内存的大小(以 4 KB 的页面数目计)。 lruable 页 要用于替换的 4 KB 页面的数目。此数目不包含被用于 VMM 内部页和用于内核文本的固定部分的页面。 空闲页面 空闲 4 KB 页面的数目。 内存池 指定内存池数目的调整参数(使用 vmo 管理)。 固定页面 固定的 4 KB 页面的数目。 maxpin 百分比 指定能被固定的实内存百分数的调整参数(使用 vmo 管理)。 minperm 百分比 实内存百分比的调整参数(使用 vmo 管理)。它指定一临界点,低于此临界点时阻止页面重新调度算法使用文件页面。maxperm 百分比 实内存百分比的调整参数(使用 vmo 管理)。它指定一临界点,高于此临界点时页面取走算法只取走文件页面。numperm 百分比 当前由文件高速缓存使用的内存百分数。 文件页面 当前由文件高速缓存使用的 4 KB 页面的数目。 压缩百分比 由压缩页面使用的内存百分数。 压缩页面 压缩内存页面的数目。 numclient 百分数 被客户机页面占用的内存百分数。 maxclient 百分数 指定能用于客户机页面的最大内存百分数的调整参数(使用 vmo 管理)。 客户机页面 客户机页面的数目。 已调度的远程出页 调度用于客户机文件系统的出页的数目。 无 pbuf 而阻塞的暂挂磁盘 I/O 没有可用 pbuf 而阻塞的暂挂磁盘 I/O 请求的数目。Pbuf 是用于保存逻辑卷管理器层上的 I/O 请求的固定的内存缓冲区。 无 psbuf 而阻塞的调页空间 I/O 没有可用 psbuf 而阻塞的调页空间 I/O 请求的数目。Psbuf 是用于保存虚拟内存管理器层上的 I/O 请求的固定内存缓冲区。
-v(由 -v显示的统计信息,接上页):
无 fsbuf 而阻塞的文件系统 I/O 没有可用 fsbuf 而阻塞的文件系统 I/O 请求的数目。Fsbuf 是用于保存文件系统层上的 I/O 请求的固定内存缓冲区。 无 fsbuf 而阻塞的客户机文件系统 I/O 没有可用 fsbuf 而阻塞的客户机文件系统 I/O 请求的数目。NFS(网络文件系统)和 VxFS(Veritas)是客户机文件系统。Fsbuf 是用于保存文件系统层上的 I/O 请求的固定内存缓冲区。无 fsbuf 而阻塞的外部页面调度程序文件系统 I/O 没有可用 fsbuf 而被阻塞的外部页面调度程序客户机文件系统 I/O 请求的数目。JFS2 是一个外部页面调度程序客户机文件系统。Fsbuf 是用于保存文件系统层上的 I/O 请求的固定内存缓冲区。

示例

要显示引导后的统计信息摘要,请输入:

vmstat


要显示 2 秒时间间隔的 5 个摘要,请输入:

vmstat 2 5

第一次摘要包含引导后的时间统计信息。

要显示引导后包括逻辑磁盘 scdisk13 和 scdisk14 的统计信息摘要,请输入:

vmstat scdisk13 scdisk14


要显示派生统计信息,请输入:

vmstat  -f


要显示各事件的计数,请输入:

vmstat -s


要显示 vmstat的每一输出栏旁边的时间戳记,请输入:

vmstat -t


要以另一套输出栏显示新的 I/O 定向视图,请输入:

vmstat -I


要显示所有可用的 VMM 统计信息,请输入:
vmstat -vs


文件

/usr/bin/vmstat包含 vmstat 命令。

相关信息

iostatvmo
命令。
tcpdump采用命令行方式,它的命令格式为:

  tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]

          [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]

          [ -T 类型 ] [ -w 文件名 ] [表达式 ]

  1. tcpdump的选项介绍

   -a    将网络地址和广播地址转变成名字;

   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;

   -dd    将匹配信息包的代码以c语言程序段的格式给出;

   -ddd    将匹配信息包的代码以十进制的形式给出;

   -e    在输出行打印出数据链路层的头部信息;

   -f    将外部的Internet地址以数字的形式打印出来;

   -l    使标准输出变为缓冲行形式;

   -n    不把网络地址转换成名字;

   -t    在输出的每一行不打印时间戳;

   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;

   -vv    输出详细的报文信息;

   -c    在收到指定的包的数目后,tcpdump就会停止;

   -F    从指定的文件中读取表达式,忽略其它的表达式;

   -i    指定监听的网络接口;

   -r    从指定的文件中读取包(这些包一般通过-w选项产生);

   -w    直接将包写入文件中,并不分析和打印出来;

   -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程

调用)和snmp(简单       网络管理协议;)

  2. tcpdump的表达式介绍

   表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表

达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会

被截获。

   在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,

net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明

202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是

host.

   第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,

这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.

48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则

缺省是src or dst关键字。

   第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在

FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和e

ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。

其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会

监听所有协议的信息包。

   除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,

greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o

r' ,'||';

   这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来

说明。

   (1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:

    #tcpdump host 210.27.48.1

   (2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令

:(在命令行中适用   括号时,一定要

    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

   (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包

,使用命令:

    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

   (4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

    #tcpdump tcp port 23 host 210.27.48.1

  3. tcpdump 的输出结果介绍

   下面我们介绍几种典型的tcpdump命令的输出信息

   (1) 数据链路层头信息

   使用命令#tcpdump --e host ice

   ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A

   H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条

命令的输出结果如下所示:

21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.

telne

t 0:0(0) ack 22535 win 8760 (DF)

  分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该

数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它

表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的

目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.

telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535

表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.

  (2) ARP包的TCPDUMP输出信息

   使用命令#tcpdump arp

   得到的输出结果是:

  22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)

  22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af

:1a)

  分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是

ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:5

8:af:1a是主机ICE的MAC地址。

  (3) TCP包的输出信息

   用TCPDUMP捕获的TCP包的一般输出信息是:

  src > dst: flags data-seqno ack window urgent options

  src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F

IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是

下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.

Options是选项.

  (4) UDP包的输出信息

   用TCPDUMP捕获的UDP包的一般输出信息是:

  route.port1 > ice.port2: udp lenth

  UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机

ICE的port2端口,类型是UDP, 包的长度是lenth

#8:sar - 搜集和报告系统活动

sar命令用来搜集、报告和储存系统活动信息。查看网路计数器,输入:

# sar -n DEV | more

显示最近24小时网络计数器

# sar -n DEV -f /var/log/sa/sa24 | more

你亦可以用sar显示实时情况

# sar 4 5

输出样例:

Linux 2.6.18-128.1.14.el5 (www03.nixcraft.in) 06/26/2009

06:45:12 PM CPU %user %nice %system %iowait %steal %idle

06:45:16 PM all 2.00 0.00 0.22 0.00 0.00 97.78

06:45:20 PM all 2.07 0.00 0.38 0.03 0.00 97.52

06:45:24 PM all 0.94 0.00 0.28 0.00 0.00 98.78

06:45:28 PM all 1.56 0.00 0.22 0.00 0.00 98.22

06:45:32 PM all 3.53 0.00 0.25 0.03 0.00 96.19

Average: all 2.02 0.00 0.27 0.01 0.00 97.70
http://www.cyberciti.biz/tips/how-do-i-find-out-linux-cpu-utilization.html
#9:mpstat - 多处理器使用率

mpstat命令可以显示所有可用处理器的使用情况,处理器编号从0开始。mpstat -P ALL显示每个处理器的平均使用率。

# mpstat -P ALL

输出样例:

Linux 2.6.18-128.1.14.el5 (www03.nixcraft.in) 06/26/2009

06:48:11 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s

06:48:11 PM all 3.50 0.09 0.34 0.03 0.01 0.17 0.00 95.86 1218.04

06:48:11 PM 0 3.44 0.08 0.31 0.02 0.00 0.12 0.00 96.04 1000.31

06:48:11 PM 1 3.10 0.08 0.32 0.09 0.02 0.11 0.00 96.28 34.93

06:48:11 PM 2 4.16 0.11 0.36 0.02 0.00 0.11 0.00 95.25 0.00

06:48:11 PM 3 3.77 0.11 0.38 0.03 0.01 0.24 0.00 95.46 44.80

06:48:11 PM 4 2.96 0.07 0.29 0.04 0.02 0.10 0.00 96.52 25.91

06:48:11 PM 5 3.26 0.08 0.28 0.03 0.01 0.10 0.00 96.23 14.98

06:48:11 PM 6 4.00 0.10 0.34 0.01 0.00 0.13 0.00 95.42 3.75

06:48:11 PM 7 3.30 0.11 0.39 0.03 0.01 0.46 0.00 95.69 76.89

相关链接:Linux display each multiple SMP CPU processors utilization individually.

#10: pmap - 进程的内存使用

pmap命令可以显示进程的内存映射,使用这个命令可以找出造成内存瓶颈的原因。

# pmap -d PID

显示PID为47394进程的内存信息。

# pmap -d 47394

输出样例:

mapped: 933712K writeable/private: 4304K shared: 768000K

最后一行非常重要:

* mapped: 933712K 内存映射所占空间大小

* writeable/private: 4304K 私有地址空间大小

* shared: 768000K 共享地址空间大小

相关链接:Linux find the memory used by a program / process using pmap command

#11和#12: netstat和ss - 网络相关信息

netstat可以显示网络链接、路由表信息、接口统计信息、伪装链接和多播成员(multicast memberships),ss命令用来显示网络套接字信息,它允许显示类似netstat一样的信息。关于ss和netstat使用,可参考下列资源。

相关链接:

ss: Display Linux TCP / UDP Network and Socket Information
Get Detailed Information About Particular IP address Connections Using netstat Command

#13: iptraf - 网络实时信息

iptraf是一个可交互式的IP网络监控工具。它可以生成多种网络统计信息包括:TCP信息、UDP数量、ICMP和OSPF信息、以太网负载信息、节点状态、IP校验错误等。有下面几种信息格式:

不同网络TCP链接传输量
不同网络接口IP传输量
不同协议网络传输量
不同TCP/UDP端口和不同包大小网络传输量
不同第二层地址网络传输量

图02:一般接口信息:不同网络接口IP传输量

图03:不同网络TCP链接传输量

#14:tcpdump:详细的网络流量分析

tcpdump是一个简单网络流量转储工具,然而要使用好需要对TCP/IP协议非常熟悉。例如要显示关于DNS的网络流量,输入:

# tcpdump -i eth1 'udp port 53'
显示所有进出80端口IPv4 HTTP包,也就是只打印包含数据的包。例如:SYN、FIN包和ACK-only包输入:

# tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

显示所有到的FTP会话,输入:

# tcpdump -i eth1 'dst 202.54.1.5 and (port 21 or 20'

显示所有到192.168.1.5的HTTP会话

# tcpdump -ni eth0 'dst 192.168.1.5 and tcp and port http'

用wireshark浏览转储文件中的详细信息,输入:

#tcpdump -n -i eth1 -s 0 -w output.txt src or dst port 80

[align=right][/align]
tcpdump采用命令行方式,它的命令格式为:

  tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]

          [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]

          [ -T 类型 ] [ -w 文件名 ] [表达式 ]

  1. tcpdump的选项介绍

   -a    将网络地址和广播地址转变成名字;

   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;

   -dd    将匹配信息包的代码以c语言程序段的格式给出;

   -ddd    将匹配信息包的代码以十进制的形式给出;

   -e    在输出行打印出数据链路层的头部信息;

   -f    将外部的Internet地址以数字的形式打印出来;

   -l    使标准输出变为缓冲行形式;

   -n    不把网络地址转换成名字;

   -t    在输出的每一行不打印时间戳;

   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;

   -vv    输出详细的报文信息;

   -c    在收到指定的包的数目后,tcpdump就会停止;

   -F    从指定的文件中读取表达式,忽略其它的表达式;

   -i    指定监听的网络接口;

   -r    从指定的文件中读取包(这些包一般通过-w选项产生);

   -w    直接将包写入文件中,并不分析和打印出来;

   -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程

调用)和snmp(简单       网络管理协议;)

  2. tcpdump的表达式介绍

   表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表

达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会

被截获。

   在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,

net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明

202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是

host.

   第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,

这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.

48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则

缺省是src or dst关键字。

   第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在

FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和e

ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。

其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会

监听所有协议的信息包。

   除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,

greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o

r' ,'||';

   这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来

说明。

   (1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:

    #tcpdump host 210.27.48.1

   (2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令

:(在命令行中适用   括号时,一定要

    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

   (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包

,使用命令:

    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

   (4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

    #tcpdump tcp port 23 host 210.27.48.1

  3. tcpdump 的输出结果介绍

   下面我们介绍几种典型的tcpdump命令的输出信息

   (1) 数据链路层头信息

   使用命令#tcpdump --e host ice

   ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A

   H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条

命令的输出结果如下所示:

21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 >; ice.

telne

t 0:0(0) ack 22535 win 8760 (DF)

  分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该

数据包,eth0 >;表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它

表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的

目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 >; ice.

telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535

表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.

  (2) ARP包的TCPDUMP输出信息

   使用命令#tcpdump arp

   得到的输出结果是:

  22:32:42.802509 eth0 >; arp who-has route tell ice (0:90:27:58:af:1a)

  22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af

:1a)

  分析: 22:32:42是时间戳, 802509是ID号, eth0 >;表明从主机发出该数据包, arp表明是

ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:5

8:af:1a是主机ICE的MAC地址。

  (3) TCP包的输出信息

   用TCPDUMP捕获的TCP包的一般输出信息是:

  src >; dst: flags data-seqno ack window urgent options

  src >; dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F

IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是

下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.

Options是选项.

  (4) UDP包的输出信息

   用TCPDUMP捕获的UDP包的一般输出信息是:

  route.port1 >; ice.port2: udp lenth

  UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机

ICE的port2端口,类型是UDP, 包的长度是lenth

第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.

  第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。

  第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。

  除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'││';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。

  普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。

  # tcpdump

  tcpdump: listening on fxp0

  11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50

  11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43

  0000 0000 0080 0000 1007 cf08 0900 0000

  0e80 0000 902b 4695 0980 8701 0014 0002

  000f 0000 902b 4695 0008 00

  11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97

  ffff 0060 0004 ffff ffff ffff ffff ffff

  0452 ffff ffff 0000 e85b 6d85 4008 0002

  0640 4d41 5354 4552 5f57 4542 0000 0000

  0000 00

  使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,

  使用-c参数指定要监听的数据包数量,

  使用-w参数指定将监听到的数据包写入文件中保存

  A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:

  #tcpdump host 210.27.48.1

  B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用

  括号时,一定要

  #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

  C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

  #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

  D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

  #tcpdump tcp port 23 host 210.27.48.1

  E 对本机的udp 123 端口进行监视 123 为ntp的服务端口

  # tcpdump udp port 123

  F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:

  #tcpdump -i eth0 src host hostname

  G 下面的命令可以监视所有送到主机hostname的数据包:

  #tcpdump -i eth0 dst host hostname

  H 我们还可以监视通过指定网关的数据包:

  #tcpdump -i eth0 gateway Gatewayname

  I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:

  #tcpdump -i eth0 host hostname and port 80

 ? 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包

  ,使用命令:

  #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

  K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令

  :(在命令行中适用

  括号时,一定要

  #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

  L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

  #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

  M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

  #tcpdump tcp port 23 host 210.27.48.1

  第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型

  除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,

  greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o

  r' ,'||';

  第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,

  如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。

  #tcpdump –i eth0 host hostname and dst port 80 目的端口是80

  或者

  #tcpdump –i eth0 host hostname and src port 80 源端口是80 一般是提供http的服务的主机

  如果条件很多的话 要在条件之前加and 或 or 或 not

  #tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80

  如果在ethernet 使用混杂模式 系统的日志将会记录

  May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.

  May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode

  May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode

  tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

  除了过滤语句,还有一个很重要的参数,也就是说,如果这个参数不设置正确,会导致包数据的丢失!

  它就是-s 参数,snaplen, 也就是数据包的截取长度,仔细看man就会明白的!默认截取长度为60个字节,但一般ethernet MTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失!

  只要使用-s 0就可以按包长,截取数据

(一) linux内存查看 free 命令
http://www.wujianrong.com/archives/2007/09/linux_free.html
在Linux下查看内存我们一般用command free

[root@nonamelinux ~]# free

total used free shared buffers cached

Mem: 386024 377116 8908 0 21280 155468

-/+ buffers/cache: 200368 185656

Swap: 393552 0 393552

下面是对这些数值的解释:

第二行(mem):

total:总计物理内存的大小。

used:已使用多大。

free:可用有多少。

Shared:多个进程共享的内存总额。

Buffers/cached:磁盘缓存的大小。

第三行(-/+ buffers/cached):

used:已使用多大。

free:可用有多少。

第四行就不多解释了。

区别:

第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。

这 两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是8908KB,已用内存是377116KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.

第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached.

如上例:

185656=8908+21280+155468

接下来解释什么时候内存会被交换,以及按什么方交换。

当可用内存少于额定值的时候,就会开会进行交换.

如何看额定值(RHEL4.0):

#cat /proc/meminfo

交换将通过三个途径来减少系统中使用的物理页面的个数: 

1.减少缓冲与页面cache的大小,

2.将系统V类型的内存页面交换出去, 

3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。

事实上,少量地使用swap是不是影响到系统性能的。

下面是buffers与cached的区别。

buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.

cached是用来给文件做缓冲。

那就是说:buffers是用来存储,目录里面有什么内容,权限等等。

而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。

实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。

#free

#man X

#free

#man X

#free

你可以先后比较一下free后显示buffers的大小。

另一个实验:

#free

#ls /dev

#free

你比较一下两个的大小,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。

因为Linux将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,系统会自动释放(不像windows那样,即使你有很多空闲内存,他也要访问一下磁盘中的pagefiles)

使用free命令

将used的值减去 buffer和cache的值就是你当前真实内存使用

(二),Re:关于 free 命令显示内存使用情况问题
http://linux.chinaunix.net/bbs/thread-887896-1-1.html
[root@Linux /tmp]# free

total used free shared buffers cached

Mem: 4149156 4130412 18744 0 13220 2720160

-/+ buffers/cache: 1397032 2752124

Swap: 6289408 144 6289264第1行

total 内存总数: 4149156

used 已经使用的内存数: 4130412

free 空闲的内存数: 18744

shared 当前已经废弃不用,总是0

buffers Buffer Cache内存数: 13220

cached Page Cache内存数: 2720160

关系:total = used + free

第2行:

-/+ buffers/cache的意思相当于:

-buffers/cache 的内存数:1397032 (等于第1行的 used - buffers - cached)

+buffers/cache 的内存数: 2752124 (等于第1行的 free + buffers + cached)

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

第三行单独针对交换分区, 就不用再说了.

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。

如果感兴趣可以进一步参考文件/proc/meminfo,free命令就是根据它的信息生成的。free命令的源码可从procps-xxx-.src.rpm获取,xxx为版本号,比如procps-3.2.3-5.3.src.rpm。

参考内核代码:

arch/i386/mm/init.c

fs/proc/proc_misc.c

include/linux/swap.h

mm/filemap.c

fs/buffer.c

另外还可以参考O'REILLY的书《Understanding the LINUX KERNEL》。

文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/6_system/linux/Linuxjs/20071027/80138.html

tcpdump -i eth0 'tcp port 80'


tcpdump抓包分析详解

/article/9007525.html

說實在的,對於 tcpdump 這個軟體來說,你甚至可以說這個軟體其實就是個駭客軟體, 因為他不但可以分析封包的流向,連封包的內容也可以進行『監聽』, 如果你使用的傳輸資料是明碼的話,不得了,在 router 上面就可能被人家監聽走了! 很可怕吶!所以,我們也要來瞭解一下這個軟體啊!(註:這個 tcpdump 必須使用 root 的身份執行)

[root@linux ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae]
        [-qX] [-r 檔案] [所欲擷取的資料內容]
參數:
-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 等
還可以利用 and 與 or 來進行封包資料的整合顯示呢!

範例一:以 IP 與 port number 捉下 eth0 這個網路卡上的封包,持續 3 秒
[root@linux ~]# tcpdump -i eth0 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648
01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 9648
<==按下 [ctrl]-c 之後結束
6680 packets captured              <==捉下來的封包數量
14250 packets received by filter   <==由過濾所得的總封包數量
7512 packets dropped by kernel     <==被核心所丟棄的封包

如果你是第一次看 tcpdump 的 man page 時,肯定一個頭兩個大,因為 tcpdump 幾乎都是分析封包的表頭資料,使用者如果沒有簡易的網路封包基礎,要看懂粉難吶! 所以,至少您得要回到網路基礎裡面去將 TCP 封包的表頭資料理解理解才好啊! ^_^!至於那個範例一所產生的輸出範例中,我們可以約略區分為數個欄位,
我們以範例一當中那個特殊字體行來說明一下:

01:33:40.41:這個是此封包被擷取的時間,『時:分:秒』的單位;
IP:透過的通訊協定是 IP ;
192.168.1.100.22 > :傳送端是 192.168.1.100 這個 IP,而傳送的 port number 為 22,您必須要瞭解的是,那個大於 (>) 的符號指的是封包的傳輸方向喔!
192.168.1.11.1190:接收端的 IP 是 192.168.1.11, 且該主機開啟 port 1190 來接收;
P 116:232(116):這個封包帶有 PUSH 的資料傳輸標誌, 且傳輸的資料為整體資料的 116~232 byte,所以這個封包帶有 116 bytes 的資料量;
ack 1 win 9648:ACK與 Window size 的相關資料。

最簡單的說法,就是該封包是由 192.168.1.100 傳到 192.168.1.11,透過的 port 是由 22 到 1190 , 且帶有 116 bytes 的資料量,使用的是 PUSH 的旗標,而不是 SYN 之類的主動連線標誌。 呵呵!不容易看的懂吧!所以說,上頭才講請務必到 TCP
表頭資料的部分去瞧一瞧的啊!

再來,一個網路狀態很忙的主機上面,你想要取得某部主機對你連線的封包資料而已時, 使用 tcpdump 配合管線命令與正規表示法也可以,不過,畢竟不好捉取! 我們可以透過 tcpdump 的表示法功能,就能夠輕易的將所需要的資料獨立的取出來。 在上面的範例一當中,我們僅針對 eth0 做監聽,所以整個 eth0 介面上面的資料都會被顯示到螢幕上, 不好分析啊!那麼我們可以簡化嗎?例如只取出 port 21 的連線封包,可以這樣做:

[root@linux ~]# tcpdump -i eth0 -nn port 21
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 1 win 65535
01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240: P 1:21(20) ack 1 win 5840
01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 21 win 65515
01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21: P 1:17(16) ack 21 win 65515
01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840
01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840

瞧!這樣就僅提出 port 21 的資訊而已,且仔細看的話,你會發現封包的傳遞都是雙向的, client 端發出『要求』而 server 端則予以『回應』,所以,當然是有去有回啊! 而我們也就可以經過這個封包的流向來瞭解到封包運作的過程。 舉例來說:

我們先在一個終端機視窗輸入『 tcpdump -i lo -nn 』 的監聽,
再另開一個終端機視窗來對本機 (127.0.0.1) 登入『ssh localhost』

那麼輸出的結果會是如何?

[root@linux ~]# tcpdump -i lo -nn
1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
3 11:02:54.253777 IP 127.0.0.1.32936 > 127.0.0.1.22: S 933696132:933696132(0)
win 32767 <mss 16396,sackOK,timestamp 236681316 0,nop,wscale 2>
4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0)
ack 933696133 win 32767 <mss 16396,sackOK,timestamp 236681316 236681316,nop,
wscale 2>
5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 <nop,
nop,timestamp 236681316 236681316>
6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: P 1:23(22) ack 1 win 8192
<nop,nop,timestamp 236681334 236681316>
7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192 <nop,
nop,timestamp 236681334 236681334>

上表顯示的頭兩行是 tcpdump 的基本說明,然後:

第 3 行顯示的是『來自 client 端,帶有 SYN 主動連線的封包』,
第 4 行顯示的是『來自 server 端,除了回應 client 端之外(ACK),還帶有 SYN 主動連線的標誌;
第 5 行則顯示 client 端回應 server 確定連線建立 (ACK)
第 6 行以後則開始進入資料傳輸的步驟。

從第 3-5 行的流程來看,熟不熟悉啊?沒錯!那就是 三向交握 的基礎流程啦!夠有趣吧! 不過 tcpdump 之所以被稱為駭客軟體之一可不止上頭介紹的功能吶! 上面介紹的功能可以用來作為我們主機的封包連線與傳輸的流程分析,
這將有助於我們瞭解到封包的運作,同時瞭解到主機的防火牆設定規則是否有需要修訂的地方。

更神奇的使用要來啦!如果我們使用 tcpdump 在 router 上面監聽『明碼』的傳輸資料時, 例如 FTP 傳輸協定,你覺得會發生什麼問題呢? 我們先在主機端下達『 tcpdump -i lo port 21 -nn -X 』然後再以 ftp 登入本機,並輸入帳號與密碼, 結果你就可以發現如下的狀況:

[root@linux ~]# tcpdump -i lo -nn -X 'port 21'
0x0000:  4500 0048 2a28 4000 4006 1286 7f00 0001  E..H*(@.@.......
0x0010:  7f00 0001 0015 80ab 8355 2149 835c d825  .........U!I./.%
0x0020:  8018 2000 fe3c 0000 0101 080a 0e2e 0b67  .....<.........g
0x0030:  0e2e 0b61 3232 3020 2876 7346 5450 6420  ...a220.(vsFTPd.
0x0040:  322e 302e 3129 0d0a                      2.0.1)..

0x0000:  4510 0041 d34b 4000 4006 6959 7f00 0001  E..A.K@.@.iY....
0x0010:  7f00 0001 80ab 0015 835c d825 8355 215d  ........./.%.U!]
0x0020:  8018 2000 fe35 0000 0101 080a 0e2e 1b37  .....5.........7
0x0030:  0e2e 0b67 5553 4552 2064 6d74 7361 690d  ...gUSER.dmtsai.
0x0040:  0a                                       .

0x0000:  4510 004a d34f 4000 4006 694c 7f00 0001  E..J.O@.@.iL....
0x0010:  7f00 0001 80ab 0015 835c d832 8355 217f  ........./.2.U!.
0x0020:  8018 2000 fe3e 0000 0101 080a 0e2e 3227  .....>........2'
0x0030:  0e2e 1b38 5041 5353 206d 7970 6173 7377  ...8PASS.mypassw
0x0040:  6f72 6469 7379 6f75 0d0a                 ordisyou..

上面的輸出結果已經被簡化過了,你必須要自行在你的輸出結果當中搜尋相關的字串才行。 從上面輸出結果的特殊字體中,我們可以發現『該 FTP 軟體使用的是 vsftpd ,並且使用者輸入 dmtsai 這個帳號名稱,且密碼是 mypasswordisyou』 嘿嘿!你說可不可怕啊!如果使用的是明碼的方式來傳輸你的網路資料? 所以我們才常常在講啊,網路是很不安全低!

另外你得瞭解,為了讓網路介面可以讓 tcpdump 監聽,所以執行 tcpdump 時網路介面會啟動在 『錯亂模式 (promiscuous)』,所以你會在 /var/log/messages 裡面看到很多的警告訊息, 通知你說你的網路卡被設定成為錯亂模式!別擔心,那是正常的。 至於更多的應用,請參考 man tcpdump 囉!

例題:如何使用 tcpdump 監聽 (1)來自 eth0 介面卡且 (2)通訊協定為 port 22 ,(3)目標來源為 192.168.1.100 的封包資料?

答:

tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'

ethereal

除了 tcpdump 這個軟體之外,其實你還可以使用 ethereal 這個好用的網路流量分析軟體吶! ethereal 分為文字介面與圖形介面,文字介面的用法與 tcpdump 相當的類似,不過他的指令名稱為 tethereal 就是了。因為用法差不多,所以建議您直接使用 man tethereal 查閱吧! 在 CentOS 上原本就有 ethereal 了,所以請拿出光碟來安裝即可喔! 需要安裝 ethereal 與 ethereal-gnome 才行吶!

啟動的方法很簡單,你必須要在 X Window 底下,先開啟一個終端機,然後直接輸入 ethereal 後, 就會出現如下的畫面了:



圖五、ethereal 使用範例圖

簡單的作法,你可以點選如上圖顯示的那個按鈕,會出現挑選監聽的介面視窗,如下所示:



圖六、ethereal 使用範例圖

你應該選擇要監聽的介面,在這裡因為是測試用的,所以鳥哥使用的是 lo 這個內部介面, 你當然應該要選擇你自己的網路介面才是。然後按下 start 後,就會出現開始偵測的畫面了:



圖七、ethereal 使用範例圖

在這個畫面當中你可以看到很多類型的封包協定,在等你處理完畢後,就可以按下『stop』結束監聽, 而開始進入如下的封包分析畫面。



圖八、ethereal 使用範例圖

封包分析畫面共分為三大區塊,如上圖所示,第一區塊主要顯示的是封包的標頭資料, 內容就有點類似 tcpdump 的顯示結果,第二區塊則是詳細的表頭資料, 包括訊框的內容、通訊協定的內容以及 socket pair 等等資訊。 第三區塊則是 16 進位與 ASCII 碼的顯示結果。透過這個 ethereal 您就可以一口氣得到所需要的所有封包內容啦! 而且還是圖形介面的,很方便吧!透過在第一區塊選擇不同的封包,就能夠查閱每個封包的資料內容囉!


nc,
netcat

這個 nc 可以用來作為某些服務的檢測,因為他可以連接到某個 port 來進行溝通, 此外,還可以自行啟動一個 port 來傾聽其他用戶的連線吶!非常的不錯用! 如果在編譯的時候給予『GAPING_SECURITY_HOLE』參數的話,嘿嘿! 這個軟體還可以用來取得用戶端的 bash 哩!可怕吧!我們的 CentOS 比較人性化,並沒有給予上面的參數,所以我們不能夠用來作為駭客軟體~ 但是用來取代 telnet 也是個很棒的功能了!(有的系統將執行檔改名為 netcat
啦!)

[root@linux ~]# nc [IP|host] [port]
[root@linux ~]# nc -l -p [port]
參數:
-l :作為監聽之用,亦即開啟一個 port 來監聽用戶的連線;
-p :開啟的這個 port number

範例一:連接本地端的 port 25 查閱相關訊息
[root@linux ~]# nc localhost 25
localhost.localdomain [127.0.0.1] 25 (smtp) open
220 pc.dm.tsai ESMTP Postfix
ehlo localhost
250-pc.dm.tsai
250-PIPELINING
250-SIZE 40000000
250-ETRN
quit
221 Bye

這個最簡單的功能與 telnet 幾乎一樣吧!可以去檢查某個服務啦!不過,更神奇的在後面, 我們可以建立兩個連線來傳訊喔!舉個例子來說,我們先在 client 端的地方啟動一個 port 來進行傾聽:

範例二:啟動一個 port 來監聽使用者的連線要求
[root@linux ~]# nc -l -p 20000
# 啟動一個 port 20000  在主機上,如果此時使用 netstat -tlnp
# 就可以看到系統上多出來一個 port 20000 在傾聽使用者的連線喔!

然後在主機端的地方,也利用 nc 來連線到用戶端,並且輸入一些指令看看喔!

[root@linux ~]# nc localhost 20000
<==這裡可以開始輸入字串了!

此時,在主機端我們可以打入一些字,你會發現在 client 端會同時出現你輸入的字眼吶! 如果你同時給予一些額外的參數,例如利用標準輸入與輸出 (stdout, stdin) 的話, 那麼就可以透過這個連線來作很多事情了! 當然 nc 的功能不只如此,你還可以發現很多的用途喔! 請自行到您主機內的 /usr/share/doc/nc-1.10/scripts 目錄下看看這些 script ,有幫助的吶! 不過,如果你需要額外的編譯出含有 GAPING_SECURITY_HOLE 功能, 以使兩端

#15:strace - 系统调用

追踪系统调用和型号,这对于调试Web服务器和其他服务器非常有用。了解怎样追踪进程和他功能

#16:/proc文件系统 - 各种内核信息

/proc目录下文件提供了很多不同硬件设备和内核的详细信息。更多详情参见Linux kernel /proc。一般/proc例如:

# cat /proc/cpuinfo

# cat /proc/meminfo

# cat /proc/zoneinfo

# cat /proc/mounts

#17:Nagios - 服务器及网络监控

Nagios 是一款非常流行的系统及网络监控软件。你可以轻松监控所有的主机、网络设备及服务。它能在发生故障和重新恢复后发送警讯。FAN是"Fully Automated Nagios"的缩写。FAN的目标就是由Nagios社群提供Nagios的安装。为了使安装Nagios服务器更加容易,FAN提供一个标准ISO格式的光盘镜像。此发行版中还会包含一组增强用户使用体验的工具。

#18:Cacti - 基于Web的监控工具

Cacti是一套完成的网络图形化解决方案,基于RRDTool的资料存储和图形化功能。Cacti提供一个快速的轮询器、进阶的图形化模板、多种数据采集方法和用户管理功能。这些功能都拥有非常友好易用的界面,确保可以部署在一个包含数百台设备的复杂网络中。它提供关于网络、CPU、内存、已登录用户、Apache、DNS等信息。关于怎样在CentOS / RHEL安装配置Cacti,详见:http://www.cyberciti.biz/faq/fedora-rhel-install-cacti-monitoring-rrd-software/

#19:KDE System Guard

KSysguard是在KDE桌面下一个网络化的系统监控工具。这个工具可以通过SSH会话运行。它提供很多功能,例如可以监控本机和远程主机的客户端/服务器架构,前端图形界面使用所谓传感器得到信息并展现出来。传感器返回的可以是一个简单的数值或是一组表格的信息。针对不同的信息类型,提供一个或多个显示。这些显示被组织多个工作表中,可以工作表可以独体储存和加载。所以,KSysguard不只是一个简单的任务管理器,还是一个可以控制多台服务器的强大工具。

图05:KDE System Guard

详细用法参见: the
KSysguard handbook

#20:Gnome System Monitor

System Monitor可以显示系统基本信息、监控系统进程、系统资源及文件系统使用率。你也可以使用System
Monitor监控和修改系统行为。尽管没有KDE System Guard功能强大,但其提供的基本信息对于入门用户还是非常有用的。

* 显示关于计算机硬件和软件的各种基本信息。

* Linux内核版本

* GNOME版本

* 硬件

* 安装的内存

* 处理器及其速度

* 系统状态

* 当前可用的硬盘空间

* 进程

* 内存及交换空间

* 网络使用率

* 文件系统

* 所有挂载的文件系统及其基本信息

图06:The Gnome System Monitor application

1.htop—— http://htop.sourceforge.net/

一个可以让用户与之交互的进程查看器。作为文本模式的应用程序,主要用于控制台或 X 终端中。当前具有按树状方式来查看进程,支持颜色主题,可以定制等特性。



2.dstat —— http://dag.wieers.com/home-made/dstat/

一个用来替换vmstat, iostat, netstat, nfsstat 和ifstat 这些命令的工具,是一个全能系统信息统计工具。



3.BMon——http://freshmeat.net/projects/bmon/

一个易于使用的软件,该软件可以帮助您监测蓝牙设备。



4.Iftop——http://www.ex-parrot.com/pdw/iftop/

主要用来显示本机网络流量情况及各相互通信的流量集合,如单独同那台机器间的流量大小,非常适合于代理服务器和iptables服务器使用



5.ifstat——http://gael.roualland.free.fr/ifstat/

一个非常不错的检测网络活动状态的软件



6.Sysstat——http://pagesperso-orange.fr/sebastien.godard/

包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据,比如CPU使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有利于我们判断系统是否正常运行,是提高系统运行效率、安全运行服务器的得力助手。



网站的很多性能问题最终都会归结到IO头上,所以说理解iostat命令是非常有必要的。

小技巧:你知道iostat是从哪里得到IO相关信息的吗?使用strace命令能跟踪到答案:

shell> strace -eopen iostat
open("/proc/diskstats", O_RDONLY)

注:Strace教程:5 simple ways to troubleshoot using Strace

注:关于diskstats的说明,参见官方文档(主要是其中的field1 ~ field11部分)。

如果你的操作系统里没有iostat命令的话,除了从源代码安装,还可以使用下面方式:

Centos/Fedora的安装方式是:yum install sysstat
Debian/Ubuntu的安装方式是:aptitude install sysstat

我最常用的iostat命令格式是:『iostat -dx 1』,意思是每隔一秒显示一次IO扩展信息。

shell> iostat -dx 1
Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s
sda               0.18    37.71  0.65  2.63    50.18   322.08
avgrq-sz avgqu-sz   await  svctm  %util
113.46     0.35  107.49   1.67   0.55

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s
sda               0.00  4208.00  0.00 165.00     0.00 163872.00
avgrq-sz avgqu-sz   await  svctm  %util
993.16   119.54 1144.36   6.07 100.10

注:开头显示的是自系统启动开始的平均值,后面显示的是每段时间间隔里的平均值。

介绍一下相关参数的含义:

rrqm/s:队列中每秒钟合并的读请求数量
wrqm/s:队列中每秒钟合并的写请求数量
r/s:每秒钟完成的读请求数量
w/s:每秒钟完成的写请求数量
rsec/s:每秒钟读取的扇区数量
wsec/s:每秒钟写入的扇区数量
avgrq-sz:平均请求扇区的大小
avgqu-sz:平均请求队列的长度
await:平均每次请求的等待时间
svctm:平均每次请求的服务时间
util:设备的利用率

注:建议对照源代码来记忆这些参数都是如何计算出来的。

关于这些参数,相对重要的是后面几个,具体来说是:util,svctm,await,avgqu-sz:

util是设备的利用率。如果它接近100%,通常说明设备能力趋于饱和(并不绝对)。有时候会出现大于100%的情况,这是因为读取数据的时候是非原子操作。

svctm是平均每次请求的服务时间。从源代码里可以看出:(r/s+w/s)*(svctm/1000)=util。举例子:如果util达到100%,那么此时svctm=1000/(r/s+w/s),假设IOPS是1000,那么svctm大概在1毫秒左右,如果长时间大于这个数值,说明系统出了问题。

await是平均每次请求的等待时间。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。

avgqu-sz是平均请求队列的长度。毫无疑问,队列长度越短越好。

说明:svctm参数在未来某个版本的iostat会被删除,官方文档是这样描述原因的:

The average service time (svctm field) value is meaningless, as I/O statistics are calculated at block level, and we don’t know when the disk driver starts to process a request. For this reason, this field will be removed in a future sysstat version.

另外,有时候iostat会显示一些很离谱的结果,官方FAQ给出了如下的解释:

Because of a Linux kernel bug, iostat -x may display huge I/O response times (svctm) and a bandwidth utilization (%util) of 100% for some devices. Indeed these devices have a value for the field #9 (beginning after the device name) in /proc/{partitions,diskstats}
which is always different from 0, and even negative sometimes. Yet this field should go to zero, since it gives the number of I/Os currently in progress (it is incremented as requests are submitted, and decremented as they finish). To (temporarily) solve the
problem, you should reboot your system to reset the counters in /proc/{partitions,diskstats}.

如果大家想要更系统的了解关于IO的相关知识,可以参考如下资料:

Getting the hang of IOPS
Basic I/O Monitoring on Linux
http://www.orczhou.com/index.php/2010/03/iostat-detail/


#1: top - 进程活动

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

1、内存

方法一:

直接查看 /proc/meminfo 文件

[root@yunwei2 ~]# cat /proc/meminfo

MemTotal: 4033580 kB

MemFree: 2261836 kB

Buffers: 198080 kB

Cached: 1129164 kB

SwapCached: 0 kB

Active: 683092 kB

Inactive: 930404 kB

HighTotal: 0 kB

HighFree: 0 kB

LowTotal: 4033580 kB

LowFree: 2261836 kB

SwapTotal: 6094840 kB

SwapFree: 6094840 kB

Dirty: 40 kB

Writeback: 0 kB

AnonPages: 286196 kB

Mapped: 33416 kB

Slab: 118932 kB

PageTables: 8676 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

CommitLimit: 8111628 kB

Committed_AS: 525248 kB

VmallocTotal: 34359738367 kB

VmallocUsed: 266040 kB

VmallocChunk: 34359472139 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

Hugepagesize: 2048 kB

方法二:

使用 free -m 命令查看,如下:

free -m

total used free shared buffers cached

Mem: 3939 1725 2213 0 189 1102

-/+ buffers/cache: 433 3505

Swap: 5951 0 5951


total 内存总数:M

used 已经使用的内存数: M

free 空闲的内存数:M

shared 当前已经废弃不用的内存数,总是M

-buffers/cache反映的是被程序实实在在用掉的内存

buffers/cache反映的是可以使用用的内存总数,这里只剩余 M

方法三:

使用 top 命令也可以看到实时的内存使用情况。

2、

如何查看CPU类型以及相关特性?

方法一:

Linux下CPU相关的参数保存在 /proc/cpuinfo 文件里,

查看文件内容,即可知道CPU相关的技术参数。

方法二:

采用命令 dmesg | grep CPU 可以查看到相关CPU的启动信息

查看CPU的位数可以这样 getconf LONG_BIT,不是32位就是64位了:)

linux查看cpu个数命令

cat /proc/cpuinfo 我记得里面有

LINUX下查看CPU负载的所有命令

$

# vmstat

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 0 2260164 198756 1129164 0 0 2 1 4 21 0 0 100 0 0

procs 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。

b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。

cpu 表示cpu的使用状态us 列显示了用户方式下所花费 CPU 时间的百分比。

us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。

sy 列显示了内核进程所花费的cpu时间的百分比。

这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。 id 列显示了cpu处在空闲状态的时间百分比 system 显示采集间隔内发生的中断数in 列表示在某一时间间隔中观测到的每秒设备中断数。cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。memoryswpd
切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常 free 当前的空闲页面列表中内存数量(k表示) buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。 cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。 swapsi 由内存进入内存交换区数量。so由内存交换区进入内存数量。
IObi 从块设备读入数据的总量(读磁盘)(每秒kb)。bo 块设备写入数据的总量(写磁盘)(每秒kb)这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。

1、如何查看CPU类型以及相关特性?

方法一:

Linux下CPU相关的参数保存在 /proc/cpuinfo 文件里,

查看文件内容,即可知道CPU相关的技术参数。

方法二:

采用命令 dmesg | grep CPU 可以查看到相关CPU的启动信息

查看CPU的位数可以这样 getconf LONG_BIT,不是32位就是64位了:)

2、如何查看内存大小以及使用情况?

方法一:

直接查看 /proc/meminfo 文件

方法二:

使用 free -m 命令查看,如下:

[root@miix proc]# free -m

total used free shared buffers cached

Mem: 748 738 9 0 121 304

-/+ buffers/cache: 313 435

Swap: 768 0 768

可以看到总内存为748M,使用了738M,空闲9M,交换空间768M还没使用。

其实我的物理内存是768M的,一些内存和显卡共享了。

方法三:

使用 top 命令也可以看到实时的内存使用情况。

3、如何查看硬盘型号以及相关参数?

方法一:

fdisk -l 可以看到系统上的磁盘(包括U盘)的分区以及大小相关信息。

方法二:

直接查看 /proc/partitions 文件。

方法三:

通过命令 hdparm -i /dev/hda 获取硬盘详细物理参数

4、如何查看网卡相关信息?

方法一:

ethtool eth0 采用此命令可以查看到网卡相关的技术指标

(本人测试过不一定所有网卡都支持此命令)

ethtool -i eth1 加上 -i 参数查看网卡驱动

可以尝试其它参数查看网卡相关技术参数

方法二:

也可以通过 dmesg | grep eth0 等看到网卡名字(厂家)等信息

通过查看 /etc/sysconfig/network-.s/ifcfg-eth0

可以看到当前的网卡配置包括IP、网关地址等信息。

当然也可以通过ifconfig命令查看。

5、如何查看USB设备相关信息?

方法一:

其实通过 fdisk -l 命令可以查看到接入的U盘信息,本人的U盘信息如下:

Disk /dev/sda: 2012 MB, 2012217344 bytes

16 heads, 32 sectors/track, 7676 cylinders

Units = cylinders of 512 * 512 = 262144 bytes

Device BootStartEndBlocksId System

/dev/sda1* 16 7676 1961024 b W95 FAT32

U盘的设备文件是 /dev/sda,2G大小,FAT32格式。

如果用户登陆的不是Linux图形界面,U盘不会自动挂载上来。

此时可以通过手工挂载(mount):

mount /dev/sda1 mount_point

以上命令将U盘挂载到当前目录的 mount_point 目录,注意挂的是 sda1 不是 sda。

卸载命令是 umount mount_point

Linux默认没有自带支持NTFS格式磁盘的驱动,但对FAT32支持良好,挂载的时候一般不需要 -t vfat 参数 。

如果支持ntfs,对ntfs格式的磁盘分区应使用 -t ntfs 参数。

如果出现乱码情况,可以考虑用 -o iocharset=字符集 参数。

可以通过 lsusb 命令查看 USB 设备信息哦:

[root@miix tmp]# lsusb

Bus 001 Device 001: ID 0000:0000

Bus 002 Device 001: ID 0000:0000

Bus 003 Device 001: ID 0000:0000

Bus 004 Device 002: ID 0951:1613 Kingston Technology

Bus 004 Device 001: ID 0000:0000

6、如何查看光盘相关信息?

方法一:

插入CD光碟后,在本人的RHEL5系统里,光碟文件是 /dev/cdrom,

因此只需 mount /dev/cdrom mount_point 即可。

[root@miix tmp]# mount /dev/cdrom mount_point

mount: block device /dev/cdrom is write-protected, mounting read-only

其实仔细看一下,光驱的设备文件是 hdc

[root@miix tmp]# ls -l /dev/cdrom*

lrwxrwxrwx 1 root root 3 01-08 08:54 /dev/cdrom -> hdc

lrwxrwxrwx 1 root root 3 01-08 08:54 /dev/cdrom-hdc -> hdc

因此我们也可以这样 mount /dev/hdc mount_point

如果光驱里没放入有效光盘,则报错:

[root@miix tmp]# mount /dev/hdc mount_point

mount: 找不到介质

7、如何挂载ISO文件?

方法:

mount -o loop *.iso mount_point

8、如何查看主板信息?

使用命令 lspci 即可
http://os.51cto.com/art/201003/187660.htm
测试机器的硬件信息:

查看CPU信息(型号)

# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

8 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz

(看到有8个逻辑CPU, 也知道了CPU型号)

# cat /proc/cpuinfo | grep physical | uniq -c

4 physical id : 0

4 physical id : 1

(说明实际上是两颗4核的CPU)

# getconf LONG_BIT

32

(说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)

# cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l

8

(结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit)

再完整看cpu详细信息, 不过大部分我们都不关心而已.

# dmidecode | grep 'Processor Information'

查看内 存信息

# cat /proc/meminfo

# uname -a

Linux euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux

(查看当前操作系统内核信息)

# cat /etc/issue | grep Linux

Red Hat Enterprise Linux AS release 4 (Nahant Update 5)

(查看当前操作系统发行版信息)

查看机器型号

# dmidecode | grep "Product Name"

查看网卡信息

# dmesg | grep -i eth

我们通过Linux查看内存free命令查看机器空闲内存时,会发现free的值很小。下面我们就来了解学习下Linux查看内存的命令和对这些命令的解释,这样大家更能够深刻理解我们的Linux查看内存命令

在Linux下查看内存我们一般用free命令:

[root@scs-2 tmp]# free

total used free shared buffers cached

Mem: 3266180 3250004 16176 0 110652 2668236

-/+ buffers/cache: 471116 2795064

Swap: 2048276 80160 1968116

下面是对Linux查看内存命令中这些数值的解释:

total:总计物理内存的大小。

used:已使用多大。

free:可用有多少。

Shared:多个进程共享的内存总额。

Buffers/cached:磁盘缓存的大小。

第三行(-/+ buffers/cached):

used:已使用多大。

free:可用有多少。

第四行就不多解释了。

区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是16176KB,已用内存是3250004KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.

第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。

所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。

如上例:

2795064=16176+110652+2668236

接下来解释什么时候内存会被交换,以及按什么方交换。 当可用内存少于额定值的时候,就会开会进行交换。

Linux查看内存命令时如何看额定值:

cat /proc/meminfo

[root@scs-2 tmp]# cat /proc/meminfo

MemTotal: 3266180 kB

MemFree: 17456 kB

Buffers: 111328 kB

Cached: 2664024 kB

SwapCached: 0 kB

Active: 467236 kB

Inactive: 2644928 kB

HighTotal: 0 kB

HighFree: 0 kB

LowTotal: 3266180 kB

LowFree: 17456 kB

SwapTotal: 2048276 kB

SwapFree: 1968116 kB

Dirty: 8 kB

Writeback: 0 kB

Mapped: 345360 kB

Slab: 112344 kB

Committed_AS: 535292 kB

PageTables: 2340 kB

VmallocTotal: 536870911 kB

VmallocUsed: 272696 kB

VmallocChunk: 536598175 kB

HugePages_Total: 0

HugePages_Free: 0

Hugepagesize: 2048 kB

用free -m查看的结果:

[root@scs-2 tmp]# free -m

total used free shared buffers cached

Mem: 3189 3173 16 0 107 2605

-/+ buffers/cache: 460 2729

Swap: 2000 78 1921

查看/proc/kcore文件的大小(内存镜像):

[root@scs-2 tmp]# ll -h /proc/kcore

-r-------- 1 root root 4.1G Jun 12 12:04 /proc/kcore

备注:

占用内存的测量

测量一个进程占用了多少内存,linux为我们提供了一个很方便的方法,/proc目录为我们提供了所有的信息,实际上top等工具也通过这里来获取相应的信息。

/proc/meminfo 机器的内存使用信息

/proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。

/proc/pid/statm 进程所占用的内存

[root@localhost ~]# cat /proc/self/statm

654 57 44 0 0 334 0

Linux查看内存命令的输出解释

CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为:

参数 解释 /proc//status

Size (pages) 任务虚拟地址空间的大小 VmSize/4

Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4

Shared(pages) 共享页数 \

Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4

Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4

Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4

dt(pages) 04

查看机器可用内存

/proc/28248/>free

total used free shared buffers cached

Mem: 1023788 926400 97388 0 134668 503688

-/+ buffers/cache: 288044 735744

Swap: 1959920 89608 1870312

我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。

查看内存
所以 空闲内存=free+buffers+cached=total-used

显示每个插槽,及插槽中内存的信息

/usr/sbin/dmidecode | grep -A 16 "Memory Device"

查看简要内存信息

/usr/sbin/dmidecode | grep -A 16 "Memory Device" | grep -E "Size|Locator" | grep -v Bank

查看cpu

显示每个cpu的详细信息

/usr/sbin/dmidecode | grep -A55 'Processor Information'

显示cpu简要信息

/usr/sbin/dmidecode | grep -A55 'Processor Information' | grep -E "Socket|Version" 查看扩展卡

/usr/sbin/dmidecode | grep -A3 "On Board Device"

查看网卡速率

dmesg | grep ^eth

linux 查看网卡速度调整工作模式

相关搜索: Word

查看网卡速度有两个命令都可以查看:

mii-tool

eth0: negotiated 1000baseT-FD flow-control, link ok

复制代码
这表示,eth0网卡的速度为1000M,并且是全双工工作模式,也可以使用

ethtool eth0

Settings for eth0:

Supported ports: [ TP ]

Supported link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

1000baseT/Full

Supports auto-negotiation: Yes

Advertised link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

1000baseT/Full

Advertised auto-negotiation: Yes

Speed: 1000Mb/s

Duplex: Full

Port: Twisted Pair

PHYAD: 0

Transceiver: internal

Auto-negotiation: on

Supports Wake-on: umbg

Wake-on: g

Current message level: 0x00000007 (7)

Link detected: yes

复制代码
Speed 后边的数值就是速度,Duplex后边就是工作不是,full表示全双工,如果是half则表示半双工模式;Auto-negotiation 后边表示是否自动协商

那么如何调整网卡的速度以及工作模式?

修改linux网卡的工作模式:

ethtool –r ethX ## 重置ethX网口到自适应模式

ethtool –S ethX ## 查询ethX网口收发包统计

ethtool –s ethX [speed 10|100|1000] ## 设置网口速率10/100/1000M

[duplex half|full] ## 设置网口半/全双工

[autoneg on|off] ## 设置网口是否自协商

下面的命令会把eth0设置成全双工非自动协商工作模式,并且速度为100M

ethtool -s eth0 duplex full autoneg off speed 100

复制代码
设置网卡工作模式开机为全双工的方法:

一:

在/etc/sysconfig/network-script/ifcfg-ethX加入下面这句:

ETHTOOL_OPTS="speed 100 duplex full autoneg off"

二:

将上面的命令写入到/etc/rc.local里面。

ethtool -s eth0 duplex full autoneg off speed 100

关于Linux性能监控之Network篇

网络是所有子系统中最难监控的了。由于网络是抽象的,许多影响网络的因素并不在我们的控制范围之内。所以让我们在来了解Linux性能监控的Network的情况
AD:

大家都知道,影响网络的因素有很多这些因素包括,延迟、冲突、阻塞等等。 节下来让我们了解Linux性能监控之下Network的具体情况,并加上我们以前的几篇介绍,希望在关于Linux性能监控这方面对大家有更多的帮助。

大部分的以太网络都是自适应速度的,因为一个网络中可能有不同的网络设备采用不同的速率和工作模式(全双工或半双工)。大部分企业网络都工作在100到1000BaseTX。ethtool命令可以设置网卡的工作速率和模式。

# ethtool eth0

Settings for eth0:

Supported ports: [ TP MII ]

Supported link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

Supports auto-negotiation: Yes

Advertised link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

Advertised auto-negotiation: Yes

Speed: 10Mb/s

Duplex: Half

Port: MII

PHYAD: 32

Transceiver: internal

Auto-negotiation: on

Supports Wake-on: pumbg

Wake-on: d

Current message level: 0x00000007 (7)

Link detected: yes

Linux性能监控我们可以看到网卡工作在10Mb/s,模式为半双工,并且打开了自适应开关。我们通过下列命令强制设置网卡工作在100Mb/s全双工模式,并关闭自适应功能。

# ethtool -s eth0 speed 100 duplex full autoneg off

再次运行ethtool显示如下:

# ethtool eth0

Settings for eth0:

Supported ports: [ TP MII ]

Supported link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

Supports auto-negotiation: Yes

Advertised link modes: 10baseT/Half 10baseT/Full

100baseT/Half 100baseT/Full

Advertised auto-negotiation: No

Speed: 100Mb/s

Duplex: Full

Port: MII

PHYAD: 32

Transceiver: internal

Auto-negotiation: off

Supports Wake-on: pumbg

Wake-on: d

Current message level: 0x00000007 (7)

Link detected: yes

用iptraf工具可以清楚的看到每个网卡的工作情况。

# iptraf –d eth0




利用iptraf还可以监听固定TCP端口的流量,如对于Web服务器我们希望监听80端口的流量,对于邮件服务器我们关注25端口的流量。




网络中最常见的错误就是冲突,由于网络中目前基本采用交换机环境,因此冲突问题已被消除。但是当网络流量不断增大的时候,就会出现丢包,网卡过载等情况。在网络流量很大的时候我们用sar命令来给出网络中可能的错误:

# sar -n FULL 5 100

Linux 2.6.9-55.ELsmp (sapulpa) 06/23/2007

11:44:32 AM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s

11:44:37 AM lo 6.00 6.00 424.40 424.40 0.00 0.00 0.00

11:44:37 AM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00

11:44:37 AM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00

11:44:32 AM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s

11:44:37 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

11:44:37 AM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

11:44:37 AM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

11:44:32 AM totsck tcpsck udpsck rawsck ip-frag

11:44:37 AM 297 79 8 0 0

rxerr/s是接受错误率;txerr/s是发送错误率;coll/s冲突率;rxdrop/s接受帧丢失率;txdrop/s发送帧丢失率; txcarr/s载波错误率;rxfram/s帧排列错误;rxfifo/s接受FIFO错误;txfifo/s发送FIFO错误。从上面输出看出各种错 误为零,证明网络工作良好。

Linux性能监控总的来说监视网络性能,我们有遵循一下几点:

1. 检查所有网络接口确保他们都运行在正确的速率;

2. 检查每块网卡的吞吐量确保没有造成过载;

3. 检查流量的类型确保正确的数据流在传送。

关于Linux性能监控之io篇

关于Linux性能监控相信大家已经小有了解,对于IO篇,让我们先分析一些具体的情况,在这些情况下I/O会成为系统的瓶颈。我们会用到工具top,vmstat,iostat,sar等。每一个工具的输出都从不同的方面反映除系统的性能情况。

Linux性能监控情况1:同一时间进行大量的I/O操作

在这种情况时我们会发现CPU的wa时间百分比会上升,证明系统的idle时间大部分都是在等待I/O操作。

# vmstat 1

procs -----memory----- ---swap---io---- --system--cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

3 2 0 55452 9236 1739020 0 0 9352 0 2580 8771 20 24 0 57

2 3 0 53888 9232 1740836 0 0 14860 0 2642 8954 23 25 0 52

2 2 0 51856 9212 1742928 0 0 12688 0 2636 8487 23 25 0 52

从这个输出我们可以看到CPU有50%的时间都在等待I/O操作,我们还可以看到系统的bi值很大,证明系统有大量的I/O请求将磁盘内容读入内存。

没有很好的工具能看到到底是哪个进程在进行I/O读写。但我们可以通过top命令的输出来猜测

# top -d 1

top - 19:45:07 up 1:40, 3 users, load average: 6.36, 5.87, 4.40

Tasks: 119 total, 3 running, 116 sleeping, 0 stopped, 0 zombie

Cpu(s): 5.9% us, 87.1% sy, 0.0% ni, 0.0% id, 5.9% wa, 1.0% hi, 0.0% si

Mem: 2075672k total, 2022668k used, 53004k free, 7156k buffers

Swap: 2031608k total, 132k used, 2031476k free, 1709372k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ nFLT COMMAND

3069 root 5 -10 450m 303m 280m S 61.5 15.0 10:56.68 4562 vmware-vmx

3016 root 5 -10 447m 300m 280m S 21.8 14.8 12:22.83 3978 vmware-vmx

3494 root 5 -10 402m 255m 251m S 3.0 12.6 1:08.65 3829 vmware-vmx

3624 root 5 -10 401m 256m 251m S 1.0 12.6 0:29.92 3747 vmware-vmx

将top的输出通过faults进行排序。我们可以看到vmware产生最多的page faults。也就是说它进行了大量的IO操作。

Linux性能监控情况2:管道太小

任何I/O操作都需要一定的时间,而且这些时间对于硬盘来说是确定的,它包含磁盘旋转的延时RD(rotation delay)和磁头搜索时间DS(disk seek)。RD由磁盘转速(RPM)决定。RD是磁盘旋转一周所需时间的一半。如RPM为10000.

RPS=RPM/60=166

1/166=0.0006=6ms 磁盘旋转一周要6毫秒

RD=6ms/2=3ms

磁盘平均搜索时间是3ms,数据传输的平均延时是2ms,这样一次I/O操作的平均时间是:

3ms+3ms+2ms=8ms

IOPS=1000/8=125 这块磁盘的每秒IO数(IOPS)为125。所以对于10000RPM的磁盘来说它所能承受的IO操作在IOPS在120~150之间。如果系统的I/O请求超过这个值,就会使磁盘成为系统的瓶颈。

对与系统而言有两种不同种类的I/O压力,连续I/O和随机I/O。

连续I/O常常出现在企业级数据库这样的应用中,需要连续的读取大量数据。这种系统的性能依靠它读取和移动数据的大小和快慢。我们用iostat来监控,会发现rKB/s,wKB/s会很高。

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/sda 0.00 12891.43 0.00 105.71 0.00 106080.00 0.00 53040.00 1003.46 1099.43 3442.43 26.49 280.00

从输出我们看到w/s=105,wKB/s=53040.所以53040/105=505KB per I/O.

对于随机I/O的系统来说性能的关注点不在搜传输数据的大小和速度,而是在磁盘的IOPS。这类系统的I/O请求比较小但是数量很大,如Web服务器和Mail服务器。他们的性能主要依赖每秒钟可处理的请求数:

# iostat -x 1

avg-cpu: %user %nice %sys %idle

2.04 0.00 97.96 0.00

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/sda 0.00 633.67 3.06 102.31 24.49 5281.63 12.24 2640.82 288.89 73.67 113.89 27.22 50.00

从输出我们看到w/s=102,wKB/s=2640.所以2640/102=23KB per I/O.因此对于连续I/O系统来说我们要关注系统读取大量数据的能力即KB per request.对于随机I/O系统我们注重IOPS值.

关于Linux性能监控之Memory篇

我们首先了解虚拟内存和物理内存:虚拟内存就是采用硬盘来对物理内存进行扩展,将暂时不用的内存页写到硬盘上而腾出更多的物理内存让有需要的进程来用。当这些内存页需pi要用的时候在从 硬盘读回内存。这一切对于用户来说是透明的。通常在Linux系统说,虚拟内存就是swap分区。在X86系统上虚拟内存被分为大小为4K的页。

Memory篇

Linux性能监控每一个进程启动时都会向系统申请虚拟内存(VSZ),内核同意或者拒就请求。当程序真正用到内存时,系统就它映射到物理内存。RSS表示程序所占的物理内存的大小。用ps命令我们可以看到进程占用的VSZ和RSS。

# ps –aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

daemon 2177 0.0 0.2 3352 648 ? Ss 23:03 0:00 /usr/sbin/atd

dbus 2196 0.0 0.5 13180 1320 ? Ssl 23:03 0:00 dbus-daemon-1 --sys

root 2210 0.0 0.4 2740 1044 ? Ss 23:03 0:00 cups-config-daemon

root 2221 0.3 1.5 6108 4036 ? Ss 23:03 0:02 hald

root 2231 0.0 0.1 2464 408 tty1 Ss+ 23:03 0:00 /sbin/mingetty tty1

内核会定期将内存中的数据同步到硬盘,这个过程叫做Memory Paging。同时内核也要负责回收不用的内存,将他们分给其他需要的进程。PFRA算法(Page Frame reclaim algorithm)负责回收空闲的内存。算法根据内存页的类型来决定要释放的内存页。有下列4种类型:

1. Unreclaimable – 锁定的,内核保留的页面;

2. Swappable – 匿名的内存页;

3. Syncable – 通过硬盘文件备份的内存页;

4. Discardable – 静态页和被丢弃的页。

除了第一种(Unreclaimable)之外其余的都可以被PFRA进行回收。与之相关的进程是kswapd。在kswapd中,有2个阀值, pages_hige和pages_low。当空闲内存页的数量低于pages_low的时候,kswapd进程就会扫描内存并且每次释放出32个 free pages,直到free page的数量到达pages_high。具体kswapd是如何回收内存的呢?有如下原则:

1. 如果页未经更改就将该页放入空闲队列;

2. 如果页已经更改并且是可备份回文件系统的,就理解将内存页的内容写回磁盘;

3. 如果页已经更改但是没有任何磁盘上的备份,就将其写入swap分区。

# ps -ef | grep kswapd

root 30 1 0 23:01 ? 00:00:00 [kswapd0]

Linux性能监控在回收内存过程中还有两个重要的方法,一是LMR(Low on memory reclaiming),另一个是OMK(Out of Memory Killer)。当分配内存失败的时候LMR将会其作用,失败的原因是kswapd不能提供足够的空闲内存,这个时候LMR会每次释放1024个垃圾页知 道内存分配成功。当LMR不能快速释放内存的时候,OMK就开始其作用,OMK会采用一个选择算法来决定杀死某些进程。当选定进程时,就会发送信号 SIGKILL,这就会使内存立即被释放。OMK选择进程的方法如下:

1. 进程占用大量的内存;

2. 进程只会损失少量工作;

3. 进程具有低的静态优先级;

4. 进程不属于root用户。

Linux性能监控进程管理中另一个程序pdflush用于将内存中的内容和文件系统进行同步,比如说,当一个文件在内存中进行修改,pdflush负责将它写回硬盘。

# ps -ef | grep pdflush

root 28 3 0 23:01 ? 00:00:00 [pdflush]

root 29 3 0 23:01 ? 00:00:00 [pdflush]

每当内存中的垃圾页(dirty page)超过10%的时候,pdflush就会将这些页面备份回硬盘。这个比率是可以调节的,通过参数vm.dirty_background_ratio。

# sysctl -n vm.dirty_background_ratio

Pdflush同PFRA是独立运行的,当内核调用LMR时,LMR就触发pdflush将垃圾页写回硬盘

关于Linux性能监控之CPU篇详解

正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控CPU的性能就是以上3点,运行队列、CPU使用率和上下文切换。以下是一些对于Linux性能监控CPU很普遍的性能要求:

Linux性能监控CPU篇

1. 对于每一个CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6;

2. 如果CPU在满负荷运行,应该符合下列分布,

a) User Time:65%~70%

b) System Time:30%~35%

c) Idle:0%~5%

3. 对于上下文切换要结合CPU使用率来看,如果CPU使用满足上述分布,大量的上下文切换也是可以接受的。

常用的监视工具有,vmstat, top,dstat和mpstat.

# vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

0 0 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0

0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0

0 0 104300 16800 95328 72200 0 0 0 0 1009 59 1 1 98 0

r表示运行队列的大小,

b表示由于IO等待而block的线程数量,

in表示中断的数量,

cs表示上下文切换的数量,

us表示用户CPU时间,

sys表示系统CPU时间,

wa表示由于IO等待而是CPU处于idle状态的时间,

id表示CPU处于idle状态的总时间。

dstat可以给出每一个设备产生的中断数:

# dstat -cip 1

----total-cpu-usage---- ----interrupts--- ---procs---

usr sys idl wai hiq siq| 15 169 185 |run blk new

6 1 91 2 0 0| 12 0 13 | 0 0 0

1 0 99 0 0 0| 0 0 6 | 0 0 0

0 0 100 0 0 0| 18 0 2 | 0 0 0

0 0 100 0 0 0| 0 0 3 | 0 0 0

我们可以看到这里有3个设备号15,169和185.设备名和设备号的关系我们可以参考文件/proc/interrupts, 这里185代表网卡eth1.

# cat /proc/interrupts

CPU0

0: 1277238713 IO-APIC-edge timer

6: 5 IO-APIC-edge floppy

7: 0 IO-APIC-edge parport0

8: 1 IO-APIC-edge rtc

9: 1 IO-APIC-level acpi

14: 6011913 IO-APIC-edge ide0

15: 15761438 IO-APIC-edge ide1

169: 26 IO-APIC-level Intel 82801BA-ICH2

185: 16785489 IO-APIC-level eth1

193: 0 IO-APIC-level uhci_hcd:usb1

mpstat可以显示每个CPU的运行状况,比如系统有4个CPU。我们可以看到:

# mpstat –P ALL 1

Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006

05:17:31 PM CPU %user %nice %system %idle intr/s

05:17:32 PM all 0.00 0.00 3.19 96.53 13.27

05:17:32 PM 0 0.00 0.00 0.00 100.00 0.00

05:17:32 PM 1 1.12 0.00 12.73 86.15 13.27

05:17:32 PM 2 0.00 0.00 0.00 100.00 0.00

05:17:32 PM 3 0.00 0.00 0.00 100.00 0.00

总结的说,Linux性能监控包含以下方面:

检查系统的运行队列,确保每一个CPU的运行队列不大于3.确保CPU使用分布满足70/30原则(用户70%,系统30%)。如果系统时间过长,可能是因为频繁的调度和改变优先级。CPU Bound进程总是会被惩罚(降低优先级)而IO Bound进程总会被奖励(提高优先级)。

网络是所有子系统中最难监控的了。首先是由于网络是抽象的,更重要的是许多影响网络的因素并不在我们的控制范围之内。Linux性能监控之绪论篇性能调优的目的是找到系统的瓶颈,并且调节系统来设法消除这些瓶颈。

我们在Linux性能监控的时候重点在于监视一下子系统:

1.CPU

2.Memory

3.IO

4.Network

但这些系统都是彼此依赖,不能单独只看其中一个.当一个系统负载过重时往往会引起其它子系统的问题,比如说:

->大量的读入内存的IO请求(page-in IO)会用完内存队列;

->大量的网络流量会造成CPU的过载;

->CPU的高使用率可能正在处理空闲内存队列;

->大量的磁盘读写会消耗CPU和IO资源.

我们测试的系统,总的来说可分为二类:

第一, IO Bound, 这类系统会大量消耗内存和底层的存储系统,它并不消耗过多的CPU和网络资源(除非系统是网络的).IO bound系统消耗CPU资源用来接受IO请求,然后会进入休眠状态.数据库通常被认为是IO bound系统.

第二, CPU Bound,这类系统需要消耗大量的CPU资源.他们往往进行大量的数学计算. 高吞吐量的Web server, Mail Server通常被认为是CPU Bound系统.

在性能测试中首先要做的是建立基线(Baseline),这样后续的调整才会有一个参考标准.值得注意的是,在测试基线的时候,一定要保证系统工作在正常的状态下.

Linux性能监控的常用工具有:

Tool Description

Base Repository

vmstat all purpose performance tool

yes yes

mpstat provides statistics per CPU

no yes

sar all purpose performance monitoring tool

no yes

iostat provides disk statistics

no yes

netstat provides network statistics

yes yes

dstat monitoring statistics aggregator

no in most distributions

iptraf traffic monitoring dashboard

no yes

ethtool reports on Ethernet interface configuration

yes yes

这些工具在Linux的安装过程中都可以选择进行安装。

下面是一个vmstat产生的baseline的例子:

# vmstat 1

procs memory swap io system cpu

r b swpd free buff cache si so bi bo in cs us sy wa id

1 0 138592 17932 126272 214244 0 0 1 18 109 19 2 1 1 96

0 0 138592 17932 126272 214244 0 0 0 0 105 46 0 1 0 99

0 0 138592 17932 126272 214244 0 0 0 0 198 62 40 14 0 45

0 0 138592 17932 126272 214244 0 0 0 0 117 49 0 0 0 100

0 0 138592 17924 126272 214244 0 0 0 176 220 938 3 4 13 80

0 0 138592 17924 126272 214244 0 0 0 0 358 1522 8 17 0 75

1 0 138592 17924 126272 214244 0 0 0 0 368 1447 4 24 0 72

0 0 138592 17924 126272 214244 0 0 0 0 352 1277 9 12 0 79

# vmstat 1

procs memory swap io system cpu

r b swpd free buff cache si so bi bo in cs us sy wa id

2 0 145940 17752 118600 215592 0 1 1 18 109 19 2 1 1 96

2 0 145940 15856 118604 215652 0 0 0 468 789 108 86 14 0 0

3 0 146208 13884 118600 214640 0 360 0 360 498 71 91 9 0 0

2 0 146388 13764 118600 213788 0 340 0 340 672 41 87 13 0 0

2 0 147092 13788 118600 212452 0 740 0 1324 620 61 92 8 0 0

2 0 147360 13848 118600 211580 0 720 0 720 690 41 96 4 0 0

2 0 147912 13744 118192 210592 0 720 0 720 605 44 95 5 0 0

2 0 148452 13900 118192 209260 0 372 0 372 639 45 81 19 0 0

2 0 149132 13692 117824 208412 0 372 0 372 457 47 90 10 0 0

由于做linux经常会要做Linux流量监控,上面的三个方式能很佳的系决以后流量查看.注:人以为nload很立,没有准.装置办法,请查人的另一个白章,linux的rpm高等治理.

Linux流量监控iftop工具

用处: 用来立即监望网道状况战各ip所应用的频阔

履行(必需以root身份)

监控eth1的网卡的淌质

# iftop -i eth1

以位元组(bytes)为双位显示流量(预设非位元bits):

$ iftop -B

间接显示IP, 没有入止DNS正系:

$ iftop -n

间接显示衔接埠编号, 没有隐示效劳称号:

$ iftop -N

隐示某个网段入出启包淌质

$ iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0

其他参数否上 iftop -h 瞅阐明.

入进iftop绘里时, 否按 p 切换非可显示连交埠, n 切换隐示IP或者从机的domain name,ghd MK4 IV Pure, N切换显示衔接埠代号或者称号, p久停显示, b切换能否显示少条, B切换盘算几秒外的均匀淌质, 其他按键能够按h观望阐明.

Linux流量监控nload

用处: 用来立即监望网道状况战各ip所应用的频阔(很空话了)

nload默许的是eth0网卡,假如你念监测eth1网卡的流量

#nload eth1

nload默许合为高低两块:下半部门是:Incoming也便非进进网卡的流量,上半局部是:Outgoing,也便是自那块网卡进来的流量,每 局部皆无以后流量(Curr),仄均流量(Avg),最大流量(Min),最小流量(Max),分战流量(Ttl)那几个部门,看止来仍是蛮曲观的。

另外,您也可以本人订义流量数值显示的双位

#nload --help

便能够瞅到详细的相干参数了。

查瞅网络均匀流量

上面的足原否以很佳的监控您的网络的均匀流量,您能够降订时光

#!/bin/bash
echo -n "which nic?"
read eth
echo "the nic is "$eth
echo -n "how much seconds:"
read sec
echo "duration is "$sec" seconds, wait please..."
infirst=$(awk '/'$eth'/{print $1 }' /proc/net/dev |sed 's/'$eth'://')
outfirst=$(awk '/'$eth'/{print $10 }' /proc/net/dev)
sumfirst=$(($infirst+$outfirst))
sleep $sec"s"
inend=$(awk '/'$eth'/{print $1 }' /proc/net/dev |sed 's/'$eth'://')
outend=$(awk '/'$eth'/{print $10 }' /proc/net/dev)
sumend=$(($inend+$outend))
sum=$(($sumend-$sumfirst))
echo $sec" seconds total :"$sum"bytes"
aver=$(($sum/$sec))
echo "avrage :"$aver"bytes/sec"

参考文献:

Linux man iostat
How Linux iostat computes its results
Linux iostat

http://blog.chinaunix.net/u3/93062/showart_1934431.html

原文:http://www.cyberciti.biz/tips/top-linux-monitoring-tools.html

翻译:飞哥 (http://hi.baidu.com/imlidapeng)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: