Linux time命令详解

参考:http://blog.he96.com/2011/01/linux-timewhat-do-real-user-and-sys.html

real,user,sys

我们常用linux中的time命令计算某个程序的运行耗时,用户态CPU耗时,系统态COU耗时。
例如:

1
2
3
4
time foo
real 0m0.020s
user 0m0.020s
sys 0m0.000s

现在我们探讨一下上述三个时间分别代表的含义:

  • real: 表示a.out程序的实际的运行耗时,也就是在a.out运行开始时刻你看了一下手表,a.out运行结束时刻看了一眼手表,两次时间的差值就是real的值。例如使用time sleep 2的时候real值为2
  • user: a.out运行在用户态CPU的时间
  • sys: a.out运行在核心态CPU的时间

用户态和核心态

然后我们讲一下用户态和核心态:

  • 核心态(kernal mode): 在内核态,代码拥有完全的,不受任何限制的访问底层硬件的能力。可以执行任意的CPU指令,访问任意的内存地址。内核态通常情况下,都是为哪些最底层的,由操作系统提供的,可信可靠耳朵代码来运行的。内核态崩溃将是灾难性的,它会影响到整个系统。
  • 用户态(User mode):在用户态,代码不具备直接访问底层硬件或者内存的能力,而必须借助操作系统提供的可靠的,底层的API来访问硬件或者内存。由于这种隔离带来的保护作用,用户态代码崩溃,操作系统可以正常恢复。我们大多数代码是运行在用户态。

区分内核态和用户态的作用:隔离保护,使得系统更稳定。
使用这三个时间我们可以计算当前程序CPU的使用率:
CPU Usage = (user + sys) / real_time

常见误区

  • realtime = user + sys
  • realtime > user + sys
    由于有一些程序需要等待I/O等导致realtime与user+sys不相等
    当在多核CPU的情况下第二种情况不成立

Comment and share

通过/proc/meminfo实时获取系统内存使用情况(Linux)

linux内核提供了一种通过/proc文件系统来在运行时访问内核内部数据结构,改变内核设置的机制,各种硬件平台上的linux系统的/proc文件系统的基本概念都是相同的。
/proc文件系统是一种内核和内核模块用来向进程发送信息的机制。这个伪文件系统可以和内核内部的数据结构进行交互,获取实时的进程信息。注意,/proc文件系统是存储与内存而不是硬盘,/proc虚拟文件系统实质是以文件系统的形式访问内核数据的接口

/proc/meminfo

linux系统中/proc/meminfo这个文件用来记录了系统内存使用的详细情况。其中top,free命令中的数据是通过这个文件中的信息计算并按照特定的格式进行显示。
/proc/meminfo内容详解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$cat /proc/meminfo
MemTotal: 8052444 kB
MemFree: 2754588 kB
MemAvailable: 3934252 kB
Buffers: 137128 kB
Cached: 1948128 kB
SwapCached: 0 kB
Active: 3650920 kB
Inactive: 1343420 kB
Active(anon): 2913304 kB
Inactive(anon): 727808 kB
Active(file): 737616 kB
Inactive(file): 615612 kB
Unevictable: 196 kB
Mlocked: 196 kB
SwapTotal: 8265724 kB
SwapFree: 8265724 kB
Dirty: 104 kB
Writeback: 0 kB
AnonPages: 2909332 kB
Mapped: 815524 kB
Shmem: 732032 kB
Slab: 153096 kB
SReclaimable: 99684 kB
SUnreclaim: 53412 kB
KernelStack: 14288 kB
PageTables: 62192 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 12291944 kB
Committed_AS: 11398920 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HardwareCorrupted: 0 kB
AnonHugePages: 1380352 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 201472 kB
DirectMap2M: 5967872 kB
DirectMap1G: 3145728 kB

详解:

  • MemTotal: 所有内存(RAM)大小,减去一些预留空间和内核的大小。
  • MemFree: 完全没有用到的物理内存,lowFree+highFree
  • MemAvailable: 在不使用交换空间的情况下,启动一个新的应用最大可用内存的大小,计算方式:MemFree+Active(file)+Inactive(file)-(watermark+min(watermark,Active(file)+Inactive(file)/2))
  • Buffers: 块设备所占用的缓存页,包括:直接读写块设备以及文件系统元数据(metadata),比如superblock使用的缓存页。
  • Cached: 表示普通文件数据所占用的缓存页。
  • SwapCached: swap cache中包含的是被确定要swapping换页,但是尚未写入物理交换区的匿名内存页。那些匿名内存页,比如用户进程malloc申请的内存页是没有关联任何文件的,如果发生swapping换页,这类内存会被写入到交换区。
  • Active: active包含active anon和active file
  • Inactive: inactive包含inactive anon和inactive file
  • Active(anon): anonymous pages(匿名页),用户进程的内存页分为两种:与文件关联的内存页(比如程序文件,数据文件对应的内存页)和与内存无关的内存页(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为匿名页。
  • Inactive(anon): 见上
  • Active(file): 见上
  • Inactive(file): 见上
  • SwapTotal: 可用的swap空间的总的大小(swap分区在物理内存不够的情况下,把硬盘空间的一部分释放出来,以供当前程序使用)
  • SwapFree: 当前剩余的swap的大小
  • Dirty: 需要写入磁盘的内存去的大小
  • Writeback: 正在被写回的内存区的大小
  • AnonPages: 未映射页的内存的大小
  • Mapped: 设备和文件等映射的大小
  • Slab: 内核数据结构slab的大小
  • SReclaimable: 可回收的slab的大小
  • SUnreclaim: 不可回收的slab的大小
  • PageTables: 管理内存页页面的大小
  • NFS_Unstable: 不稳定页表的大小
  • VmallocTotal: Vmalloc内存区的大小
  • VmallocUsed: 已用Vmalloc内存区的大小
  • VmallocChunk: vmalloc区可用的连续最大快的大小

通过/proc/meminfo实时获取系统内存使用情况

http://man.linuxde.net/free
目前我们希望实时获取系统中内存的使用情况,实际可以挪用的内存数为free+cache+buffer,实际使用的内存数为used-cache-buffer(total-free-cache-buffer),

Comment and share

通过/proc/stat计算linux系统即时CPU使用率

/proc/stat

/proc文件系统是一个伪文件系统,它存在于内存中,不占用外存空间。它以文件系统的方式为内核与进程提供通信接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程是动态改变的,所以用户或应用程序读取/proc目录中的文件的时,/proc文件系统是动态从系统内核读出所需信息并提交的。
在linux或Ubuntu系统中,/proc/stat文件记录了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前的值。我们可以通过一个较小的时间段的CPU利用率值来估算某一个时刻的CPU利用率。首先我们先来查看一下/proc/stat中的内容:

1
2
3
4
5
6
$ cat /proc/stat
cpu 15543 334 4963 142337 3413 0 180 0 0 0
cpu0 3877 142 1137 35988 615 0 28 0 0 0
cpu1 3866 23 1068 35982 608 0 74 0 0 0
cpu2 4104 159 1333 35395 735 0 59 0 0 0
cpu3 3695 9 1424 34970 1454 0 18 0 0 0

上面的信息中前八个是比较重要的。

  • user(15543): 从系统启动到当前时刻,处于用户态的时间(用户空间的CPU时间),不包括nice为负值的进程。
  • nice(334): 从系统启动到当前时刻,nice值为负的进程所占的CPU时间。
  • system(4963): 从系统启动到当前时刻,处于内核状态的CPU时间。
  • idle(142337): 从系统启动到当前时刻,除了I/O等待时间以外的其他等待时间
  • iowait(3413): ~,IO等待时间
  • irq(0): ~, 硬中断时间
  • softrq(180): ~,软中断时间。
  • steal: ~,在虚拟环境中运行的时间。

总的CPU时间为:total = user+nice+system+idle+iowait+irq+softrq

计算当前时刻的CPU使用率

我们使用距离当前时刻较小的间隔的时间段的CPU使用率近似当前时刻的CPU使用率。

1
2
CPU Usage=1 - (△idle+△iowait) / △total_time
=1 - (idle2+iowait2 - idle1 - iowait1) / (total_time2 - total_time1)

Comment and share

linux进程nice值及其与优先级的关系

在linux多任务环境的系统中,系统是根据进程的优先级(priority)给进程进行分配资源。优先级越高的进程越有优先执行的权利。配置进程优先权碎玉linux很有用,可以大大改善系统的性能。还可以把指定的进程运行在指定的cpu上。

nice与priority

在linux中使用ps 的-l参数可以对进程的优先权信息进行查看:

1
2
3
4
5
6
$ ps -l
#打印信息:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 5242 5232 0 80 0 - 7461 wait pts/1 00:00:00 bash
4 T 1000 5881 5242 0 80 0 - 12247 signal pts/1 00:00:01 top
4 R 1000 6386 5242 0 80 0 - 8996 - pts/1 00:00:00 ps

从上面可以看出,上表中打印出一些有用的信息:

  • UID: 进程的user id
  • PID: 进程ID
  • PPID: 当前进程的父进程的ID
  • PRI: 优先级(pri越小优先级越高)
  • NI: nice值,当前进程的nice值
    前三个值比较容易理解,pri和NI的含义,pri比较好理解,即进程的优先级,pri越小,优先级越高,那nice值呢?nice表示进程可被执行的优先级的修正数值。如前面说的,pri越小越优先被执行,那么加入nice之后pri(new)=pri(old)+nice。这样,当nice为负值的时候,该程序的pri变小,优先级越高。

    注意:进程的nice值不是进程的优先级,但是会影响进程优先级的变化。

nice相关linux命令nice与renice

1.nice的作用是启动时设置nice的值

1
ice -n -5 ./MatrixJudge &

-n参数用于指定nice值
2.renice的作用是修改已经存在的进程的nice值

1
renice -5 -p 10000

上述的意思是将PID为10000的nice值置为-5,-p参数用于指定PID。

Comment and share

魏传柳(2824759538@qq.com)

author.bio


Tencent


ShenZhen,China