Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1599455
  • 博文数量: 92
  • 博客积分: 2002
  • 博客等级: 大尉
  • 技术积分: 4717
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-01 17:09
文章分类

全部博文(92)

文章存档

2013年(1)

2012年(6)

2011年(85)

分类: LINUX

2011-04-26 17:09:05


top命令通过读proc来显示进程信息

  1. [root]# cat /proc/stat
  2. cpu 432661 13295 86656 422145968 171474 233 5346
  3. cpu0 123075 2462 23494 105543694 16586 0 4615
  4. cpu1 111917 4124 23858 105503820 69697 123 371
  5. cpu2 103164 3554 21530 105521167 64032 106 334
  6. cpu3 94504 3153 17772 105577285 21158 4 24
  7. intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  8. ctxt 19067887
  9. btime 1139187531
  10. processes 270014
  11. procs_running 1
  12. procs_blocked 0

输出解释

CPU 以及CPU0、CPU1、CPU2、CPU3每行的每个参数意思(以第一行为例)为:
参数     解释
user (432661)
从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒

nice (13295)
从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)

system (86656)
从系统启动开始累计到当前时刻,核心时间(单位:jiffies)

idle (422145968)
从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)

iowait (171474)
从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,

irq (233)
从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)

softirq (5346)
从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

CPU时间=user+system+nice+idle+iowait+irq+softirq

“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。

“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。

“btime”给出了从系统启动到现在为止的时间,单位为秒。

“processes (total_forks) 自系统启动以来所创建的任务的个数目。

“procs_running”:当前运行队列的任务的数目。

“procs_blocked”:当前被阻塞的任务的数目。

top 单个进程显示的原理是计算top刷新时间内(默认是3秒)这个进程消耗的cpu时间占3*100*irix的百分比, 在top源代码里面100表示系统的时间片, 我怀疑这个地方可能有问题可能, 因为现在一般的PC时钟都是1000了, irix是1,  如果在top运行时按下shift+I则为2, 这时显示的CPU%会除以2, 之所以有
cclplus 占用CPU96.5%, 就是因为top从/proc/4517/stat每隔3秒读了一次, 然后根据这个值里面的[utime1+stime1-(utime2+stime2)]/(3*100)算出来的.就是说/proc/下面的进程信息提供 的信息不准确, 而top只根据自己的定义去/proc下面去数据来处理, top本身是没有问题的.

Toggle SMP view:
'1' single/separate states;
'I' Irix/Solaris mode
如果是4核,top打开I之后就简单地除以4

  1. top - 17:03:45 up 58 days, 4:01, 1 user, load average: 0.00, 0.02, 0.00
  2. Tasks: 172 total, 1 running, 171 sleeping, 0 stopped, 0 zombie
  3. Cpu(s): 0.2% us, 0.1% sy, 0.0% ni, 99.7% id, 0.0% wa, 0.0% hi, 0.0% si
  4. Mem: 4037036k total, 4007280k used, 29756k free, 93384k buffers

  5. Swap: 8385888k total, 71536k used, 8314352k free, 3068240k cached

  6. PID     USER   PR NI VIRT  RES  SHR S %CPU %MEM TIME+ COMMAND
  7. 27167   oracle 16 0  2011m 490m 483mS 1 12.4 0:46.93 oracle
  8. 27175   oracle 15 0  2011m 517m 510mS 1 13.1 0:49.78 oracle
  9. 5003    oracle 15 0  2021m 33m  29mS  0 0.9 3:56.10 oracle
  10. 1       root   16 0  4756  552  460S  0 0.0 0:09.31 init
  11. 2       root   RT 0  0     0    0S    0  0.0 0:00.47 migration/0
  12. ...............................

第一行(top):

top - 17:03:45 up 58 days,  4:01,  1 user,  load average: 0.00, 0.02, 0.00 
    “17:03:45”为系统当前时刻;
    “58 days,  4:01”为系统启动后到现在的运作时间;
    “1 user”为当前登录到系统的用户,更确切的说是登录到用户的终端数,即同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目;
    “load average”为当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、15分钟前进程的平均数,一般的可以认为这个数值超过CPU数目时,CPU将比较吃力的负载当前系统所包含的进程;

第二行(Tasks):
    “172 total”为当前系统进程总数;
    “1 running”为当前运行中的进程数;
    “171 sleeping”为当前处于等待状态中的进程数;
    “0 stoped”为被停止的系统进程数;
    “0 zombie”为僵死的进程数;

第三行(Cpus):  

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

显示CPU利用率的详细信息如果有多个CPU,屏幕将在每行显示一个CPU的信息。

我们一般用vmstat看到的都是四个状态:sy,us,id,wa,结合load average,基本可以知道cpu的状态
us -> User         表示CPU在运行用户的进程
sy -> system       表示CPU在执行kernel工作
ni -> nice         表示CPU花费在被nice改变过优先级的process上的时间

                    (注意:被nice命令改变优先级的process仅指那些nice值为负的 process.

                     花费在被nice命令改变优先级的任务上的时间也将被计算在系统和用户时间内,

                     因此整个时间加起来可能会超过百分之百)
id -> idle         表示CPU闲置并等待工作分配.
wa -> iowait       表示CPU等待IO操作完成的时间
hi -> H/w interrupt requests  硬件中断
si -> S/w interrupt requests  软件中断

 

第四行(Mem):
  
显示可用的和已利用的内存

 

第五行(Swap):
  表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。通常,交换分区(Swap)被频繁使用的情况,将被视作物理内存不足而造成的。(了解swap的用途就能够明白了因为swap分区是用来作实际物理内存交换用的。)

其余的显示内容以表格格式显示进程。下面对各列进行解释:

描述

PID            进程的进程ID

USER          运行该进程的用户

PRI           进程的优先级

NI            nice值:该值越高,任务的优先级越低

SIZE          该进程使用的内存(+数据+堆栈)

RSS           该进程使用的物理内存

SHARE         该进程使用的共享内存

STAT  该进程的状态,用代码显示。一些主要的状态代码包括:
R
— 正在运行
S
— 正在休眠
Z
— 迟滞
T
— 已停止

您还会看到第二个和第三个字符,它们表示:
W
— 已换出的进程
N
— 正nice

%CPU          该进程使用的CPU百分比

%MEM          该进程使用的内存百分比

TIME          该进程使用的总CPU时间

CPU           如果这是一个多处理器系统,该列指明正在其上运行进程的CPUID

COMMAND        该进程发出的命令

 

top运行中可以通过top的内部命令对进程的显示方式进行控制。内部命令如下:

  s -改变画面更新频率
  l -关闭或开启第一部分第一行top信息的表示
  t -关闭或开启第一部分第二行Tasks和第三行Cpus信息的表示
  m -关闭或开启第一部分第四行Mem和第五行Swap信息的表示
  N -PID的大小的顺序排列表示进程列表

    P -CPU占用率大小的顺序排列进程列表  

    M -以内存占用率大小的顺序排列进程列表
  h -显示帮助
  n -设置在进程列表所显示进程的数量
  q -退出top


---------------------------------------------------------------------------------------


[介绍一篇文章]

将两个%si高的项目监控结果如下:

----------------------------------------------------------------------
项目A,大压力下场景执行2分钟:

测试前:(未执行测试时,查询前端[服务器C]的数据)
context :11608691780
irq 0: 377348704 timer
irq 14: 41845647 ide0
irq 58:2557376548 0
irq233: 69455022 ioc0

问题环境:(接口配置在[服务器G]时,查询前端[服务器C]的数据)
context :11609397277          差值:705497
irq 0: 377651500 timer         差值:302796
irq 14: 41848329 ide0          差值:2682
irq 58:2557728212 0             差值:351664
irq233: 69457769 ioc0          差值:2747

正常环境:(接口配置在[服务器E]时,查询前端[服务器C]的数据)
context :11611152447          差值:1755170
irq 0: 378089297 timer         差值:437797
irq 14: 41852253 ide0          差值:3924
irq 58:2558490578 0             差值:762366
irq233: 69506181 ioc0         差值:48412

----------------------------------------------------------------------

项目B,大压力下场景执行2分钟:

测试前:(未执行测试时,[服务器E]的数据)
context :365586128
irq 0: 555887117 timer
irq 14:   4970216 ide0
irq 98:   6673200 0
irq233:   2963048 ioc0

正常环境:(数据库连接池设置为 localhost )
context :368023507              差值:2437379
irq 0: 556101285 timer         差值:214168
irq 14:   4972124 ide0          差值:1908
irq 98:   7013268 0               差值:340068
irq233:   2968985 ioc0         差值:5937

问题环境:(数据库连接池设置为本机的IP地址)
context :369679349              差值:1655842
irq 0: 556446790 timer         差值:345505
irq 14:   4975148 ide0            差值:3024
irq 98:   7298545 0                 差值:285277
irq233:   2974283 ioc0         差值:5298

----------------------------------------------------------------------

正常环境,指%si值在正常范围内波动。问题环境指%si异常,一般%si会达到70%~95%。差值是对应设备在测试过程中产生的中断数。
正常环境下的中断数比异常情况下的中断数更高。说明:
   计算机在单位有能力处理更多的中断数量,中断数量多并不代表%si高。
   进一步说明了:%si高代表CPU等待软中断完成的时间更高。
结合项目B的实际情况,将LAMP的Mysql连接方式置为永久连接(长连接),%si就不会高了:
1. 说明PHP在连接Mysql在使用localhost连接时不走网络,进程间切换就不废劲,CPU无需等待;
2. 而PHP在使用IP地址进行连接时,进程间切换比较耗费资源,导致CPU等待;
3. 进程间切换就会产生中断,则CPU等待切换就是CPU在等待软中断处理完成。

原文:http://space.itpub.net/10640532/viewspace-567348



阅读(3444) | 评论(0) | 转发(2) |
0

上一篇:EXPORT_SYMBOL

下一篇:内存屏障(Memory Barriers)

给主人留下些什么吧!~~