2007年4月17日星期二

内存整体性能监控工具

1.1 内存整体性能监控工具
1.1.1. /proc/zoneinfo
该文件提供物理内存有关zone的信息


Node 0, zone DMA
pages free 548
min 31
low 38
high 46
active 2056
inactive 275
scanned 0 (a: 2 i: 10)
spanned 4096
present 4096
protection: (0, 239, 239)
pagesets
cpu: 0 pcp: 0
count: 5
low: 2
high: 6
batch: 1
cpu: 0 pcp: 1
count: 1
low: 0
high: 2
batch: 1
all_unreclaimable: 0
prev_priority: 11
temp_priority: 11
start_pfn: 0
Node 0, zone Normal
pages free 1405
min 479
low 598
high 718
active 47819
inactive 7360
scanned 0 (a: 0 i: 0)
spanned 61424
present 61424
protection: (0, 0, 0)
pagesets
cpu: 0 pcp: 0
count: 103
low: 62
high: 186
batch: 31
cpu: 0 pcp: 1
count: 1
low: 0
high: 62
batch: 31
all_unreclaimable: 0
prev_priority: 11
temp_priority: 11
start_pfn: 4096


结果的解释如下:

参数
描述
Node 0, zone DMA
节点 0 的DMA区域
pages free 548
空闲的物理页数,可以被分配的物理页
min 31
low 38
high 46
每个zone有三个阈值,称为pages_low,pages_min和pages_high,用于跟踪该zone的物理内存压力。当内存压力达到一定值,就从用户态的地址空间或memory cache或disk cache回收页面,不能等到物理内存分配失败再回收页面,这是因为有些内核操作是不允许被阻塞,例如中断或异常处理调用请求内存分配。pages_min的页数是由内存初始化 free_area_init_core函数,根据该zone物理内存页的页数计算的。当物理内存页的页数减少到pages_min时,分配器将采用同步方式进行kswapd的工作;当空闲页的数目达到pages_low时,kswapd被buddy分配器唤醒,开始释放页;当达到 pages_high时,kswapd将被唤醒,此时kswapd不会考虑如何平衡该zone,直到有空闲页的个数达到pages_high为止。
active 2056
该区域的active物理页数
inactive 275
该区域的inactive物理页数
scanned 0 (a: 2 i: 10)
上次回收物理内存时,实际scan的物理页数
a:需要scan的active_list里的物理页的页数,
i:需要scan的inactive_list里的物理页的页数
spanned 4096
该zone的全部的物理页数,包含文件洞
present 4096
该zone的全部的物理页数,不包含文件洞
protection:(0, 239, 239)

从DMA或normal memory或high memory分配物理空间时,应至少给DMA zone 预留0或239或明或239页
Pagesets
DMA区域的物理页缓冲信息
cpu: 0 pcp: 0
CPU的ID, pcp=0:hot cache
count: 5
该cache有多少物理页
low: 2
当该cache的物理页小于该值时,则分配batch个物理页给该cache
high: 6
当该cache的物理页大于该值时,则从该cache回收batch个物理页
batch: 1
一次从该cache分配或回收的物理页的页数
cpu: 0 pcp: 1
CPU的ID, pcp=0:hot cache
count: 1
该cache有多少物理页
low: 0
当该cache的物理页小于该值时,则buddy分配器分配batch个物理页给该cache
high: 2
当该cache的物理页大于该值时,则从该cache回收batch个物理页
batch: 1
一次从该cache分配或回收的物理页的页数
all_unreclaimable: 0
是否该区域的全部物理页全是不可回收的,0:包含可以回收的物理页
prev_priority: 11
上次回收物理内存时,进行对该区域进行scan 操作的优先级
temp_priority: 11
表示该次回收物理内存,对该区域进行进行scan 操作的优先级
start_pfn: 0
该区域的第一个物理页的inde

Zone->lowmem_reserve是一组事先定义的数,预留物理页的页数,通过min_free_kbytes 和sysctl_lower_zone_protection来计算。


1.1.2. /proc/buddyinfo
为解决外碎块问题,在各个zone里将空闲的物理页分成11组,分别由1、2、4、8、16、32、64、128、256、512和1024连续的物理页组成。文件/proc/buddyinfo 包含了各个节点的各个区域的各种组可用的物理内存的详细信息。All page frames are grouped into 10 lists of blocks that contain
groups of 1, 2, 4, 8, 16, 32, 64, 128, 256, and 512 contiguous page
frames, respectively
• The address of the first page frame of a block is a multiple of the
group size, for example, a 16 frame block is a multiple of 16 × 212

[work@builder]# cat /proc/buddyinfo
Node 0, zone DMA 51 2 1 0 0 0 0 0 0 0 0
Node 0, zone Normal 178 76 63 0 2 2 0 1 0 0 0
Node 0, zone HighMem 218 157 83 38 230 820 1024 494 89 4 0


第二列表示节点号,上例说明只有一个节点。从第五列到第15列 分别表示大小为20*PAGE_SIZE、21*PAGE_SIZE、 ……、211*PAGE_SIZE 的内存块的数目。例如,第一行51表示在0节点的DMA区域里有51块大小为1页的物理块,第一行2表示在0节点的DMA区域里有2块大小为连续2页的物理块;第二行178表示在0节点的Normal区域里有178块大小为1页的物理块;第三行820表示在0节点的HighMem区域里有820块大小为连续6页的物理块。

1.1.3. /proc/meminfo
文件/proc/meminfo 包含了系统内存的详细信息,他显示了物理内存的数量,可交换空间的数量,空闲内存的数量等。需要命令如free、vmstat、iostat、top都是从该文件获得内存信息。

[root@localhost Documentation]# cat /proc/meminfo
MemTotal: 255280 kB
MemFree: 51524 kB
Buffers: 2888 kB
Cached: 49868 kB
SwapCached: 0 kB
Active: 182764 kB
Inactive: 5520 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 255280 kB
LowFree: 51524 kB
SwapTotal: 255992 kB
SwapFree: 255128 kB
Dirty: 312 kB
Writeback: 0 kB
Mapped: 180812 kB
Slab: 10944 kB
CommitLimit: 383632 kB
Committed_AS: 250612 kB
PageTables: 2392 kB
VmallocTotal: 770040 kB
VmallocUsed: 396 kB
VmallocChunk: 769520 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 4096 kB
[root@localhost Documentation]#



第一部分 参数
第二部分 解释
第三部分 MemTotal(kB)
第四部分 可以使用的物理内存,真正的物理内存减去(1)不可用的物理空间,(2)一部分预留给核心的二进制码和初始化了的数据结构的物理内存,包括文件洞(file hole)。
第五部分 MemFree(kB)
第六部分 等于LowFree+HighFree,这部分物理内存空间不属于任何进程或线程,等于所有zone的free_pages之和。
第七部分 Buffers(kB)
第八部分 Buffer pages,这部分空间不属于任何进程或线程。
第九部分 Cached(kB)
第一〇部分 除了buffer_pages 和swap cache的cache,这部分空间不属于任何进程或线程。
第一一部分 SwapCached (kB)
第一二部分 交换区页高速缓存,这部分空间不属于任何进程或线程。
第一三部分 Active(kB)
第一四部分 活跃的物理内存
第一五部分 Inactive(kB)
第一六部分 不活跃的物理内存
第一七部分 HighTotal(kB)
第一八部分 所有高端物理内存
第一九部分 HighFree(kB)
第二〇部分 所有未用的高端物理内存
第二一部分 LowTotal(kB)
第二二部分 所有低端物理内存
第二三部分 LowFree(kB)
第二四部分 所有未用的低端物理内存
第二五部分 SwapTotal(kB)
第二六部分 所有的交换区
第二七部分 SwapFree(kB)
第二八部分 所有未用的交换区
第二九部分 Dirty(kB)
第三〇部分 需要写回硬盘的物理内存数据
第三一部分 Writeback(kB)
第三二部分 正在写回硬盘的物理内存数据
第三三部分 Mapped(kB)
第三四部分 在相应的页表中存在表项目的物理页的数目
第三五部分 Slab(kB)
第三六部分 核心数据结构使用的物理内存空间
第三七部分 CommitLimit(kB)
第三八部分 系统可分配的最大地址空间(虚拟),(Memtotal-Hugepages_Total)*ratio+SwapTotal
第三九部分 Committed_AS(kB)
第四〇部分 一个进程目前可申请的最大的地址空间(虚拟)
第四一部分 PageTables(kB)
第四二部分 用于页表的物理页数
第四三部分 VmallocTotal(kB)
第四四部分 全部的vmalloc地址空间
第四五部分 VmallocUsed(kB)
第四六部分 已经使用的vmalloc空间
第四七部分 VmallocChunk(kB)
第四八部分 vmalloc空间里最大的连续的空闲空间
第四九部分 HugePages_Total(kB)
第五〇部分 全部大块物理内存页的数目
第五一部分 HugePages_Free(kB)
第五二部分 空闲的大块物理内存页的数目
第五三部分 Hugepagesize(kB)
第五四部分 每块大块物理内存页的大小

MemTotal=LowTotal+HighTotal
Active+InActive 包含那些用于用户态的地址空间和page cache的物理页,不包含核心栈,因此MemFree+Active+InActive < MemTotal 。

1.1.4. /proc/slabinfo
文件/proc/slabinfo 反映了系统中slab缓冲区里的内容。该文件分为两部分:
(1)给出了用于特定的对象的slab缓冲区的信息;
(2)第二部分报告固定大小的通用的slab缓冲区的信息。
范例:

[root@localhost Documentation]# cat /proc/slabinfo
slabinfo - version: 2.0
# name : tunables : slabdata
fat_inode_cache 0 0 484 8 1 : tunables 54 27 0 : slabdata 0 0 0
sgpool-128 32 32 2048 2 1 : tunables 24 12 0 : slabdata 16 16 0
sgpool-64 32 32 1024 4 1 : tunables 54 27 0 : slabdata 8 8 0
sgpool-32 32 32 512 8 1 : tunables 54 27 0 : slabdata 4 4 0
sgpool-16 32 45 256 15 1 : tunables 120 60 0 : slabdata 3 3 0
sgpool-8 32 62 128 31 1 : tunables 120 60 0 : slabdata 2 2 0
fib6_nodes 5 119 32 119 1 : tunables 120 60 0 : slabdata 1 1 0
ip6_dst_cache 4 18 224 18 1 : tunables 120 60 0 : slabdata 1 1 0
ndisc_cache 1 20 192 20 1 : tunables 120 60 0 : slabdata 1 1 0
rawv6_sock 3 5 768 5 1 : tunables 54 27 0 : slabdata 1 1 0



size-1024 155 160 1024 4 1 : tunables 54 27 0 : slabdata 40 40 0
size-512(DMA) 0 0 512 8 1 : tunables 54 27 0 : slabdata 0 0 0
size-512 198 496 512 8 1 : tunables 54 27 0 : slabdata 62 62 0
size-256(DMA) 0 0 256 15 1 : tunables 120 60 0 : slabdata 0 0 0
size-256 184 405 256 15 1 : tunables 120 60 0 : slabdata 27 27 0
size-128(DMA) 0 0 128 31 1 : tunables 120 60 0 : slabdata 0 0 0
size-128 4241 4247 128 31 1 : tunables 120 60 0 : slabdata 137 137 0
size-64(DMA) 0 0 64 61 1 : tunables 120 60 0 : slabdata 0 0 0
size-64 4210 4270 64 61 1 : tunables 120 60 0 : slabdata 70 70 0
size-32(DMA) 0 0 32 119 1 : tunables 120 60 0 : slabdata 0 0 0
size-32 2142 2261 32 119 1 : tunables 120 60 0 : slabdata 19 19 0
kmem_cache 125 125 160 25 1 : tunables 120 60 0 : slabdata 5 5 0

[root@localhost Documentation]#

该文件的每行有12个域,其含义见下表,

第五五部分 参数
第五六部分 解释
第五七部分 name
第五八部分 缓冲区的名字,其实就是对象的名字。
第五九部分 active_objs
第六〇部分 采样时,已经分配(即正在使用)的对象的个数
第六一部分 num_objs
第六二部分 采样时,一共可容纳该类对象的总个数
第六三部分 objsize(byte)
第六四部分 该缓冲区每个对象的大小
第六五部分 objperslab
第六六部分 每个slab里所含的对象的个数
第六七部分 pagesperslab
第六八部分 每个slab里所含的连续物理页的个数
第六九部分 batchcount
第七〇部分 local cache扩大或缩小时,每次能从通用内存池得到或释放的对象的个数目。
第七一部分 limit
第七二部分 一个slabl cache最多可有的闲置的对象
第七三部分 sharedfactor
第七四部分 共享的因数
第七五部分 active_slabs
第七六部分 活跃的slab个数
第七七部分 num_slabs
第七八部分 Slab的个数
第七九部分 sharedavail
第八〇部分 可用的该类对象的个数



1.1.5. /proc/vmstat
文件/proc/meminfo 包含了系统内存的详细信息,他显示了物理内存的数量,可交换空间的数量,空闲内存的数量等。需要命令如free、vmstat、iostat、top都是从该文件获得内存信息。单位为kB

[root@localhost Documentation]# cat /proc/vmstat
nr_dirty 3
nr_writeback 0
nr_unstable 0
nr_page_table_pages 750
nr_mapped 49126
nr_slab 2766
pgpgin 624439
pgpgout 79564
pswpin 1043
pswpout 5983
pgalloc_high 0
pgalloc_normal 3143647
pgalloc_dma 87579
pgfree 3232185
pgactivate 90518
pgdeactivate 35643
pgfault 1914771
pgmajfault 5538
pgrefill_high 0
pgrefill_normal 414379
pgrefill_dma 159646718
pgsteal_high 0
pgsteal_normal 72250
pgsteal_dma 8701
pgscan_kswapd_high 0
pgscan_kswapd_normal 47190
pgscan_kswapd_dma 7548
pgscan_direct_high 0
pgscan_direct_normal 44220
pgscan_direct_dma 5507
pginodesteal 1891
slabs_scanned 141312
kswapd_steal 40222
kswapd_inodesteal 59993
pageoutrun 38845
allocstall 1071
pgrotated 6625


参数
解释
nr_dirty
采样时,被修改过但是正等待写回硬盘的物理页数
nr_writeback
采样时,正在被写回硬盘的物理页数
nr_unstable
专用于NFS文件系统,NFS不稳定的物理页数
nr_page_table_pages
采样时,页表所占的物理页数
nr_mapped
采样时,映像在页表的物理页数
nr_slab
采样时,slab使用的物理页数目
pgpgin
自系统启动以来,从硬盘读入的数据量。由虚拟内存管理系统触发的IO操作,包括所有类型,无论是文件系统还是交换区,其在IO子系统中进行更新。其值包括 pswpin
pgpgout
自系统启动以来,从硬盘读入的数据量。其值包括 pswpout
pswpin
自系统启动以来,从交换区读到物理内存的数据量
pswpout
自系统启动以来,从物理内存写到交换区的数据量
pgalloc_high
自系统启动以来,从HighMem 区域的page frame cache 里分配的物理内存页数
pgalloc_normal
自系统启动以来,从Normal 区域的page frame cache 里分配的物理内存页数
pgalloc_dma
自系统启动以来,从DMA 区域的page frame cache里分配的物理内存页数
pgfree
自系统启动以来,free 的物理内存页数
pgactivate
自系统启动以来,从不活跃队列移到活跃队列的物理内存页数
pgdeactivate
自系统启动以来,从活跃队列移到不活跃队列的物理内存页数
pgfault
自系统启动以来,系统所发生缺页的次数
pgmajfault
自系统启动以来,系统所发生主缺页的次数
pgrefill_high
自系统启动以来,在将物理页面从活跃链转移到不活跃链的过程中,在 HighMem区域所查看的的物理内存页数
pgrefill_normal
自系统启动以来,在将物理页面从活跃链转移到不活跃链的过程中,在 Normal区域所查看的的物理内存页数
pgrefill_dma
自系统启动以来,在将物理页面从活跃链转移到不活跃链的过程中,在 Dma区域所查看的的物理内存页数
pgsteal_high
自系统启动以来,已经回收的HighMem区域的物理内存页数
pgsteal_normal
自系统启动以来,已经回收的NormalMem区域的物理内存页数
pgsteal_dma
自系统启动以来,已经回收的DMA区域的物理内存页数
pgscan_kswapd_high
自系统启动以来,由于定期触发回收而查看的HighMem区域的物理内存页数
pgscan_kswapd_normal
自系统启动以来,由于定期触发回收而查看的Normal区域的物理内存页数
pgscan_kswapd_dma
自系统启动以来,由于定期触发回收而查看的DMA区域的物理内存页数
pgscan_direct_high
自系统启动以来,由于缺少物理内存触发的所查看的HighMem区域的物理内存页数
pgscan_direct_normal
自系统启动以来,由于缺少物理内存触发的所查看的Normal区域的物理内存页数
pgscan_direct_dma
自系统启动以来,由于缺少物理内存触发的所查看的DMA区域的物理内存页数
pginodesteal
自系统启动以来,由于缺少物理内存触发而导致释放节点所回收的物理页数目
slabs_scanned
自系统启动以来,在回收slab cache过程中所查看的物理页数目
kswapd_steal
自系统启动以来,由于定期触发回收而导致释放节点所回收的物理页数目
kswapd_inodesteal
自系统启动以来,由于定期触发回收所回收的物理页数目
pageoutrun
自系统启动以来,Kswapd发起的回收物理页的次数目
allocstall
自系统启动以来,系统发生的直接调用回收算法的次数
pgrotated
自系统启动以来,转移到 LRUlist链尾的物理页数目
nr_bounce
采样时,用于bounce buffers的物理页数目


1.1.6. free
free查看当前系统内存的使用情况,它能够显示系统中剩余及已用的物理内存和交换空间的大小,以及共享内存和被核心使用的缓冲区;监视交换空间的使用情况。它将给出已使用了多少的交换空间。
命令格式:
free [-b -k -m]
其中-b 以字节为单位显示,-k 以K字节为单位显示,-m 以兆字节为单位显示。缺省为k。

范例1:
[root@nonamelinux ~]# free
total used free shared buffers cached
Mem: 386024 377116 8908 0 21280  155468
-/+ buffers/cache: 200368 185656
Swap: 393552 0 393552

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

参数
描述
/proc/meminfo
第二行(mem):显示出物理内存的使用情况

total
总计物理内存的大小
MemTotal
used
已使用物理内存的总和(第二行把buffers 和cached 算进来),所以total=used+free
MemTotal-MemFree
free
显示了所有未被使用的空闲物理内存
MemFree
Shared
当前版本忽略该选项

Buffers
显示出了当前缓冲区高速缓存的大小
Buffers
cached
显示出了当前页高速缓存的大小
Cached
第三行(-/+ buffers/cached): 从用户的角度来看

used
已使用多大
MemTotal-MemFree-Buffers-Cached
free
可用有多少, 是第二行free+buffers+cached 的和
Memfree+Buffers+Cached
四行(): 显示出了与交换空间相应的信息。如果这一行的数值都是零,表示你的交换空间没有被击活
Total
全部交换区的大小
SwapTotal
used
已经使用的交换区的大小
SwapTotal-SwapFree
free
空闲的交换区的大小
SwapFree

第二行(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会很快地被回收。 buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages,cached是用来给文件做缓冲。那就是说:buffers是用来存储,目录里面有什么内容,权限等等。 而Cache存放从硬盘读的数据,即直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached.
如上例: 185656=8908+21280+155468

1.1.7. vmstat

下面只介绍 Vmstat与虚拟内存相关的参数,包括
(1)交换区(swap)的使用情况;
(2)物理内存的使用情况;
(3)空闲内存的情况。

摘要选项 -s 向标准输出发送摘要报告,该报告从系统初始化开始,以绝对计数表示,而不是基于某个时间间隔。推荐使用该参数的方法是在有工作负载之前运行该命令,保存输出,在有工作负载后再次运行此命令,并保存输出。下一步就是确定两组输出间的差异。自动实现该操作的 awk 脚本名为 vmstatit,详细内容如下:
vmstat -s >temp.file # cumulative counts before the command
time $1 # command under test
vmstat -s >>temp.file # cumulative counts after execution
grep "pagi.*ins" temp.file >>results # extract only the data
grep "pagi.*outs" temp.file >>results # of interest

vmstat的语法如下:
  vmstat [delay [count]]
或 vmstat [-a] [-m]
其中,delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。
与虚拟内存有关的输出的含义

范例1:average mode 1 (粗略信息)
(so,si)对应的输出值是从系统启动以来的平均值,而(swpd,free,buff,cache,active 和inactive)的输出值是采样时的系统的值。可以看到有4Kbytes的内存的数据已经转储到硬盘上;50MB的空闲物理内存;10MB的用于buffer的物理内存;112MB的用于cache的物理内存.

[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 4580 428 98516 0 0 49 6 15 19 2 1 96 1
[root@localhost ~]#

Vmstat还可以显示活跃和不活跃的内存的信息,见下表。Inactive pages表示有多少内存页可以转储到硬盘上。系统有20MByte的不活跃内存,有157MByet的活跃内存。

[root@localhost ~]# vmstat -a 2 4
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free inact active si so bi bo in cs us sy id wa
1 0 4092 44720 20320 160440 0 0 164 55 1059 658 5 1 92 2
0 0 4092 44696 20320 160440 0 0 0 0 1049 171 2 0 98 0
0 0 4092 44680 20320 160440 0 0 0 0 1048 163 2 0 99 0
0 0 4092 44688 20320 160440 0 0 0 0 1048 157 2 0 98 0
[root@localhost ~]#



参数
描述
/proc/meminfo
swapd (kb)
在采样时,已经使用的交换区的大小
SwapTotal-SwapFree
free(kb)
在采样时,没有被系统或应用程序使用的空闲的物理内存
MemFree
buff(kb)
在采样时,用于系统buffer的内存
Buffers
cache(kb)
用于页高速缓存
Cached
si(kb/s)
前delay时间里,每秒把数据从硬盘交换区装入物理内存的数据量
dpswpin/delay
so(kb/s)
前delay时间里,每秒把数据从物理内存转储到硬盘交换区的数据量
dpswpout/delay
bi(kb/s)
前delay时间里,每秒把数据从物理内存转储到硬盘的数据量
dpgpgin/delay
bo(kb/s)
前delay时间里,每秒把数据从硬盘读到物理内存的数据量
dpgpgout/delay
active
采样时,活跃的物理内存
Active
inactive
采样时,不活跃的物理内存
InActive

范例2:average mode (此选项一次性显示内存使用的状态信息详细信息)
命令格式:
vmstat –s
这里只讨论与虚拟内存相关信息。246MB物理内存,1565MByte交换分区。
Used_memory +free_memory =total_memory。
Cached=200204-153300-20692-10072

[root@localhost ~]# vmstat -s
255280 total memory
244216 used memory
206624 active memory
21208 inactive memory
11064 free memory
628 buffer memory
91396 swap cache
255992 total swap
24 used swap
255968 free swap
973400 non-nice user cpu ticks
477 nice user cpu ticks
206168 system cpu ticks
43567714 idle cpu ticks
373234 IO-wait cpu ticks
62732 IRQ cpu ticks
1972 softirq cpu ticks
22366502 pages paged in
88756936 pages paged out
0 pages swapped in
0 pages swapped out
135634319 interrupts
137288441 CPU context switches
1134440368 boot time
208990 forks
[root@localhost ~]#


参数
描述
/proc/meminfo
total memeory(kB)
全部的物理内存
MemTotal
used memory
采样时,已用的物理内存
MemTotal-MemFree
active memory
采样时,活跃的物理内存
Active
inactive memory
采样时,不活跃的物理内存
InActive
free memory
采样时,闲置的物理内存
MemFree
buffer memory
采样时,缓冲区高速缓存,这部分空间不属于任何进程或线程。
Buffers
swap cache
采样时,交换区页高速缓存,这部分空间不属于任何进程或线程。
Cached
total swap
采样时,全部交换区的大小
SwapTotal
used swap
采样时,已用交换区的大小
SwapTotal-SwapFree
free swap
采样时,空闲交换区的大小
SwapFree
pages paged in
自系统启动以来,从硬盘读入的数据量。由虚拟内存管理系统触发的IO操作,,包括所有类型,无论是文件系统还是交换区,其在IO子系统中进行更新。其值包括pswpin
Pgpgin
pages paged out
自系统启动以来,些入硬盘的数据量,包括所有类型
Pgpgout
pages swapped in
自系统启动以来,从交换区读到物理内存的数据量
Pswpin
pages swapped out
自系统启动以来,从物理内存写到交换区的数据量
pswpout


范例3:定期采样(delay [count])
定期采样数据是指每隔delay时间,报告系统的活跃情况。当count 为0时,vmstat 将不停地定期报告信息;否则当报告count次后,vmstat 命令停止运行。
第一行的信息如同范例1,是自系统启动以来的平均信息。从第二行开始,每行的意思是:r和b指从前一次报告起,间隔delay时间后的那一时刻系统运行队列和等待队列的情况;而usystem参数(in,cs)以及CPU参数(us,sy,id,wa)对应的输出值是系统在前一个delay的情况。
从下面例子可以看出上下文交换的次数小于中断的发生次数。当系统大部分时间是空闲并且中断大部分是时间中断时,这种现象极可能发生。当时间中断发生时, 因为调度器没有什么任务可调度,所以很少发生上下文切换。

[root@localhost Documentation]# dd if=/dev/zero of=/1.img bs=1024 count=2560000 &
[1] 14566
[root@localhost Documentation]# 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 2 864 3380 96 100288 0 0 49 10 15 19 2 1 96 1
0 2 864 3296 108 100236 0 0 2 47222 704 631 2 39 0 59
1 2 864 3072 100 100592 0 0 2 45780 690 591 2 40 0 58
0 3 864 3196 96 100388 0 0 2 48778 703 579 3 37 0 60
0 1 864 4120 100 99428 0 0 2 45414 858 765 4 42 0 54
0 3 864 3084 96 100488 0 0 14 48606 927 856 5 45 0 51
1 2 864 3264 100 100376 0 0 18 39814 824 999 8 44 0 48
1 1 864 3228 96 100504 0 0 14 38544 801 733 2 35 0 63

[root@localhost Documentation]# vmstat -a 2
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free inact active si so bi bo in cs us sy id wa
0 2 864 3204 22704 213376 0 0 49 12 15 19 2 1 96 1
0 2 864 3204 23108 212984 0 0 2 49806 706 535 3 38 0 59
0 5 864 3080 22476 213624 0 0 2 48238 918 839 4 47 0 48
1 1 864 3064 22572 213788 0 0 16 28006 768 716 3 27 0 71
0 2 864 3072 23948 212148 0 0 4 46448 676 689 2 37 0 61

[root@localhost Documentation]#

范例4
这个例子动态显示物理内存与交换区之间的数据交换。Si表示在每个采样的时间段里从交换区读到物理内存的速度,so表示从物理内存转储到交换区的速度。si 或so不为零表示系统没有足够的物理内存来执行系统中所有的进程。si和so的值同时很大也是有可能。例如系统运行的程序同时需要极大的物理内存空间。

[root@localhost filesystems]# 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 3 43516 3296 3552 81584 0 0 47 29 63 1 2 1 97 1
1 1 43516 3064 3272 81452 116 0 1092 0 579 2529 31 6 0 63
0 1 43516 4232 3256 79132 0 0 112 0 441 1550 67 4 0 29
0 0 43516 4248 3256 79132 0 0 0 0 466 727 7 2 85 6
0 0 43516 4252 3256 79132 0 0 0 0 502 689 5 2 93 0
0 0 43516 4252 3256 79132 32 0 32 0 429 576 3 0 97 0
0 2 43516 3036 3280 79604 0 0 1256 0 515 1047 10 4 50 37
0 2 43516 3024 1352 80112 0 0 2944 0 735 1339 16 4 0 80
2 1 43516 3440 1164 78252 0 0 1064 1124 789 1266 42 7 0 51
1 1 43516 3024 1140 78080 0 0 1328 0 487 724 73 7 0 20
0 3 43516 3008 1008 74172 0 0 2044 0 763 1405 33 11 0 56
0 2 43660 3732 928 72484 0 148 2800 404 696 867 29 9 0 62
2 2 43876 3388 960 72360 0 216 4080 732 789 1053 59 9 0 32
1 3 44484 3924 944 72904 0 612 5444 620 534 1066 78 10 0 12
1 2 46244 3144 960 73436 156 1876 1524 1876 602 1852 61 15 0 24
0 4 50340 5088 1064 73556 28 4188 1688 4800 694 1735 38 11 0 51
0 3 52536 4064 1136 75100 0 2196 2384 2244 815 742 12 7 0 81
1 2 55820 8288 1168 74340 32 3312 3180 3636 1529 7179 32 18 0 50
0 4 57516 9884 1140 74092 32 1632 1132 1812 779 6350 61 21 0 18
4 0 57516 7068 1156 74980 1860 0 2764 0 695 2645 63 20 0 17
1 0 57516 6620 1180 76316 400 0 1760 0 615 1251 88 10 0 2
1 0 57516 5264 1180 76316 0 0 0 0 635 1102 97 3 0 0
0 0 59292 4716 1200 77020 28 1788 1036 2028 699 2347 59 6 21 14
0 0 59292 4716 1200 77020 0 0 0 0 657 785 4 2 94 0
0 0 59128 16696 1204 76984 32 0 192 0 554 1237 19 6 72 3
0 0 59128 16696 1204 76984 0 0 0 0 643 1060 6 3 91 0

范例5:查看Linux核心如何分配其自己的物理内存
Linun核心使用一系列的“slabs”来存放核心的动态数据结构调整。
[work@builder ~]$ vmstat -m
Cache Num Total Size Pages
fib6_nodes 5 119 32 119
ip6_dst_cache 4 15 256 15
ndisc_cache 1 15 256 15
rawv6_sock 6 10 768 5
udpv6_sock 0 0 768 5
tcpv6_sock 9 9 1280 3
ip_fib_alias 9 226 16 226
.
.
.
参数的解释
参数
描述
/proc/meminfo
cache
使用该cache的对象名称
Name
Num
即正在使用的该对象的个数
act_objs
Total

num_objs
Size
该缓冲区每个对象的大小
objsize
Pages
每个slab里所含的对象的个数
objperslab

slabs[k]., 当前该缓冲区还能够分配的对象的个数
slabs[k].,
slabs[k]. objperslab每个slab里所含的对象的个数

1.1.8. top
top没有任何查看内存信息的命令行参数,命令就是:top。交互过程可输入“M”来按使用内存的大小来索引所有进程。
与内存整体性能相关的输出:

参数
描述
/proc/meminfo
Mem:total(kB)
全部的物理内存
MemTotal
Mem:used(kB)
采样时,已用的物理内存
MemTotal-MemFree
Mem:free(kB)
采样时,闲置的物理内存
MemFree
Mem:buffers(kB)
采样时,缓冲区高速缓存,这部分空间不属于任何进程或线程。
Buffers
Swap:total(kB)
采样时,全部交换区的大小
SwapTotal
Swap:used(kB)
采样时,已用交换区的大小
SwapTotal-SwapFree
Swap:free(kB)
采样时,空闲交换区的大小
SwapFree

  
范例1:查看 键入top命令查看系统状况

top - 16:52:17 up 3 min, 1 user, load average: 0.10, 0.27, 0.14
Tasks: 55 total, 1 running, 54 sleeping, 0 stopped, 0 zombie
top - 16:52:31 up 4 min, 1 user, load average: 0.08, 0.26, 0.13
Tasks: 55 total, 1 running, 54 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 0.3% sy, 0.0% ni, 99.0% id, 0.0% wa, 0.3% hi, 0.0% si
Mem: 251924k total, 238168k used, 13756k free, 4420k buffers
Swap: 0k total, 0k used, 0k free, 165200k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4171 root 15 0 48404 12m 2220 S 0.7 5.0 0:01.36 X
4404 root 15 0 66540 16m 13m S 0.3 6.9 0:02.31 kdeinit
1 root 16 0 1772 544 464 S 0.0 0.2 0:00.61 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/0
4 root 5 -10 0 0 0 S 0.0 0.0 0:00.02 khelper



  
第四行为内存状态,依次为平均可用内存、已用内存、空闲内存、共享内存、缓存使用内存。第五行为交换状态,依次为平均可用交换容量、已用容量、闲置容量、高速缓存容量。然后下面就是和ps相仿的各进程情况列表了。
总的来说,top命令的功能强于ps,但需要长久占用前台  

1.1.9. slabtop
slabtop类似于top,但是它用于显示
系统里的进程如何使用CPU和内存
实时给出内核如何分配cache

Slabtop将显示这些不同的slab的状态,它们如何使用内存。
命令格式:
slabtop [--delay=n] [-sort={abclvnopsu}]
参数解释如下:

Delay— 每隔 delay秒,刷新一下信息
Sort—表示按照一定规则索引

A :按照每个slab中活跃的对象的个数
B : 对一个指定的cache,按每个slab中活跃的对象(活跃和不活跃都包括)的个数
C:按照每个cache正在使用的内存的大小
L:按照每个cache中的slab的个数
V:按照每个cache中的活跃slab的个数
N: 按照每cache的名字
O:对一个指定的cache,按每个slab中活跃的对象(活跃和不活跃都包括)的个数
P:按照每个slab使用的页的各数目
S:按照cache中对象的大小
U:按照cache的利用率

范例1 :

>slabtop
Active / Total Objects (% used) : 32674 / 40414 (80.8%)
Active / Total Slabs (% used) : 2334 / 2334 (100.0%)
Active / Total Caches (% used) : 73 / 108 (67.6%)
Active / Total Size (% used) : 8051.21K / 9511.84K (84.6%)
Minimum / Average / Maximum Object : 0.02K / 0.24K / 128.00K

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
7383 4410 59% 0.16K 321 23 1284K dentry_cache
4185 4185 100% 0.12K 135 31 540K size-128
3965 3916 98% 0.06K 65 61 260K size-64
3619 3619 100% 0.08K 77 47 308K vm_area_struct
3178 2392 75% 0.27K 227 14 908K radix_tree_node
2400 2233 93% 0.05K 32 75 128K buffer_head
1986 1350 67% 0.57K 331 6 1324K ext2_inode_cache
1785 1785 100% 0.03K 15 119 60K size-32
1460 1460 100% 0.19K 73 20 292K filp
1242 1108 89% 0.43K 138 9 552K inode_cache
1071 1036 96% 0.03K 9 119 36K anon_vma
805 801 99% 0.54K 115 7 460K shmem_inode_cache
600 12 2% 0.05K 8 75 32K avc_node
480 207 43% 0.50K 60 8 240K size-512
452 264 58% 0.02K 2 226 8K biovec-1
360 172 47% 0.25K 24 15 96K size-256
305 272 89% 0.06K 5 61 20K biovec-4


输出的解释:
: 32674 / 40414 (80.8%)
: 2334 / 2334 (100.0%)
: 73 / 108 (67.6%)
: 8051.21K / 9511.84K (84.6%)
: 0.02K / 0.24K / 128.00K




参数
描述
/proc/slabinfo
Active / Total Objects (% used)
所有缓冲区里的活跃的对象的个数/所有缓冲区里的对象的个数 / 比率
Sactive_objs / S num_objs
Active / Total Slabs (% used)
所有缓冲区里的活跃的slab的个数/所有缓冲区里的slab的个数 / 比率
Sactive_slabs / S num_slabs
Active / Total Caches (% used)
活跃的缓冲区的个数/缓冲区里的的个数 / 比率
/proc/slabinfo里item 个数
Active(kB) / Total Size(kB) (% used)
所有活跃的对象的大小/所有的对象的大小/比率

Minimum / Average / Maximum Object
大小最小的对象/对象的平均大小/大小最大的对象
Min(all Objsize)/Avg(all Objsize)/ Max( all Objsize)
OBJS
该缓冲区里对象的个数
num_objs
ACTIVE
该缓冲区里活跃对象的个数
active_objs/ num_objs
USE(%)
该缓冲区里活跃的对象的百分率
active_objs
OBJ/ SIZE (kB)
该缓冲区每个对象的大小
Objsiz
SLABS
该缓冲区slab的个数目
num_slabs
OBJ/SLAB
每个slab里对象的个数
objperslab
CACHE SIZE(kB)
缓冲区的大小
Nr_slabs*pages_per_slab*page_size
NAME
缓冲区的名字
Name

1.1.10. sar

sar缺省时只显示CPU的性能信息,因此要提取与内存相关的信息,输入命令时就要带上参数。

-B:物理页的导入和导出以及缺页信息
-r:报告系统正在使用的虚拟内存的情况,包括闲置的物理空间、交换区、cache
-W: 物理页在交换机区的换入和换出信息



范例1:物理页的导入和导出以及缺页信息
在18时19分30秒到18时19分31秒之间的1秒里,有12.37KB的数据从硬盘读入内存,有83703。09KB的数据内存写到硬盘里。

[root@localhost filesystems]# dd if=/dev/zero of=/1.img bs=1024 count=1000000&
[1] 5014
[root@localhost filesystems]# sar -B 1 5

12时00分59秒 pgpgin/s pgpgout/s fault/s majflt/s
12时01分00秒 1164.71 2262.75 9.80 0.00
12时01分01秒 3004.00 3224.00 11.00 0.00
12时01分02秒 1441.58 1334.65 31.68 3.96
12时01分03秒 2820.00 1624.00 13.00 3.00
12时01分04秒 1680.00 1708.00 93.00 9.00
12时01分05秒 1672.00 824.00 48.00 3.00
12时01分06秒 2122.77 2463.37 172.28 5.94
12时01分07秒 2685.15 3001.98 131.68 2.97
12时01分08秒 2532.00 2988.00 324.00 1.00
12时01分09秒 3176.24 2118.81 342.57 3.96
12时01分10秒 2852.53 2569.70 261.62 5.05

输出的解释:

参数
描述
/proc/vmstat
pgpgin/s
前一间隔时间里,每秒从硬盘导入的页(KB),等于vmstat的bi
dpgpgin/interval
pgpgout/s
前一间隔时间里,每秒转储到硬盘上的页(KB),等于vmstat的bo
dpgpgout/interval
fault/s
前一间隔时间里,每秒的缺页次数
dpgfault/interval
majflt/s
前一间隔时间里,每秒的主缺页次数
dpgmajfault/interval


范例2:虚拟内存的情况
可以看到物理内存的利用率从61.41%提升到99.84%,此外kbmemefree(物理内存)的闲置也27MB降到700KB,但是

[root@localhost proc]# dd if=/dev/zero of=/home/cxl/1.img bs=1024 count=10000000 &
[1] 4327
[root@localhost proc]# sar -r 1 1000
Linux 2.6.13 (localhost.localdomain) 2006年03月21日

12时08分38秒 kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpus ed %swpused kbswpcad
12时08分39秒 3592 251444 98.59 180 76848 236588 2694 48 53.25 23660
12时08分40秒 3356 251680 98.68 188 77020 236588 2694 48 53.25 23660
12时08分41秒 3232 251804 98.73 176 77192 236588 2694 48 53.25 23640
12时08分42秒 3508 251528 98.62 188 76544 236588 269448 53.25 23640
12时08分43秒 3108 251928 98.78 184 77128 236588 269448 53.25 23640
12时08分44秒 3356 251680 98.68 160 76940 236588 269448 53.25 23640
12时08分45秒 4152 250884 98.37 160 76104 236588 269448 53.25 23640
12时08分46秒 3028 252008 98.81 140 77212 236588 269448 53.25 23640
12时08分47秒 3200 251836 98.75 152 77264 236588 269448 53.25 23640
12时08分48秒 3448 251588 98.65 132 77032 236588 269448 53.25 23640
12时08分49秒 3048 251988 98.80 136 77216 236588 269448 53.25 23640
12时08分50秒 3324 251712 98.70 124 77068 236588 269448 53.25 23640
12时08分51秒 4008 251028 98.43 112 76428 236588 269448 53.25 23640
12时08分52秒 3076 251960 98.79 108 77596 236588 269448 53.25 23640


输出的解释:


参数
描述
/proc/meminfo
Kbmemfree(KB)
采样时,闲置的物理内存
MemFree
Kbmemused(KB)
采样时,已用的物理内存
MemTotal-MemFree
%memused
正在被使用的物理内存的百分比
Kbmemused/( Kbmemused+ Kbmemfree)
kbbuffers(KB)
采样时,缓冲区高速缓存,这部分空间不属于任何进程或线程。
Buffers
kbcached(KB)
采样时,页高速缓存,这部分空间不属于任何进程或线程。
Cached
kbswpfree(KB)
正在空闲的交换区的大小
SwapFree
kbswpused(KB)
采样时,已用交换区的大小
SwapTotal-SwapFree
%swpused
正在使用的交换区的百分比
SwapTotal-SwapFree
kbswpcad(KB)
采样时,swap cache的大小
SwapCached

范例3:
在18时19分30秒到18时19分31秒之间的1秒里,有12.37KB的数据从硬盘读入内存,有83703。09KB的数据内存写到硬盘里。

[root@localhost sysstat-5.1.5]# sar -W
Linux 2.6.13 (localhost.localdomain) 2006年03月20日

13时40分01秒 pswpin/s pswpout/s
13时50分01秒 0.00 0.00
14时00分01秒 0.00 0.25
14时10分02秒 0.00 0.00
Average: 0.00 0.08
[root@localhost sysstat-5.1.5]#

输出的解释:


参数
描述
/proc/vmstat
pswpin/s
每秒从交换区导入的物理页(KB)
dpswpin/interval
Pswpout/s
每秒转储到交换区的物理页(KB)
dpswpout/interval



1.1.11. ipcs
ipcs是通过系统调用获得核心信息来查看进程间通信机制中对象的状态。
ipcs [ resource ] [ format ]

resource的参数有:
第八一部分 参数
第八二部分 解释
第八三部分 -m
第八四部分 查看共享内存段
第八五部分 -q
第八六部分 查看消息队列
第八七部分 -s
第八八部分 查看信号量
第八九部分 -a
第九〇部分 缺省值,查看所有信息
第九一部分 -u
第九二部分 查看当前值
第九三部分 -l
第九四部分 查看上限值


format的参数有:
第九五部分 参数
第九六部分 解释
第九七部分 -t
第九八部分 显示时间
第九九部分 -p
第一〇〇部分 显示pid
第一〇一部分 -c
第一〇二部分 显示创建者
第一〇三部分 -l
第一〇四部分 显示上限
第一〇五部分 -u
第一〇六部分

利用ipcrm删除信号量集、消息队列、共享内存。
信号量(SEMAPHORE)则是防止两个或多个进程同时访问共享资源的一种机制。Struct seminfo 的各个成员解释:
参数
解释
semmap
共享内存中可用于分配给信号量的空闲空间,单位:信号量的个数。
semmni
系统中信号类型的数目的最大值,一个信号灯标识符代表一个类型
semmns
系统中信号的最多数目,=semmni*semmsl
semmnu
对于每一个信号量,等待增加该信号量的值的进程数的上限值
semmsl
同一类信号的最多灯数
semopm
每个semop系统调用所包含的最大的操作数(能调用的信号灯的最多次数)
semume
对于一个进程,其等待的信号的数目的上限
Semusz
正在使用的信号集的数目
Semvmx
信号量的值的上限。信号量的值用来控制某个共享资源,当某一进程不使用该资源时,信号的值增1。
Semaem
正在使用的信号的数目




共享内存的各个成员解释:
参数
解释
shmmax
与shmall含义一样,只是单位不一样。以字节为单位。
shmmin
每个可用共享内存的最小尺寸。以字节为单位。
shmmni
SYSV:该文件表示整个系统最多有多少共享内存段
shmseg
每个进程最多可拥有的共享内存段
shmall
SYSV:该文件给出了每个可用共享内存的最大尺寸(以page为单位),取值=ceil(shammax/page_size)

消息队列的各个成员解释:
参数
解释
msgpool
消息缓冲池的尺寸,单位:kb
msgmap
消息映射中的条目数目
msgmax
可发送的最长消息的字节长度
msgmnb
队列所有消息之和,单位为字节
msgmni
最大的消息队列数目
msgssz
消息段的长度,byte
msgtql
系统消息头的数目
msgseg
消息段的数目



范例1:查看信号量集、消息队列、共享内存的上限值


[root@localhost ~]# ipcs -l

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 2097152
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 142
max semaphores per array = 256
max semaphores system wide = 32000
max ops per semop call = 100
semaphore max value = 32767

------ Messages: Limits --------
max queues system wide = 2878
max size of message (bytes) = 8192
default max size of queue (bytes) = 65535

[root@localhost ~]#

输出分三部分:
共享内存
第一〇七部分 参数
第一〇八部分 解释
第一〇九部分 max number of segments
第一一〇部分 shmmni,该文件表示整个系统最多有多少共享内存段
第一一一部分 max seg size (kbytes)
第一一二部分 Shmmax>>10
第一一三部分 max total shared memory (kbytes
第一一四部分 shmall
第一一五部分 min seg size (bytes)
第一一六部分 shmmin
第一一七部分 max number of arrays
第一一八部分 semmni系统中信号类型的数目的最大值
第一一九部分 max semaphores per array
第一二〇部分 Semmsl同一类信号的最多灯数
第一二一部分 max semaphores system wide
第一二二部分 semmns系统中信号的最多数目
第一二三部分 max ops per semop call
第一二四部分 Semopm每个semop系统调用所包含的最大的操作数(能调用的信号灯的最多次数)
第一二五部分 semaphore max value
第一二六部分 Semvmx信号量的值的上限。信号量的值用来控制某个共享资源,当某一进程不使用该资源时,信号的值增1。
第一二七部分 max queues system wide
第一二八部分 msgmni
第一二九部分 max size of message (bytes)
第一三〇部分 msgmax可发送的最长消息的字节长度
第一三一部分 default max size of queue (bytes)
第一三二部分 msgmnb




范例2:查看当前整体值



[root@localhost ~]# ipcs -u

------ Shared Memory Status --------
segments allocated 5
pages allocated 290
pages resident 242
pages swapped 0
Swap performance: 0 attempts 0 successes

------ Semaphore Status --------
used arrays = 5
allocated semaphores = 5

------ Messages: Status --------
allocated queues = 0
used headers = 0
used space = 0 bytes

[root@localhost ~]#

输出分三部分:
共享内存
第一三三部分 参数
第一三四部分 解释
第一三五部分 segments allocated
第一三六部分 正在使用的共享段的数目
第一三七部分 pages allocated
第一三八部分 分配给共享段的虚拟空间
第一三九部分 pages resident
第一四〇部分 共享段占用的物理内存空间
第一四一部分 pages swapped
第一四二部分 放到交换区的共享段的页数
Swap performance: 0 attempts 0 successes
第一四三部分
第一四四部分 交换的次数,交换的成功次数
第一四五部分 used arrays
第一四六部分 正在使用的信号集的数目
第一四七部分 allocated semaphores
第一四八部分 正在使用的信号的数目
第一四九部分 allocated queues
第一五〇部分 消息缓冲池的尺寸,单位:kb
第一五一部分 used headers
第一五二部分 消息映射中的条目数目
第一五三部分 used space
第一五四部分 系统消息头的数目,bytes


范例3:


[root@localhost ~]# ipcs –a

------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 327680 root 600 393216 2 dest
0x02063508 294913 root 666 4 1
0x00000000 360450 root 600 393216 2 dest
0x00000000 1245187 root 666 313600 1 dest

------ Semaphore Arrays --------
key semid owner perms nsems
0x16063508 0 root 666 1
0xde063508 32769 root 666 1
0x0206baad 65538 root 600 1

------ Message Queues --------
key msqid owner perms used-bytes messages

输出分三部分:
共享内存
第一五五部分 参数
第一五六部分 解释
第一五七部分 key
第一五八部分 32-bit, IPC资源的标识符
第一五九部分 shmid
第一六〇部分 IPC资源的描述符,类似与文件描述符,该值从key计算该值
第一六一部分 owner
第一六二部分 创建该资源的用户名
第一六三部分 perms
第一六四部分 存放了该资源的创建者、该资源的组和其它用户的读写权限。
第一六五部分 bytes
第一六六部分 该共享段的大小
第一六七部分 nattch
第一六八部分 使用该共享段
第一六九部分 status
第一七〇部分 该共享段的状态:dest(在上次detach时被destroy)

信号量
第一七一部分 参数
第一七二部分 解释
第一七三部分 key
第一七四部分 32-bit, IPC资源的标识符
第一七五部分 semid
第一七六部分 IPC资源的描述符,类似与文件描述符,该值从key计算该值
第一七七部分 owner
第一七八部分 创建该资源的用户名
第一七九部分 perms
第一八〇部分 存放了该资源的创建者、该资源的组和其它用户的读写权限。
第一八一部分 nsems
第一八二部分 信号的个数

消息队列

第一八三部分 参数
第一八四部分 解释
第一八五部分 key
第一八六部分 32-bit, IPC资源的标识符
第一八七部分 msmid
第一八八部分 IPC资源的描述符,类似与文件描述符,该值从key计算该值
第一八九部分 owner
第一九〇部分 创建该资源的用户名
第一九一部分 perms
第一九二部分 存放了该资源的创建者、该资源的组和其它用户的读写权限。
第一九三部分 used-bytes
第一九四部分 该消息队列的当前所占的字节
第一九五部分 messages
第一九六部分 该消息队列中消息的个数

范例2
[root@localhost ~]# ipcs -pm

------ Shared Memory Creator/Last-op --------
shmid owner cpid lpid
2097152 root 5588 5636
163841 root 5374 6109
196610 root 5356 5636
2129923 root 5588 5636
2457604 root 6161 5278
2490373 root 6161 5278
3375110 root 6161 5278
3407879 root 6161 5278
3440648 root 6161 5278
3768330 root 6161 5278

输出分三部分:
共享内存
第一九七部分 参数
第一九八部分 解释
第一九九部分 shmid
第二〇〇部分 IPC资源的描述符,类似与文件描述符,该值从key计算该值
第二〇一部分 owner
第二〇二部分 创建该资源的用户名
第二〇三部分 cpid
第二〇四部分 创建资源的pid
第二〇五部分 lpid
第二〇六部分 最后使用该资源的pid

内存管理--基本概念

1.1.1. 物理内存
说白了,物理内存就是计算机内存条的容量。CPU所需要的信息都是从物理内存获得。物理内存被分成大小相等的部分,称为页,其大小为4KB,这些物理页可分为4类:
(1)用于核心自身的code data bss 和stack、,这部分页不能被转移到硬盘上;
(2)执行程序代码,例如/bin/bash和 /lib/libdl-2.3.2.so;他们在物理内存是只读的;
(3)dirty页, 可能被修改了但还没写回硬盘;
(4)anonymous页:这些页不对应硬盘的任何文件,通常是执行程序运行过程中产生的一些变量;例如malloc所分配的空间就是这一类型的页;这些页可以被转移到交换区,如果交换区不存在,那么这些页将一直保留到被删除。
对系统里的每个处理器来说,不同的内存区域可能有不同的存取时间(一般是由内存和处理器的距离决定)。对于同一个内存区域,CPU访问速度一样。Linux2.6核心支持Numa(None Uniformed Memory Access)这种体系结构,NUMA中访问速度相同的一个内存区域称为一个Node,支持这种结构的主要任务就是要尽量减少Node之间的通信,使得每个处理器要用到的数据尽可能放在对它来说最快的Node中。每个Node里的物理内存再分成3个区域: DMA, Normal, HighMem。这样分开之后,物理内存能够被有效地使用,而不至于出现把DMA可用的内存大量给无关的用户进程使用导致驱动程序没法得到足够的DMA内存等情况。此外,每个区都独立地监控本区内存的使用情况,分配时系统会判断从哪个区分配比较合理,综合考虑用户的要求和系统现状。内核的cache由一个或多个slab组成,每个slab包含一个或多个对象。这些对象可能是活跃(正在使用)的,也可能是不活跃的(没有使用)。

1.1.2. 高端和低端物理内存
当系统有32位CPU并且物理内存1GB以上时,Linux必须将物理内存分为高端(high memory)和低端(low memory)来管理。内核不能直接访问高端物理内存,高端物理内存必须先被映像到低端物理内存。860MB以上的物理内存就称为高端物理内存,用于用户空间的程序和页高速缓存;任何可运行与高端内存的东西都可在低端内存运行,slab分配的内存都是低端内存。对于64位CPU就不分高低端内存。
/
1.1.3. Slab 分配器
单单分配页面的分配器肯定是不能满足要求的。内核中大量使用各种数据结构,大小从几个字节到几十上百k不等,都取整到2的幂次个页面那是完全不现实的。2.0的内核的解决方法是提供大小为2,4,8,16,...,131056字节的内存区域。需要新的内存区域时,内核从伙伴系统申请页面,把它们划分成一个个区域,取一个来满足需求;如果某个页面中的内存区域都释放了,页面就交回到伙伴系统。这样做的效率不高。有许多地方可以改进:
slab分配器负责处理来至核心模块的小于1个物理页的空间的请求。slab分配器把小物理空间看成对象,当这些对象(空间)不使用时,并不马上删除,而是存储在slab cache中。同一类型的这样的请求形成一个cache,slab将同一类型的请求尽可能放在一个物理页上。当slab 无法满足物理页请求时,slab就向Buddy分配器请求空间。Slab分配器只能分配DMA和NORMAL 区域中的物理空间。

1.1.4. 虚拟内存和swap
无穷大的快速的内存是每个使用操作系统的人所希望的。然而,这似乎是不可能的,至少目前的技术水平,况且,无穷大与快速本身就可能矛盾。为了解决无穷大,linux引入了虚拟存储系统。虚拟内存是计算机将一部分硬盘空间划作“内存”来使用。当内存的需求超出了系统中的物理内存量,那么 Linux 可以使用磁盘空间作为 RAM 的虚拟扩展,即(swap space)。Linux能够使用文件系统中的一个常规文件或一个独立的分区作为交换空间。交换分区要快一些,只好交换分区不与目录结构打交道。
当可用的物理内存空间小于一个值(可以通过proc/sys/vm来设置)时,就发生缺页操作,内核会将暂时不用的物理内存页的内容移到交换空间上,这样一来,这块内存就可用于其它目的。当需要用到原始的内容时,它们被重新读入内存。从物理内存移到SWAP DISK的特殊磁盘段上叫做虚拟内存的页导出(page out);反之,叫做页导入(page in)。
Linux下运行的程序只是看到有大量的内存可供使用而并没有注意到有时它们的一部分是驻留在硬盘上的科学,这时程序就不会象一直在物理内存中运行的那样快,因为读写硬盘要比直接使用物理内存慢得多(要慢数千倍)。
当系统的不活跃物理内存(inactive memory)很大,而已经被使用的交换区的空间也很大,这是可能,这样的数据并不能表明系统性能不好,这现象发生的发生,可能是某个应用程序需要大量空间,从而把许多处于睡眠的守护进程放如交换区,当该应用程序停止运行时,大量的物理内存被释放,这时候没有必要把这些守护进程拷入物理内存,因为尽可能利用物理内存是为了减少CPU等待数据的时间从而加快响应时间,拷入不但消耗CPU时间,而且盲目拷入,可能由于没有使用就又被转储回交换空间。
下面几种情况都会增大进程的虚拟内存空间:
加载程序映像。例如 ls 命令。这个命令,象所有的执行映像一样,由执行代码和数据组成。映像文件中包括将执行代码和相关的程序数据以及加载到进程地虚拟内存中所需要的所有信息。
进程可以在运行过程中申请额外的(虚拟)内存,比如用于存放它读入的文件的内容。新分配的虚拟内存需要连接到进程现存的虚拟内存中才能使用。
Linux 进程使用通用代码组成的共享库,例如文件处理。每一个进程都包括库的一份拷贝没有意义, Linux 使用共享库,几个同时运行的进程可以共享。这些共享库里边的代码和数据必须连接到该进程的虚拟地址空间和其它共享该库的进程的虚拟地址空间。

通常发生缺页时,系统首先在交换空间中找,如果找到,则被换入内存;当系统没有足够的物理内存时候,这些页又将被交换出来(到其它的交换空间中)。如果没有足够的虚拟内存来容纳所有这些页面,Linux就会波动而不正常;但经过一段较长的时间Linux会恢复,但此时系统已不可用了。在移去一个交换空间之前,你应该检查(例如,用free)是否有足够的空闲内存。

1.1.5. 高速缓存

物理内存是一种有限而又不充足的资源,高速缓存不可能做的很大(它不可能包容要用到的所有数据)。当缓存充满了数据时,其中最长时间不用的数据将被舍弃以腾出内存空间用于新的数据。高速缓存的大小会制约CPU的执行效率,虽然CPU主频很快,但它取不到数据,则只有空运行。因此,高速缓存的大小很重要。缓冲的效力主要是由它的大小决定的。缓冲大小太小的话等于没用:它只能容纳一点数据,因此在被重用时,所有缓冲的数据都将被倾空。实际的大小依赖于数据读写的频次、相同数据被访问的频率。只有用实验的方法才能知道。如果缓存有固定的大小,那么缓存太大了也不好,因为这会使得空闲的内存太小而导致进行交换操作(这同样是慢的)。为了最有效地使用实际内存,Linux自动地使用所有空闲的内存作为高速缓冲,即缓存的大小可以随可用内存动态变化,但也可以通过修改内核参数而改成固定的大小当程序需要更多的内存时。
高速缓存分三大类:hardware cache,memory cache and disk cache。Memory cache 和disk cache又被成为kernel cache, 其空间都可以被回收。无论是memory cache还是disk cache只会不断地吃物理内存,而不会主动释放。Linux内核利用 回收(reclaim)算法(PERA)来增加可用物理页的页数目。

(1)memory cache
通常由“buddy system”负责每个区域的物理内存的分配。为了提高性能,在物理内存划出一块缓存区,用于分配给只需一个物理页的请求。对于每个CPU的每个区域(DMA,normal memory, high memory)都有一个这类cache。这个缓存区又分成两类:hot cache 和 cold cache。hot cache 存储了那些可能还在CPU 硬件 cache中的数据。这部分cache 是memory cache。此外memory cache还包括slab allocator cache。
(2)disk cache
disk cache包括dentry cache、inode cache和page cache。这里我们只讨论page cache,为方便,该小节下面讲到高速缓存就是指page cache。
与访问物理内存相比,磁盘的读写速度很慢,可是在较短的时间内多次读/写磁盘的同一部分也是常有的事。为了缓解两类存储器速度的不匹配,Linux内存管理提供了逻辑上属于外存储管理系统而实际是占用物理内存空间的高速缓存。除非对所要访问的文件置位:O_DIRECT,否则对该文件读或写都必须经过page cache。使用page_cache时,每从硬盘读一个页或写一个页到硬盘时,首先检查page cache 是否有该页,如果没有,则在page cache 加入一个entry并将该页数据拷入page cache,然后读入用户空间或留日后写如硬盘。只要有足够的物理内存,page cache里内容将永远保存在那里知道系统重启或物理页面回收(reclaim)。对于要写入硬盘的数据,先保存在page cache,过一段时间再写入硬盘。由于不同的访问方式,磁盘上的同一数据可能在page cache 有多份拷贝,每份用不同的address_space结构来表示。Page cache 可分为用于存取磁盘文件、磁盘块数据和交换高速缓存(swap cache)。
交换高速缓存是指这样一部分物理内存空间,其装载的数据曾经存储在交换分区,在被导入物理内存后,交换分区目前还保留这些数据。只要这些页面在导入交换分区后没有被修改,则下次此页面被导出物理内存时,就不必再进行写操作,这些页面都可以简单的丢弃。在交换频繁发生的系统中,Swap Cache可以省下很多不必要且耗时的磁盘操作。优点可以从两方面讲:当某个进程需要这些数据时,因为已经在物理内存,因此没有缺页操作;但交换高速缓存需要给其它进程使用时,如果这些数据没有被改变,就不需要转储到交换区的操作,这就减少了I/O操作。

Page Cache 用来加速硬盘上可执行映象文件与数据文件的存取。它每次缓冲一个页面的文件内容。页面从磁盘上读入内存后缓存在page cache中。page cache缓冲文件的一页内容, buffer cache缓冲磁盘块内容,page cache写回时会使用临时的buffer cache来写磁盘。Buffer Cache的单元的大小一般固定(例如说512字节)并且包含从块设备读出或者写入的信息块。块设备是仅能够以固定大小块进行读写操作的设备。利用设备标志符和所需块号作索引可以在buffer cache中迅速地找到数据。块设备只能够通过buffer cache来存取。如果数据在buffer cache中可以找到则无需从物理块设备(如硬盘)中读取,这样可以加速访问。

1.1.6. 缺页(page fault
当CPU所需要的指令或数据不在物理内存时,就会产生缺页中断。当该中断是从设备(如硬盘)子系统包括交换区获取指令或数据时,我们称之为主缺页(major paging)中断。主缺页中断导致延时。对于正在一个系统中运行的任务,我们把其所占有的那部分物理内存称之为该任务的工作集(work set)。当CPU所需要的指令或数据不在对应的工作集,即在相应的任务的页表中没有该物理页的映像(mapped pages),但已经存在于物理内存,即可以在物理内存的其它地址上找到,但还未建立物理内存与虚拟地址空间转换关系,这时所产生缺页中断称之为次缺页(minor paging)中断。例如系统种的共享库,就属于这种情形,实际上多个进程只是共享 同一共享库的物理内存页,第一个引用共享库的进程导致一个主缺页,而之后的其它进程引用则只是次缺页,在给相应的工作集上建立到该库的物理内存页的连接。

1.1.7. 物理页的状态
(1)闲置(FREE):闲置的物理页可以立即用于分配。
(2)活动(ACTIVE):活跃物理内存指正在被内核或用户进程使用的物理内存。
(3)不活跃物理内存(inactive): 不活跃物理内存可分为:(i)“dirty” 页,(ii)“clean”页,(iii)“laundry”页。当物理内存不够使用(即闲置的物理页数无法满足进程的请求)时,首先是不活跃物理内存将被转储到硬盘上,然后从不活跃物理内存回收可用于分配的物理内存页。不活跃物理内存包括页高速缓存,缓冲区高速缓存,交换高速缓存中的部分空间。当不活跃物理内存页较少时,说明物理内存的短缺。


1.1.8. 回收物理内存

可回收的物理内存分为:
(1) 用户态地址空间的匿名物理页
(2) tmpfs文件系统已经映射的页
(3) 用户态地址空间中已经映射的物理页
(4) kernel cache
映射的物理页指该物理页已经映射到某一文件的一部分。匿名物理页指那些起内容不需要在外部设备上存储的物理页。
回收的方式:
(1) 触发式回收:系统在处理物理内存分配请求时失败。
(2) 定期回收

2007年4月15日星期日

CPU性能--整体性能功能监视工具

Linux中常用的监控CPU整体性能的工具有:
§ mpstat: mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。
§ vmstat:只能查看所有CPU的平均信息;查看cpu队列信息;
§ iostat: 只能查看所有CPU的平均信息。
§ sar: 与mpstat 一样,不但能查看CPU的平均信息,还能查看指定CPU的信息。
§ top:显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示。
§ oprofile:OProfile 是一个低开销的系统全局的性能监视工具。它使用处理器上的性能监视硬件来检索关于内核以及系统上的可执行文件的信息,例如内存是何时被引用的;L2 缓存请求数量;收到的硬件中断数量等
1.1.1. /proc/stat/
包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。

[work@builder ~]$ cat /proc/stat
cpu 432661 13295 86656 422145968 171474 233 5346
cpu0 123075 2462 23494 105543694 16586 0 4615
cpu1 111917 4124 23858 105503820 69697 123 371
cpu2 103164 3554 21530 105521167 64032 106 334
cpu3 94504 3153 17772 105577285 21158 4 24
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
ctxt 19067887
btime 1139187531
processes 270014
procs_running 1
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”:当前被阻塞的任务的数目。

1.1.2. /proc/loadavg
该文件中的所有值都是从系统启动开始累计到当前时刻。该文件只给出了所有CPU的集合信息,不能该出每个CPU的信息。

[root@localhost ~]# cat /proc/loadavg
4.61 4.36 4.15 9/84 5662

每个值的含义为:
第三部分 参数
第四部分 解释
第五部分 lavg_1 (4.61)
第六部分 1-分钟平均负载
第七部分 lavg_5 (4.36)
第八部分 5-分钟平均负载
第九部分 lavg_15(4.15)
第一〇部分 15-分钟平均负载
nr_running (9) 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思
nr_threads (84) 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)
last_pid(5662) 最大的pid值,包括轻量级进程,即线程。

假设当前有两个CPU,则每个CPU的当前任务数为4.61/2=2.31

1.1.3. uptime
uptime是Linux系统常用的命令,用来报告系统已经运行多长时间,依此显示的信息:现在时间,系统已经运行了的时间,目前有多少登陆用户, 1分钟系统平均负载,5分钟系统平均负载,15分钟系统平均负载。该命令从/proc/loadavg 中获得load average的信息。
范例1:系统只用一个CPU

[root@localhost ~]# uptime
12:20:49 up 3 days,9:20, 5 users, load average 1.10 1.32 1.15

对于一个CPU的系统来说,范例1中的平均负载高了些。通常来说:如果系统有n个CPU而且平均负载小于n,则说明某些CPU还有空闲的时间片。通过该命令,你能知道CPU是否繁忙,但是无法知道为什么忙。

1.1.4. mpstat

mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。下面只介绍 mpstat与CPU相关的参数,mpstat的语法如下:
mpstat [-P {ALL}] [internal [count]]

参数的含义如下:

第一一部分 参数
第一二部分 解释
第一三部分 -P {ALL}
第一四部分 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
第一五部分 internal
第一六部分 相邻的两次采样的间隔时间
第一七部分 count
第一八部分 采样的次数,count只能和delay一起使用

当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。与CPU有关的输出的含义如下:

第一九部分 参数
第二〇部分 解释
第二一部分 从/proc/stat获得数据
第二二部分 CPU
第二三部分 处理器ID
第二四部分
第二五部分 user
第二六部分 在internal时间段里,用户态的CPU时间(%) ,不包含 nice值为负 进程
第二七部分 dusr/dtotal*100
第二八部分 nice
第二九部分 在internal时间段里,nice值为负进程的CPU时间(%)
第三〇部分 dnice/dtotal*100
第三一部分 system
第三二部分 在internal时间段里,核心时间(%)
第三三部分 dsystem/dtotal*100
第三四部分 iowait
第三五部分 在internal时间段里,硬盘IO等待时间(%)
第三六部分 diowait/dtotal*100
第三七部分 irq
第三八部分 在internal时间段里,软中断时间(%)
第三九部分 dirq/dtotal*100
第四〇部分 soft
第四一部分 在internal时间段里,软中断时间(%)
第四二部分 dsoftirq/dtotal*100
第四三部分 idle
第四四部分 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%)
第四五部分 didle/dtotal*100
第四六部分 intr/s
第四七部分 在internal时间段里,每秒CPU接收的中断的次数
第四八部分 dintr/dtotal*100

CPU总的工作时间=total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
duser=user_cur – user_pre
dtotal=total_cur-total_pre
其中_cur 表示当前值,_pre表示interval时间前的值。上表中的所有值可取到两位小数点。

范例1:average mode (粗略信息)
当mpstat不带参数时,输出为从系统启动以来的平均值。

[work@builder linux-2.6.14]$ mpstat
Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/16/2005

09:38:46 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s
09:38:48 AM all 23.28 0.00 1.75 0.50 0.00 0.00 74.47 1018.59


范例2: 每2秒产生了4个处理器的统计数据报告
下面的命令可以每2秒产生了4个处理器的统计数据报告,一共产生三个interval 的信息,然后再给出这三个interval的平均信息。默认时,输出是按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的活跃状态。。


[work@builder linux-2.6.14]$ mpstat -P ALL 2 3
Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/16/2005

09:38:46 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s
09:38:48 AM all 23.28 0.00 1.75 0.50 0.00 0.00 74.47 1018.59
09:38:48 AM 0 2.01 0.00 1.01 0.50 0.00 0.00 96.48 5.03
09:38:48 AM 1 51.26 0.00 3.02 1.01 0.00 0.00 44.72 7.04
09:38:48 AM 2 17.09 0.00 2.01 0.50 0.00 0.00 81.41 0.00
09:38:48 AM 3 22.61 0.00 1.01 0.00 0.00 0.00 76.38 1006.03

09:38:48 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s
09:38:50 AM all 24.22 0.00 1.25 1.25 0.00 0.00 73.28 1049.75
09:38:50 AM 0 1.00 0.00 1.00 0.00 0.00 0.00 98.01 28.86
09:38:50 AM 1 93.03 0.00 3.48 0.00 0.00 0.00 2.99 25.37
09:38:50 AM 2 1.99 0.00 0.50 4.98 0.00 0.00 92.54 0.00
09:38:50 AM 3 1.00 0.00 0.50 0.00 0.00 0.00 98.51 995.52

09:38:50 AM CPU %user %nice %system %iowait %irq %soft %idle intr/s
09:38:52 AM all 23.69 0.00 2.37 0.37 0.00 0.12 73.44 1028.36
09:38:52 AM 0 2.99 0.00 1.49 0.00 0.00 0.50 95.02 111.94
09:38:52 AM 1 52.74 0.00 2.99 1.00 0.00 0.00 42.29 4.48
09:38:52 AM 2 14.93 0.00 1.99 0.00 0.00 0.00 82.09 4.48
09:38:52 AM 3 23.38 0.00 1.99 0.50 0.00 0.00 73.13 907.46

Average: CPU %user %nice %system %iowait %irq %soft %idle intr/s
Average: all 23.73 0.00 1.79 0.71 0.00 0.04 73.73 1032.28
Average: 0 2.00 0.00 1.16 0.17 0.00 0.17 96.51 48.75
Average: 1 65.72 0.00 3.16 0.67 0.00 0.00 29.95 12.31
Average: 2 11.31 0.00 1.50 1.83 0.00 0.00 85.36 1.50
Average: 3 15.64 0.00 1.16 0.17 0.00 0.00 82.70 969.55
[work@builder linux-2.6.14]$


范例3:比较带参数和不带参数的mpstat的结果。
在后台开一个2G的文件
> cat 1.img —/* 1.img=2GBytes

然后在另一个终端运行mpstat命令

[root@localhost ~]# mpstat
Linux 2.6.13 (localhost.localdomain) 2005年12月15日

13时48分52秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13时48分52秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12
[root@localhost ~]# mpstat
Linux 2.6.13 (localhost.localdomain) 2005年12月15日

13时48分53秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13时48分53秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12
[root@localhost ~]# mpstat
Linux 2.6.13 (localhost.localdomain) 2005年12月15日

13时48分53秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13时48分53秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12
[root@localhost ~]# mpstat
Linux 2.6.13 (localhost.localdomain) 2005年12月15日

13时48分54秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13时48分54秒 all 1.57 0.00 0.24 0.15 0.12 0.01 97.92 308.12
[root@localhost ~]#

然后再运行命令:mpstat 3 100 /*每隔3秒给出一次信息,共给出100次*/
[root@localhost ~]# mpstat 3 100
Linux 2.6.13 (localhost.localdomain) 2005年12月15日

13时48分25秒 CPU %user %nice %system %iowait %irq %soft %idle intr/s
13时48分28秒 all 96.00 0.00 4.00 0.00 0.00 0.00 0.00 401.67
13时48分31秒 all 96.01 0.00 3.65 0.00 0.33 0.00 0.00 393.36
13时48分34秒 all 95.36 0.00 4.30 0.00 0.33 0.00 0.00 532.45
13时48分37秒 all 94.00 0.00 5.67 0.00 0.33 0.00 0.00 400.33
13时48分40秒 all 95.00 0.00 5.00 0.00 0.00 0.00 0.00 330.33
13时48分43秒 all 95.33 0.00 4.33 0.00 0.33 0.00 0.00 337.33
13时48分46秒 all 94.68 0.00 4.98 0.00 0.33 0.00 0.00 329.57
13时48分49秒 all 95.67 0.00 4.00 0.00 0.33 0.00 0.00 417.33
13时48分52秒 all 95.67 0.00 3.67 0.00 0.67 0.00 0.00 448.00
13时48分55秒 all 94.02 0.00 5.32 0.00 0.33 0.33 0.00 410.96
13时48分58秒 all 95.35 0.00 4.32 0.00 0.33 0.00 0.00 466.45

[root@localhost ~]#


上两表显示出当要正确反映系统的情况,需要正确使用命令的参数。vmstat 和iostat 也需要注意这一问题。

1.1.5. vmstat

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写, 是实时系统监控工具。该命令通过使用knlist子程序和/dev/kmen伪设备驱动器访问这些数据,输出信息直接打印在屏幕。vmstat反馈的与CPU相关的信息包括:

(1)多少任务在运行
(2)CPU使用的情况
(3)CPU收到多少中断
(4)发生多少上下文切换

下面只介绍 Vmstat与CPU相关的参数
vmstat的语法如下:
  vmstat [delay [count]]

参数的含义如下:
参数
解释
delay
相邻的两次采样的间隔时间
count
采样的次数,count只能和delay一起使用

当没有参数时,vmstat则显示系统启动以后所有信息的平均值。有delay时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个delay时间段的平均信息。当系统有多个CPU时,输出为所有CPU的平均值。

与CPU有关的输出的含义 (采用进一法)
第四九部分 参数
第五〇部分 解释
第五一部分 从/proc/stat获得数据
第五二部分 任务的信息
第五三部分
第五四部分
r
在internal时间段里,运行队列里等待CPU的任务(任务)的个数,即不包含vmstat进程
procs_running-1
b
在internal时间段里,被资源阻塞的任务数(I/0,页面调度,等等.) ,通常情况下是接近0的
procs_blocked
第五五部分 CPU信息
第五六部分 所有值取整(四舍五入)
第五七部分
us
在internal时间段里,用户态的CPU时间(%),包含 nice值为负进程
(duser+dnice)/dtotal*100
sy
在internal时间段里,核心态的CPU时间(%)
(dsystem+dirq+dsoftirq)/dtotal*100
id
在internal时间段里,cpu空闲的时间,不包括等待i/o的时间(%)
didle/dtotal*100
wa
在internal时间段里,等待i/o的时间(%)
diowait/dtotal*100
第五八部分 系统信息
第五九部分
第六〇部分
in
在internal时间段里,每秒发生中断的次数
dintr/interval
cs
在internal时间段里,每秒上下文切换的次数,即每秒内核任务交换的次数
dctxt/interval

total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
dtotal=total_cur-total_pre


范例1:average mode (粗略信息)
当vmstat不带参数时,对应的输出值是从系统启动以来的平均值,而r和b则对应的是完成这一命令时,系统的值。从下面例子,可以看出系统基本出去闲置状态(idle)。自启动以来,CPU在用户态消耗时间为5%,在核心态消耗为本1%,剩下的为闲置时间。需要指出的是:这里的用户态时间包括nice值为负的进程的时间。

[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 4580 428 98516 0 0 49 6 15 19 2 1 96 1
[root@localhost ~]#


范例2:average mode (详细信息)
命令格式:
vmstat –s
这里只讨论与CPU相关信息。“CPU ticks”表示自系统启动CPU运行时间,这里以tick为时间单位。用tick来西安市us,sy id 和wa的时间;forks指自从系统启动以来,所创建的新任务的个数。这些信息从/proc/stat 的第一行和”processes”行获得。

[root@localhost ~]# vmstat -s
255280 total memory
244216 used memory
206624 active memory
21208 inactive memory
11064 free memory
628 buffer memory
91396 swap cache
255992 total swap
24 used swap
255968 free swap
973400 non-nice user cpu ticks
477 nice user cpu ticks
206168 system cpu ticks
43567714 idle cpu ticks
373234 IO-wait cpu ticks
62732 IRQ cpu ticks
1972 softirq cpu ticks
22366502 pages paged in
88756936 pages paged out
0 pages swapped in
0 pages swapped out
135634319 interrupts
137288441 CPU context switches
1134440368 boot time
208990 forks
[root@localhost ~]#

结果解释

参数
描述
/proc/stat
non-nice user cpu ticks
自系统启动以来,CPU在用户态下运行非nice进程的时间,单位为jiffies
user
nice user cpu ticks
自系统启动以来,CPU在用户态下运行nice进程的时间,单位为jiffies
nice
system cpu ticks
自系统启动以来,CPU处于系统状态的时间,单位为jiffies
sys
idle cpu ticks
自系统启动以来,CPU处于闲置状态的时间,单位为jiffies
idle
IO-wait cpu ticks
自系统启动以来,CPU处理IO中断的时间,单位为jiffies
iowait
IRQ cpu ticks
自系统启动以来,CPU处理硬中断的时间,单位为jiffies
irq
softing cpu ticks
自系统启动以来,CPU处理软中断的时间,单位为jiffies
Softirq
interrupts
自系统启动以来,发生的所有的中断的次数目
Intr
CPU context switches
自系统启动以来,发生的上下文交换的次数
Ctxt
boot time
自系统启动以来到现在运行的时间,单位为秒。
btime
forks
自系统启动以来所创建的任务的个数目。
Process


范例3:定期采样(delay [count])
定期采样数据是指每隔delay时间,采样一次。当count 为0时,vmstat 将不停地定期报告信息;否则当报告count次后,vmstat 命令停止运行。
第一行的信息如同范例1,是自系统启动以来的平均信息。从第二行开始,每行的意思是:r和b采样那一时刻系统运行队列和等待队列的情况;而usystem参数(in,cs)以及CPU参数(us,sy,id,wa)对应的输出值是系统在前一个delay的情况。
从下面例子可以看出上下文交换的次数小于中断的发生次数。当系统大部分时间是空闲并且中断大部分是时间中断时,这种现象极可能发生。当时间中断发生时, 因为调度器没有什么任务可调度,所以很少发生上下文切换。

[root@localhost ~]# vmstat 2 4
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 24 11032 652 91396 0 0 49 6 15 19 2 1 96 1
0 0 24 11032 652 91396 0 0 0 0 377 464 1 0 99 0
0 0 24 11024 652 91396 0 0 0 0 387 476 1 0 100 0
0 0 24 11024 652 91396 0 0 0 0 323 377 0 0 100 0
[root@localhost ~]#


1.1.6. iostat

iostat [-t] [-c] [interval [count]]

参数的含义如下:
第六一部分 参数
第六二部分 解释
第六三部分 T
第六四部分 表示输出采用的时间
第六五部分 C
第六六部分 表示只显示CPU的信息
第六七部分 Internal
第六八部分 相邻的两次采样的间隔时间
第六九部分 count
第七〇部分 采样的次数,count只能和delay一起使用

当没有参数时,iostat则显示系统启动以后所有信息的平均值。

与CPU有关的输出的含义

第七一部分 参数
第七二部分 解释
第七三部分 从/proc/stat获得
第七四部分 CPU
第七五部分 处理器ID
第七六部分
第七七部分 user
第七八部分 在internal时间段里,用户态的CPU时间(%) ,不包含 nice值为负进程
第七九部分 dusr/dtotal*100
第八〇部分 nice
第八一部分 在internal时间段里,nice值为负进程的CPU时间(%)
第八二部分 dnice/dtotal*100
第八三部分 sys
第八四部分 在internal时间段里,核心时间(%)
第八五部分 (dsystem+dirq+dsoftirq)/dtotal*100
第八六部分 iowait
第八七部分 在internal时间段里,硬盘IO等待时间(%)
第八八部分 diowait/dtotal*100
第八九部分 idle
第九〇部分 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%)
第九一部分 didle/dtotal*100

total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
dtotal=total_cur-total_pre

有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。

范例1:


[root@localhost /]# dd if=/dev/zero of=/1.img bs=1024 count=1000000&
[1] 15854
[root@localhost /]# iostat -c 1
Linux 2.6.13 (localhost.localdomain) 2005年12月19日

avg-cpu: %user %nice %sys %iowait %idle
1.94 0.00 0.56 0.75 96.75

avg-cpu: %user %nice %sys %iowait %idle
3.65 0.00 13.87 82.48 0.00

avg-cpu: %user %nice %sys %iowait %idle


1.1.7. sar
sar是System Activity Reporter(系统活跃情况报告)的缩写。顾名思义,sar工具将对系统当前的状态进行采样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统采样,获得大量的采样数据;采样数据和分析的结果都可以存入文件,所需的负载很小。这些是检查历史数据和一些近来的系统事件。sar用于检查的性能数据类似于vmstat, mpstat和 iostat的显示。 sar的数据是一段时间保存的内容,因此可以察看过去的信息。 lastcomm可以现在系统最近被执行的命令。这些可以用在系统审计中。sa 可以在*BSD和Linux中找到,它给用户在系统审计中更多的选项来收集信息。
在反馈CPU整体信息方面,sar 反馈的与CPU相关的信息包括:

(1)多少任务在运行
(2)CPU使用的情况
(3)CPU收到多少中断
(4)发生多少上下文切换

sar的语法如下:

sar [-options] [interval [count]]

其中,internal是两次采样的间隔时间;count是指采样的次数;与CPU相关的options有:
参数的含义如下:
参数
解释
-c
表示输出采用的时间
-e hh:mm:ss
表示只显示CPU的信息
-i {irq SUMALLXALL}
相邻的两次采样的间隔时间
-P {cpuALL}

-q
显示在采样的时刻,可运行队列的任务的个数,以及系统平均负载
-u
CPU 使用的情况,报告了cpu的用户态,系统态,等待I/O和空闲时间上的百分比。 -w:每秒上下文交换率
-o:filename
将结果放在文件里
-f:filename
表示从file文件中取出数据,如果没有指定-f file,则从标准数据文件

范例1:
首先在后台运行一个创建1GB文件的任务,然后输入:“sar -c -q -w 3 2”,表示每3秒采样一次,采样两次,可以看到系统有82个任务,但是在10时12分08秒时有一个任务在运行,在下一次采样10时12分11秒时,没有任务在运行。

[root@localhost /]# dd if=/dev/zero of=/1.img bs=1024 count=1000000&
[1] 16213
[root@localhost /]# sar -c -q -w -I SUM 3 2
Linux 2.6.13 (localhost.localdomain) 2005年12月19日

10时12分05秒 proc/s
10时12分08秒 0.00

10时12分05秒 cswch/s
10时12分08秒 692.33

10时12分05秒 INTR intr/s
10时12分08秒 sum 895.33

10时12分05秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
10时12分08秒 1 82 0.20 0.08 0.09

10时12分08秒 proc/s
10时12分11秒 0.00

10时12分08秒 cswch/s
10时12分11秒 648.50


10时12分08秒 INTR intr/s
10时12分11秒 sum 461.79

10时12分08秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
10时12分11秒 0 82 0.59 0.16 0.12

Average: proc/s
Average: 0.00

Average: cswch/s
Average: 670.38

Average: INTR intr/s
Average: sum 678.20

Average: runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
Average: 0 82 0.40 0.12 0.10


与CPU有关的输出的含义
参数
解释
从/proc/stat获得数据
proc/s
在internal时间段里,每秒上下文切换率
dprocesses/dtotal*100
cswch
在internal时间段里,每秒上下文切换率
dctxt/dtotal*100
intr/s
在internal时间段里,每秒CPU接收的中断的次数
didle/dtotal*100


从/proc/loadavg获得数据
runq-sz
采样时,运行队列中任务的个数,不包括vmstat 进程。
procs_running-1
plist-sz
采样时,系统中活跃的任务的个数
nr_threads
ldavg-1
采样的前一秒钟系统的负载(%)
lavg_1
ldavg-5
采样的5秒钟系统的负载(%)
lavg_5
ldavg-15
采样的前15秒钟系统的负载(%)
lavg_15

下面输入命令“sar 3 2”,表示每隔3秒显示CPU的状态,共显示2次。此时创建1GB文件的任务还在后台进行。

[root@localhost /]# sar 3 2
Linux 2.6.13 (localhost.localdomain) 2005年12月19日
10时12分37秒 CPU %user %nice %system %iowait %idle
10时12分40秒 all 2.91 0.00 14.18 82.91 0.00
10时12分43秒 all 2.66 0.00 14.95 82.39 0.00
Average: all 2.78 0.00 14.58 82.64 0.00
[root@localhost /]#


与CPU有关的输出的含义
参数
解释
从/proc/stat获得数据
CPU
处理器ID

user
在internal时间段里,用户态的CPU时间(%) ,不包含 nice值为负进程
dusr/dtotal*100
nice
在internal时间段里,nice值为负进程的CPU时间(%)
dnice/dtotal*100
sys
在internal时间段里,核心时间(%)
(dsystem+dirq+dsoftirq)/dtotal*100
iowait
在internal时间段里,硬盘IO等待时间(%)
diowait/dtotal*100
idle
在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%)
dirq/dtotal*100

输入命令“sar”,当不带任何参数时,表示每一秒采样一次,每次显示从系统到该采样时系统的平均信息。从Fig.8看出在10时12分43秒,系统idle应该为0,而Fig.9

[root@localhost /]# sar
Linux 2.6.13 (localhost.localdomain) 2005年12月19日

00时00分01秒 CPU %user %nice %system %iowait %idle
00时10分01秒 all 0.11 0.00 0.16 0.00 99.73
00时20分01秒 all 0.13 0.00 0.15 0.00 99.72
.
.
.
08时10分01秒 all 0.11 0.00 0.14 0.00 99.75
08时20分01秒 all 0.13 0.00 0.15 0.00 99.72
08时30分01秒 all 0.13 0.00 0.16 0.00 99.71
08时40分01秒 all 3.96 0.00 0.57 0.34 95.12
08时50分01秒 all 7.42 0.00 0.77 0.74 91.07
09时00分01秒 all 4.93 0.00 1.97 8.14 84.95
09时10分01秒 all 4.81 0.00 0.69 0.29 94.21
09时20分01秒 all 3.09 0.00 0.93 1.72 94.25
09时30分01秒 all 7.59 0.00 1.59 1.27 89.55
09时40分01秒 all 2.27 0.00 0.74 0.32 96.67
09时50分01秒 all 4.81 0.00 0.81 0.07 94.31
10时00分02秒 all 1.84 0.00 2.17 7.78 88.21
10时10分01秒 all 0.63 0.00 0.24 0.20 98.93
10时20分02秒 all 1.70 0.00 1.85 7.95 88.50
10时30分01秒 all 0.50 0.00 0.21 0.21 99.08
Average: all 0.81 0.00 0.33 0.49 98.37
[root@localhost /]#

total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
dtotal=total_cur-total_pre
上表中的所有值可取到两位小数点。

范例2:


[work@builder linux-2.6.14]$ sar –P ALL 2 3
Linux 2.6.9-5.31AXsmp (builder.redflag-linux.com) 12/28/2005

08:28:45 AM CPU %user %nice %system %iowait %idle
08:28:47 AM all 0.00 0.00 0.00 0.00 100.00
08:28:47 AM 0 0.00 0.00 0.00 0.00 100.00
08:28:47 AM 1 0.00 0.00 0.00 0.00 100.00
08:28:47 AM 2 0.00 0.00 0.00 0.00 100.00
08:28:47 AM 3 0.00 0.00 0.00 0.00 100.00

08:28:47 AM CPU %user %nice %system %iowait %idle
08:28:49 AM all 0.00 0.00 0.00 0.00 100.00
08:28:49 AM 0 0.00 0.00 0.00 0.00 100.00
08:28:49 AM 1 0.00 0.00 0.00 0.00 100.00
08:28:49 AM 2 0.00 0.00 0.00 0.00 100.00
08:28:49 AM 3 0.00 0.00 0.00 0.00 100.00

08:28:49 AM CPU %user %nice %system %iowait %idle
08:28:51 AM all 0.00 0.00 0.12 0.25 99.63
08:28:51 AM 0 0.00 0.00 0.00 0.00 100.00
08:28:51 AM 1 0.00 0.00 0.00 0.50 99.50
08:28:51 AM 2 0.00 0.00 0.00 0.00 100.00
08:28:51 AM 3 0.00 0.00 0.00 0.00 100.00

Average: CPU %user %nice %system %iowait %idle
Average: all 0.00 0.00 0.04 0.08 99.88
Average: 0 0.00 0.00 0.00 0.00 100.00
Average: 1 0.00 0.00 0.00 0.17 99.83
Average: 2 0.00 0.00 0.00 0.00 100.00
Average: 3 0.00 0.00 0.00 0.00 100.00
Fig.1.


1.1.8. top
top命令提供了实时的对系统处理器的状态监视,即可以通过用户按键来不断刷新当前状态。如果前台执行该命令,它将独占前台,直到用户终止该程序为止,但是该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。
下面是该命令的语法格式:
top [-] [d delay] [options]

一些参数的含义如下:
参数
解释
d delay
相邻的两次采样的间隔时间
q
该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行
-l
不显示空闲进程,默认时,top显示空闲进程
-S
将系统进程信息也显示于屏幕,默认时,不显示。


与CPU有关的输出的含义
参数
解释
CPU信息

从/proc/stat获得信息
us
在internal时间段里,用户态的CPU时间(%),不包含nice值为负的任务占用的CPU的时间

dusr/dtotal*100
ni
在internal时间段里,nice值为负的任务的用户态的Niced进程的CPU时间(%)
dnice/dtotal*100
sy
在internal时间段里,核心态的CPU时间(%)
dsystem/dtotal*100
id
在internal时间段里,cpu空闲的时间,不包括等待i/o的时间(%)
didle/dtotal*100
wa
在internal时间段里,等待i/o的时间(%)
diowait/dtotal*100
hi
在internal时间段里,硬中断时间(%)
dirq/dtotal*100
si
在internal时间段里,软中断时间(%)
dsoftirq/dtotal*100
任务

total
采样时,系统全部进程的个数,包括正在运行的top进程,不包括线程。
=running+sleeping+stopped+zombie
running
采样时,运行队列的进程的个数,但不包含top这个进程
通过判断/proc/pid/status中stat的值。
sleeping
采样时,可中断和不可中断状态的进程的个数
stopped
采样时,停止状态的进程的个数
zombie
采样时,僵尸状态的进程的个数


运行中的参数的含义
参数
解释
q
退出程序
r
重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID
S
切换到累计模式
L
切换显示平均负载和启动时间信息
T
切换显示进程和CPU状态信息
M
切换显示内存信息
s
改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位为s。如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加

  
范例1:查看 键入top命令查看系统状况

>top
top - 16:52:17 up 3 min, 1 user, load average: 0.10, 0.27, 0.14
Tasks: 55 total, 1 running, 54 sleeping, 0 stopped, 0 zombie
top - 16:52:31 up 4 min, 1 user, load average: 0.08, 0.26, 0.13
Tasks: 55 total, 1 running, 54 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 0.3% sy, 0.0% ni, 99.0% id, 0.0% wa, 0.3% hi, 0.0% si
Mem: 251924k total, 238168k used, 13756k free, 4420k buffers
Swap: 0k total, 0k used, 0k free, 165200k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4171 root 15 0 48404 12m 2220 S 0.7 5.0 0:01.36 X
4404 root 15 0 66540 16m 13m S 0.3 6.9 0:02.31 kdeinit
1 root 16 0 1772 544 464 S 0.0 0.2 0:00.61 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
3 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 events/0
4 root 5 -10 0 0 0 S 0.0 0.0 0:00.02 khelper
5 root 15 -10 0 0 0 S 0.0 0.0 0:00.00 kacpid
19 root 5 -10 0 0 0 S 0.0 0.0 0:00.00 kblockd/0
29 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pdflush
30 root 15 0 0 0 0 S 0.0 0.0 0:00.01 pdflush
32 root 14 -10 0 0 0 S 0.0 0.0 0:00.00 aio/0
20 root 15 0 0 0 0 S 0.0 0.0 0:00.00 khubd
31 root 15 0 0 0 0 S 0.0 0.0 0:00.01 kswapd0
618 root 25 0 0 0 0 S 0.0 0.0 0:00.00 kseriod


第一行的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。
第二行为进程情况,依次为进程总数、休眠进程数、运行进程数、僵死进程数、终止进程数。
第三行为CPU状态,依次为用户占用、系统占用、优先任务占用、闲置任务占用。
第四行为内存状态,依次为平均可用内存、已用内存、空闲内存、共享内存、缓存使用内存。
第五行为交换状态,依次为平均可用交换容量、已用容量、闲置容量、交换高速缓存容量。
然后下面就是和ps相仿的各进程情况列表了。
总的来说,top命令的功能强于ps,但需要长久占用前台,所以用户应该根据自己的情况来使用这个命令。

CPU性能--1.1 基本概念

1.1.1. 进程和线程
可执行文件由指令和数据组成。进程就是在计算机上运行的可执行文件针对特定的输入数据的一个实例,同一个可执行程序文件如果操作不同的输入数据就是两个不同的进程。
线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享其所附属的进程的所有的资源,包括打开的文件、页表(因此也就共享整个用户态地址空间)、信号标识及动态分配的内存等等。线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一物理内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
Linux在核外采用1:1线程模型,即用一个核心进程(轻量进程)对应一个线程,将线程调度等同于进程调度,交给核心完成,而其它诸如线程取消、线程间的同步等工作,都是在核外线程库中完成的。因此可以把进程看作一组线程,这组线程拥有相同的线程组号(TGID),这个TGID就是这组线程序所附属的进程的ID号,每个线程的ID号就是我们用ps命令所看到的LWP号。
为了方便,从现在起我们用任务来代替进程和线程,即每提到任务,我们就是指线程和进程,除非要强调线程和进程之间的不同之处。任务的周期从被fork开始一直到给任务从进程表中消失。一个进程包括:正文段(text),数据段(data),栈段(STACK)和共享内存段(SHARED MEMORY)。
1.1.2. 中断和信号
(1)中断
中断通常定义为用来改变CPU执行的指令的顺序的事件。对于其分类可谓是仁者见仁,智者见智,但毕竟有胜于无,这里给出一种分类:硬中断、异常中断和软中断。硬中断也称为外部中断,分为两类,可屏蔽和不可屏蔽。/proc/interrupts列出了当前系统定义的所有硬中断。
异常中断是系统运行出现异常时候CPU自动产生的中断,如除数为零、使用虚拟内存机制时的缺页保护异常等。软中断是由程序指令中包含INT 指令产生的中断,如单步跟棕;该中断处理的一部分任务可以延迟一会再处理。

1.1.3. CPU 的状态
CPU的状态可分为有7种:
(1)常规用户态(目态): CPU所执行的任务在访问该任务自己的内存空间;
(2)核心态(管态):如果CPU正在运行核心程序或在CPU上运行的任务正在通过系统调用请求内核服务,例如访问硬件,这时就称CPU处于核心态;
(3)CPU运行nice任务,一个优先级别低于普通任务的优先级别的任务;
(4)io等待: 由于任务等待I/O而使CPU处于空闲状态,这些I/O主要指block I/O,raw I/O,VM paging/swapins;
(5)闲置:系统中的所有任务由于等待除了I/O以外的事件的发生而处于睡眠状态,或者系统没有任务;
(6)CPU正在处理硬中断,即在irq状态;
(7)CPU正在处理软中断。

从用户态转换为核心态的唯一途径是中断。CPU处于用户态时,所运行的程序只能执行非特权指令,如果用户程序在用户态下执行特权指令,将发生中断,由操作系统获得控制。操作系统在核心态下运行。从核心态到用户态可以通过修改程序状态字来实现,这将伴随这由操作系统程序到用户程序的转换。

1.1.4.任务优先级
每个任务在Kernel2.6 中不是由调度器统一计算,而是独立计算。优先级由两部分构成:
(1)静态优先级。Nice是进程的静态优先级。静态优先级在任务创建的时候就被赋值,并且不变(除非用系统调用改变任务的nice值);
(2)动态优先级(task->counter-MAX_RT_PRIO)。它定义了一个在就绪队列的进程当它得到CPU后可运行的时间。计算机是以时钟中断作为时间的计数器,每发送一个时钟中断,动态优先级上的时间片就减少一个时钟中断的时间,时间片减到0的时候就退出该进程而执行另一个进程。任务的动态优先级则是跟静态优先级和平均等待时间(sleep_avg)有关。对于实时任务的优先级在创建的时候就确定了,而且一旦确定以后就不再改变,所以下面部分仅对于非实时任务而言,任务的平均等待时间越大,任务的动态优先级也就越高。

有以下几种情况需要计算任务的优先级:
(1)创建新任务,使用函数effective_prio()(因为此时任务尚未进行调度,没有sleep_avg和interactive_credit可言);
(2)唤醒等待任务时,使用函数recalc_task_prio ()来计算任务动态优先级。
(3)任务用完时间片以后,被重新插入到active array或者expired array的时候需要
(4)其它情况,如IDLE任务初始化等时候。
动态优先级的计算公式为:PRI=NICE+40+CPU_ PENALTY,从公式中可以看到大多数用户任务的优先级是大于40的。可以使用“ps -l”和“ps -emo THREAD”命令分别查寻任务和线程的CPU使用状态。使用“nice -n proname”和“renice +n proid”来修改任务的优先级。nice值的系统缺值为20。
renice command. It uses the same priorities as nice, but is used on processes that are already running. It can take the -p option for a specific PID, the -g option for a process group, or -u for the processes belonging to a specific user.

1.1.5. CPU队列长度
一个任务如果拥有了除CPU以外的所有运行时所需要的资源,我们就称该任务为可运行任务。可运行任务包含等待队列和正在CPU上运行的任务,这些任务构成了运行队列。运行队列长度为任务的个数,运行队列越长,任务等待时间越长。
一个阻塞任务可能在等待I/O数据或等待一个系统调用的结果。当一个任务即将进入运行队列时,内核首先计算其优先权,然后再放入相应的优先级的运行队列里;在运行过程中,可运行的任务的优先级每秒更新一次,因此其在可运行队列的位置可动态调整。

1.1.6. 上下文切换的比率
CPU一般在某一时刻只能运行一个任务。为了给用户一个并行的感觉,Linux内核不停在各个任务之间切换,这个切换叫做上下文切换。上下文包括:CPU的所有寄存器中的值、任务的状态以及堆栈中的内容。上下文切换的主要任务是保存老任务CPU状态,并加载新任务的保存状态,用新任务的内存映像替换老任务的内存映像。因此上下文切换导致大量信息的转移,导致了昂贵的上下文切换开销。因此,要尽可能减少该切换。
要减少切换,必须知道切换如何发生。在下列情况下发生上下文切换:
§ 任务结束;
§ 任务使用完时间片,为使各个任务能公平地使用CPU,内核通过时间中断来实现调度,不能的体系结构以及不同的内核,每秒时间中断的次数不一样;
§ 任务需要的资源当前不可用(如缺页)或任务等待I/O操作的完成;
§ 当睡眠任务被唤醒进入可运行队列时,如果该任务的优先级高于所有可运行的任务而且正在运行的任务可被抢占;
§ 任务利用信号或系统调用自动放弃CPU;


1.1.7.任务状态

任务总共有6种状态标志,分别是:
(1)可运行状态:可运行状态是那些正在等待CPU资源的任务的状态,这些任务在就绪队列run-queqe中.这些任务只要得到CPU在个资源就马上可以被运行
(2)可打断睡眠状态:处于等待队列中的任务,待资源有效时唤醒,也可由其它任务被信号中断、唤醒后进入就绪状态
(3)不可打断睡眠状态:处于等待队列中的任务,直接等待硬件条件,待资源有效时唤醒,不可由其它任务通过信号中断、唤醒;这类状态的任务其睡眠的时间相对比较短。与可打断睡眠状态的区别就是后者可以由信号唤醒。
(4)僵死状态:虽然此时已经释放了内存、文件等资源,但是还没有释放任务控制块task_struct数据结构项。它不进行任何调度或状态转换,等待父任务将它彻底释放
(5)暂停状态:可能是任务控制信号所致,或者正在被跟踪调试,而导致暂时停止运行;需要其它任务的信号才能唤醒。任务被暂停,通过其它任务的信号才能唤醒。正在调试的任务可以在该停止状态。
(6)TAS_DEAD:已经退出且不需要父任务回收的任务的状态。
一个任务只能运行在用户方式(CPU处于用户态)或核心方式(CPU处于核心态)下。在用户方式下任务使用一般的堆栈,而在核心方式下用的是固定大小的堆栈(一般为一个物理内存页大小)。

1.1.8.系统平均负载
系统平均负载用来衡量系统工作量(服务的任务的数目)的指标。Linux系统采用指数衰减移动平均算法来计算系统平均负载,即当前系统的负载=上次计算的负载 *衰减因子 + 这一时刻系统的任务数目*(1-衰减因子)。所用的任务种类包括运行队列的任务和不可打断睡眠状态的任务。缺省时,Linux系统提供1分钟,分钟和15分钟三种形式的系统平均负载,为方便,我们就称之为1-分钟平均负载、5-分钟平均负载、15-分钟平均负载。时间越短,衰减越快(衰减大),越能反映系统的负载突变情况;时间越长,衰减越慢,能反映系统的平均情况。

1.1.9.进程的capability

传统UNIX的访问控制模型非常简单,就是“超级用户对普通用户”模型。在这种模型中,一个进程或帐户要么什么都能做即具有全部的系统权限,要么几乎什么也不能做即只有很小的权限,这取决于进程的UID。例如,如果一个进程需要加载/卸载内核模块以及管理文件系统等操作时,就需要完全的root权限。很显然这样做对系统安全存在很大的威胁。UNIX系统中的SUID问题就是由这种信任状模型造成的。例如,一个普通用户需要使用ping命令。这是一个SUID命令,会以root的权限运行。而实际上这个程序只是需要加载/卸载内核模块,除此之外的其它 root的权限对这个程序都是没有必要的。如果程序编写不好,就可能被攻击者利用,获得系统的控制权。
使用能力(capability)可以减小这种风险。系统管理员为了系统的安全可以剥夺root用户的某些能力,这样即使root用户也将无法进行某些操作;而这个过程又是不可逆的,也就是说如果一种能力被删除,除非重新启动系统,否则即使root用户也无法重新添加被删除的能力。

当特权操作由Capability LSM 模块控制时,系统基于进程信任状(creds)来仲裁特权操作。当Capability未被编译进内核时,内核使用默认的安全模块(security/dummy.c)仲裁特权操作,机制非常简单,仅仅检查进程euid、fsuid(进行文件系统相关特权操作时)是否为0。在这种情况下,dummy模块根本不关心进程的信任状,每个进程的信任状都拷贝其父进程的信任状。追根溯源,每个进程的信任状无论进程用户是否为超级用户,最终都拷贝Init进程的信任状,信任状中包含有超级用户进程的所有权能。
Linux是如何使用POSIX capabilities代替传统的信任状模型的?每个进程有三个和能力有关的位图:inheritable(I)、permitted(P)和effective(E),对应进程描述符 task_struct(include/linux/sched.h)里面的cap_effective, cap_inheritable, cap_permitted。每种能力由一位表示,1表示具有某种能力,0表示没有。
§ cap_effective。当一个进程要进行某个特权操作时,操作系统会检查 cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0。例如,如果一个进程要设置系统的时钟,Linux的内核就会检查 cap_effective的CAP_SYS_TIME位(第25位)是否有效,
§ cap_permitted表示进程能够使用的能力。在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集。进程放弃没有必要的能力对于提高安全性大有助益。例如,ping只需要CAP_NET_RAW,如果它放弃除这个能力之外的其它能力,即使存在安全缺陷,也不会对系统造成太大的损害。
§ cap_inheritable表示能够被当前进程执行的程序继承的能力。

Linux实现了7个POSIX 1003.1e规定的能力,还有21个(截止到2.6.13版本的内核)Linux所特有的,这些能力在/usr/src/linux/include/linux/capability.h文件中定义。其细节如下:

能力 编号 解释
CAP_CHOWN 0 允许改变文件的所有权
CAP_DAC_OVERRIDE 1 忽略对文件的所有DAC访问限制
CAP_DAC_READ_SEARCH 2 忽略所有对读、搜索操作的限制
CAP_FOWNER 3 如果文件属于进程的UID,就取消对文件的限制
CAP_FSETID 4 允许设置setuid位
CAP_KILL 5 允许对不属于自己的进程发送信号
CAP_SETGID 6 允许改变组ID
CAP_SETUID 7 允许改变用户ID
CAP_SETPCAP 8 8 允许向其它进程转移能力以及删除其它进程的任意能力
CAP_LINUX_IMMUTABLE 9 允许修改文件的不可修改(IMMUTABLE)和只添加(APPEND-ONLY)属性
CAP_NET_BIND_SERVICE 10 允许绑定到小于1024的端口
CAP_NET_BROADCAST 11 允许网络广播和多播访问
CAP_NET_ADMIN 12 允许执行网络管理任务:接口、防火墙和路由等,详情请参考/usr/src/linux/include/linux/capability.h文件
CAP_NET_RAW 13 允许使用原始(raw)套接字
CAP_IPC_LOCK 14 允许锁定共享内存片段
CAP_IPC_OWNER 15 忽略IPC所有权检查
CAP_SYS_MODULE 16 插入和删除内核模块
CAP_SYS_RAWIO 17 允许对ioperm/iopl的访问
CAP_SYS_CHROOT 18 允许使用chroot()系统调用
CAP_SYS_PTRACE 19 允许跟踪任何进程
CAP_SYS_PACCT 20 允许配置进程记帐(process accounting)
CAP_SYS_ADMIN 21 允许执行系统管理任务:加载/卸载文件系统、设置磁盘配额、开/关交换设备和文件等。详情请参考/usr/src/linux/include/linux/capability.h文件。
CAP_SYS_BOOT 22 允许重新启动系统
CAP_SYS_NICE 23 允许提升优先级,设置其它进程的优先级//
CAP_SYS_RESOURCE 24 忽略资源限制
CAP_SYS_TIME 25 允许改变系统时钟
CAP_SYS_TTY_CONFIG 26 允许配置TTY设备
CAP_MKNOD 27 允许使用mknod()系统调用
CAP_LEASE 28 Allow taking of leases on files

echo 0xFFFEFFFF >/proc/sys/kernel/cap-bound