Chinaunix首页 | 论坛 | 博客
  • 博客访问: 701385
  • 博文数量: 108
  • 博客积分: 3236
  • 博客等级: 中校
  • 技术积分: 906
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-04 21:23
文章分类

全部博文(108)

文章存档

2011年(33)

2010年(75)

我的朋友

分类: LINUX

2010-12-21 18:04:53

vmstat 命令的用法说明

用途

报告虚拟内存统计信息。

语法

vmstat [ ] [ ] [ ] [ ] [ ] [ ] [ PhysicalVolume ... ] [ Interval [ Count ] ]

描述

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

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

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

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

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)、vmstatwa)和 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 系统时间。
id CPU 空闲时间。
wa CPU 空闲时间,在此期间系统有未完成的磁盘/NFS I/O 请求。请参阅上面的详细描述。

磁盘:每秒向指定物理卷提供的传送数目,该过程在采样间隔中发生。PhysicalVolume 参数可以用于指定一到四个名称。每个指定驱动器的传送统计信息按指定顺序给出。该计数代表向物理设备的请求数。它并不暗示读取或写入的数据量。几个逻辑请求可以组合成为一个物理请求。

如果指定一个 -I 标志,I/O 定向视图将会出现以下栏目变化。

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

标志

注:
如果在命令行中输入了 -f(或 -s)标志,系统将仅接受 -f(或 -s)标志,将忽略其它标志。如果同时指定了 -f-s 标志,系统将仅接受第一个标志,忽略第二个标志。
-f 报告从系统启动后的派生数目。
-i 显示从系统启动后每个设备造成的中断数目。
-I 用新的输出栏显示 I/O 定向视图,p 在标题 kthr 下;栏 fifo 在标题页面下,而不是栏下;recy 在页标题中。
-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 请求的固定内存缓冲区。

示例

  1. 要显示引导后的统计信息摘要,请输入:
    vmstat
  2. 要显示 2 秒时间间隔的 5 个摘要,请输入:
    vmstat 2 5

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

  3. 要显示引导后包括逻辑磁盘 scdisk13 和 scdisk14 的统计信息摘要,请输入:
    vmstat scdisk13 scdisk14
  4. 要显示派生统计信息,请输入:
    vmstat  
  5. 要显示各事件的计数,请输入:
    vmstat -s
  6. 要显示 vmstat的每一输出栏旁边的时间戳记,请输入:
    vmstat -t
  7. 要以另一套输出栏显示新的 I/O 定向视图,请输入:
    vmstat -I
  8. 要显示所有可用的 VMM 统计信息,请输入:
    vmstat -vs

文件

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


来源:




昨天说到使用vmstat查看FreeBSD的内存真实使用情况,其实vmstat在Ubuntu LInux系统下,也是一个非常不错的查看系统信息的命令,其显示的信息要比top命令全的多,而且可以同时看到cpu、内存、硬盘等不同的系统资源的使用情况!

  其实vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

  vmstat的语法如下:

  vmstat [-V] [-n] [delay [count]]

  其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看。

[root@localhost ~]# vmstat 2 2
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 323016   4160  18064    0    0    11     4 1004    27  0 10 89  0
0  0      0 323016   4160  18064    0    0     0     0   53     4  0 10 90  0

  下面给出了各个参数的不同含义:

procs:
r-->在运行队列中等待的进程数
b-->在等待io的进程数
w-->可以进入运行队列但被替换的进程

memoy
swap-->现时可用的交换内存(k表示)
free-->空闲的内存(k表示)
buff-->被用来做为缓存的内存数,单位:KB
cache-->被用来做为文件读写缓存的内存数,单位:KB

swap
si-->从磁盘交换到内存的交换页数量,单位:KB/秒
so-->从内存交换到磁盘的交换页数量,单位:KB/秒

IO
bi-->磁盘块入
bo-->磁盘块出

System
in-->每秒的中断数,包括时钟中断
cs-->每秒的环境(上下文)切换次数

CPU
按 CPU 的总使用百分比来显示
us-->用户进程使用的时间
sy-->系统进程使用的时间
id-->cpu空闲的时间

pages
re-->回收的页面
mf-->非严重错误的页面
pi-->进入页面数(k表示)
po-->出页面数(k表示)
fr-->空余的页面数(k表示)
de-->提前读入的页面中的未命中数
sr-->通过时钟算法扫描的页面

disk 显示每秒的磁盘操作。
s表示scsi盘,0表示盘号
fault 显示每秒的中断数
in-->设备中断
sy-->系统中断
cy-->cpu交换

  如果fre对于page列,re,pi,po,cy维持于比较稳定的状态,PI率不超过5,如果有pagin发生,那么关联页面必须先进行 pageout在内存相对紧张的环境下pagein会强制对不同的页面进行steal操作。如果系统正在读一个大批的永久页面,你也许可以看到po和pi 列会出现不一致的增长,这种情景并不一定表明系统负载过重,但是有必要对应用程序的数据访问模式进行见检查。在稳定的情况下,扫描率和重置率几乎相等,在 多个进程处理使用不同的页面的情况下,页面会更加不稳定和杂乱,这时扫描率可能会比重置率高出。

  faults列,in,sy,cs会不断跳跃,这里没有明确的限制,唯一的就是这些值最少大于100 cpu列,us,sys,id和wa也是不确定的,最理想的状态是使cpu处于100%工作状态,但这只适合单用户的情况下。

  如果在多用户环境中us+sys>80,进程就会在运行队列中花费等待时间,响应时间和吞吐量就会下降。wa>40表明磁盘io没有也许存在不合理的平衡,或者对磁盘操作比较频繁

  如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。

  如果pi,po 长期不等于0,表示内存不足。

  如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。



linux命令vmstat介绍


vmstat介绍
通过STATSPACK收集服务器信息,主要通过收集VMSTAT的信息来展现服务器状况。VMSTAT工具是最常见的UNIX监控工具,可以展现给定时间间隔的服务器的状态值。
一般VMSTAT工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。如:
[oracle@localhost oracle]$vmstat 2
procs ———–memory———- —swap– —–io—- –system– —-cpu—-
r b   swpd   free   buff cache   si   so    bi    bo   in    cs us sy id wa
0 0 195804   3812 40616 1598656    0    0     0     0 1024 66976 0 0 100 0
0 0 195804   3812 40616 1598656    0    0     0    12 1048 66961 0 0 100 0
0 0 195804   3812 40616 1598656    0    0     0    28 1054 67067 0 0 100 0
0 0 195804   3812 40616 1598656    0    0     0     0 1020 66988 0 0 100 0
(注:目前系统几乎空闲,并且不同操作系统VMSTAT输出内容有所不同)
目前说来,对于服务器监控有用处的度量主要有:
r(运行队列)

pi(页导入)

us(用户CPU)

sy(系统CPU)

id(空闲)
(如果r经常大于4 ,且id经常少于40,表示cpu的负荷很重。)

(如果bi,bo 长期不等于0,表示内存不足)

通过VMSTAT识别CPU瓶颈
r(运行队列)展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了

获得CPU个数的命令(LINUX环境):
cat /proc/cpuinfo|grep processor|wc -l
当r值超过了CPU个数,就会出现CPU瓶颈,解决办法大体几种:
1. 最简单的就是增加CPU个数
2. 通过调整任务执行时间,如大任务放到系统不繁忙的情况下进行执行,进尔平衡系统任务
3. 调整已有任务的优先级

通过VMSTAT识别CPU满负荷
首先需要声明一点的是,vmstat中CPU的度量是百分比的。当us+sy的值接近100的时候,表示CPU正在接近满负荷工作。但要注意的是,CPU 满负荷工作并不能说明什么,UNIX总是试图要CPU尽可能的繁忙,使得任务的吞吐量最大化。唯一能够确定CPU瓶颈的还是r(运行队列)的值。

通过VMSTAT识别RAM瓶颈
数据库服务器都只有有限的RAM,出现内存争用现象是Oracle的常见问题。
首先察看RAM的数量,命令如下(LINUX环境):
[oracle@oracle-db02 ~]$ free
             total       used       free     shared    buffers     cached
Mem:       2074924    2071112       3812          0      40616    1598656
-/+ buffers/cache:     431840    1643084
Swap:      3068404     195804    2872600

当然可以使用top等其他命令来显示RAM。
当内存的需求大于RAM的数量,服务器启动了虚拟内存机制,通过虚拟内存,可以将RAM段移到SWAP DISK的特殊磁盘段上,这样会 出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会对内存段进行页导出,但页导入操作就表明了服务器需要更多的内存了, 页导入需要从SWAP DISK上将内存段复制回RAM,导致服务器速度变慢。

解决的办法有几种:
1. 最简单的,加大RAM
2. 改小SGA,使得对RAM需求减少
3. 减少RAM的需求(如:减少PGA)



关于vmstat,top,ps aux查看的cpu占用率不一致的问题

问题:
用vmstat,top,和ps aux三个命令查看进程对cpu的占用率,数值差异很大。

例:
用 vmstat 查看系统cpu空闲率, id是cpu的空闲率,可以看出,空闲率一直在73%以上
用 ps aux 统计两个compress进程的cpu占用率,长时间恒定在15.5%和28.9%
用 top统计两个compress进程的cpu占用率,可以看出是一个动态变化的过程
(命令执行结果后面有显示)

这三个命令查出的cpu利用率不统一
首先,ps aux中两个compress进程占用cpu 15.5%+28.9%>40%,再加上其它进程,为
何vmstat查看cpu空闲率id还能一直大于73%
其次,top命令显示的进程compress的cpu占用率和ps显示的数值差别很大,ps的
cpu占用率雷打不动,一直是恒定值,
top的比较动态, 难道ps aux显示的进程cpu占用率不可靠?
最后,这三个命令查出的cpu占用率相互之间均不统一,用哪一个更可靠?例如输入如下命令,粗体字是cpu占用率

$ 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 432 802660   28724 5747324 0 0 204 770 0     0   6   3 90   2
3   0 432 799196   28724 5747392 0 0     0 152 1455 681   2   2 96   0
0   0 432 802420   28724 5747460 0 0     0 480 1599   1892 10   8 82 0
0   0 432 802292   28724 5747664 0 0     0 440 1859   6179 14 13 73 0
2   0 432 797636   28724 5752084 0 0     0 240 1403   3419   8   7 85   0
1   0 432 798732   28724 5751268 0 0     0 448 1506   4608 10   8 81   0
2   0 432 797924   28724 5752084 0 0     0 192 1752   4332 11 10 79   0
0   0 432 802076   28724 5747936 0 0     0 280 1705   1527 14   6 79 0

$ps aux | grep compress
USER    PID %CPU %MEM VSZ   RSS TTY    STAT START TIME COMMAND
img    6569 15.5   0.2 36716 16540 ?    S Aug12 230:57 ./bin/compress 8014
img    6570 28.9   0.2 54592 22524 ?    S Aug12 430:28 ./bin/compress 8004  

$top | grep compress
PID USER    PR   NI   VIRT   RES   SHR S %CPU %MEM TIME+   COMMAND                                                      
6569 img    16 0 40956   20m 6632 R 10.7   0.3 231:10.12 compress                                                       
6570 img    16 0 54592   21m 2456 S 20.3   0.3 430:54.32 compress                                                       
6569 img    17 0 36740   16m 2456 S 10.3   0.2 231:10.43 compress                                                       
6570 img    16 0 54592   21m 2456 R 58.9   0.3 430:56.09 compress                                                       
6569 img    16 0 36716   16m 2456 R 53.9   0.2 231:12.05 compress                                                       
6570 img    16 0 58444   24m 4752 R 69.9   0.3 430:58.19 compress                                                       
6569 img    16 0 36716   16m 2456 S 60.2   0.2 231:13.86 compress                                                       
6570 img    16 0 54592   21m 2456 S 52.6   0.3 430:59.77 compress                                                       
6569 img    15 0 36716   16m 2456 S 45.3   0.2 231:15.22 compress                                                       

大概看了些源码,补充一下:
top,ps,vmstat都是根据系统的proc文件进行计算的,其中vmstat,top都使用了/proc/stat文件,而ps,top也使用了/proc/*/stat文件进行计算。

1.vmstat对于cpu idle的计算方式比较复杂,但是显示的为平均值,即使用cpu使用时间片的差值/时间间隔/cpu个数(为物理cpu数目*cpu核心数),其中时间间隔为vmstat后加的参数,如vmstat 10就为10s内的平均cpu 占用率;

2.ps计算的为每个进程的cpu占用时间,使用的为/proc/*/stat文件,其中*为进程号,计算方式为使用cpu总的时间片数/Hertz,目前确认为对于每个物理cpu的占用比率,因此在双核机器上显示的数值需要除以核心数2;

3.top使用的是/proc/stat计算上面显示的cpu占用,使用/proc/*/stat计算每个进程占用的时间。但是计算的方式有所不同,代码较为复杂,但是目前确认为默认显示为Irix模式,即为相对于单个cpu core的占用的时间,如双核机器需要将该数值除以2*2计算,通过 shift+i可以进行切换;

通过上述说明可以解释珺方发现的问题:
问题1:首先,ps aux中两个compress进程占用cpu 15.5%+28.9%>40%,再加上其它进程,为何vmstat查看cpu空闲率id还能一直大于73%
ps的cpu占用率需要除以双核cpu数目为2,因此实际占用为(15.5%+28.9% )/2=22.2% ,也就约等于100%-73%;

问题2:其次,top命令显示的进程compress的cpu占用率和ps显示的数值差别很大,ps的cpu占用率雷打不动,一直是恒定值,top的比较动态, 难道ps aux显示的进程cpu占用率不可靠?
ps和top相差的数值为2倍关系,因此显示的占用率相差很大,同时变化率也会较大;

问题3:最后,这三个命令查出的cpu占用率相互之间均不统一,用哪一个更可靠?例如输入如下命令,粗体字是cpu占用率
这三个命令的占用率是统一的,按照如下公式进行计算时数据是一致的:
vmstat 的100%-idle == ps的cpu占用/cpu核心数 == top的cpu占用/cpu核心数/物理cpu数目;





Linux下获取CPU利用率和内存使用(C语言)

在Linux中如果要监视一个进程的运行情况,如查看它的CPU使用效率和内存使用情况,就需要从系统的 /proc目录的读取一些系统信息。然后分析得到结果,特别是在嵌入式中的应用程序这个功能就很重要。本文中的代码是从top命令的源代码分析中获得,并 做了部分修改,在FC6+GCC4.1调试通过。从这个工程中我也获得一些感悟。
1. Linux系统很优雅,如果在Windows中做这个功能就需要调用ActiveX控件。而在Linux中只需要读取文本。
2.想完成什么功能,如果不知道怎么做,就想有没有没有其它的软件有这个功能,如果有,查看它的源代码就可以了,然后定制自己需要的功能。
3.多想多看多做,学习技术的不二法门。

top命令源代码下载:
工程下载:
http://www.cppblog.com/Files/dyj057/mytop.zip
下面是获得系统CPU和内存情况的代码:

void
get_system_info(info)
    
struct  system_info  * info;
{
    
char  buffer[ 4096 + 1
];
    
int
 fd, len;
    
char   *
p;
    
int
 i;

    
/*  get load averages  */

    {
    fd 
=  open( " loadavg " , O_RDONLY);
    len 
=  read(fd, buffer,  sizeof (buffer) - 1
);
    close(fd);
    buffer[len] 
=   ' \0 '
;

    info
-> load_avg[ 0 =  strtod(buffer,  &
p);
    info
-> load_avg[ 1 =  strtod(p,  &
p);
    info
-> load_avg[ 2 =  strtod(p,  &
p);
    p 
=  skip_token(p);             /*  skip running/tasks  */

    p 
=  skip_ws(p);
    
if  ( *
p)
        info
-> last_pid  =
 atoi(p);
    
else

        info
-> last_pid  =   - 1 ;
    }

    
/*  get the cpu time info  */

    {
    fd 
=  open( " stat " , O_RDONLY);
    len 
=  read(fd, buffer,  sizeof (buffer) - 1
);
    close(fd);
    buffer[len] 
=   ' \0 '
;

    p 
=  skip_token(buffer);             /*  "cpu"  */

    cp_time[
0 =  strtoul(p,  & p,  0 );
    
    cp_time[
1 =  strtoul(p,  & p,  0
);
    cp_time[
2 =  strtoul(p,  & p,  0
);
    cp_time[
3 =  strtoul(p,  & p,  0
);

    
/*  convert cp_time counts to percentages  */

    percentages(
4 , cpu_states, cp_time, cp_old, cp_diff);
    }
    
    
/*  get system wide memory usage  */

    {
    
char   * p;

    fd 
=  open( " meminfo "
, O_RDONLY);
    len 
=  read(fd, buffer,  sizeof (buffer) - 1
);
    close(fd);
    buffer[len] 
=   ' \0 '
;

    
/*
 be prepared for extra columns to appear be seeking
       to ends of lines 
*/

    
    p 
=  buffer;
    p 
=
 skip_token(p);
    memory_stats[
0 =  strtoul(p,  & p,  10 );  /*  total memory  */

    
    p 
=  strchr(p,  ' \n ' );
    p 
=
 skip_token(p);
    memory_stats[
1 =  strtoul(p,  & p,  10 );  /*  free memory  */

    
    
    p 
=  strchr(p,  ' \n ' );
    p 
=
 skip_token(p);
    memory_stats[
2 =  strtoul(p,  & p,  10 );  /*  buffer memory  */

    
    p 
=  strchr(p,  ' \n ' );
    p 
=
 skip_token(p);
    memory_stats[
3 =  strtoul(p,  & p,  10 );  /*  cached memory  */

    
    
for (i  =   0 ; i <   8  ;i ++ ) {
        p
++
;
        p 
=  strchr(p,  ' \n '
);
    }
    
    p 
=
 skip_token(p);
    memory_stats[
4 =  strtoul(p,  & p,  10 );  /*  total swap  */

    
    p 
=  strchr(p,  ' \n ' );
    p 
=
 skip_token(p);
    memory_stats[
5 =  strtoul(p,  & p,  10 );  /*  free swap  */

    
    }

    
/*  set arrays and strings  */
    info
-> cpustates  =  cpu_states;
    info
-> memory  =
 memory_stats;
}

阅读(4527) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~