2018年8月30日 星期四

meminfo vmstat procrank top等详解

http://blog.csdn.net/j9y6f315/article/details/28631483

转载 2014年06月05日 15:37:08

meminfo
命令:cat /proc/meminfo
实例:
MemTotal:         234312 kB
MemFree:            3448 kB
Buffers:              92 kB
Cached:            18052 kB
SwapCached:        25556 kB
Active:            50564 kB
Inactive:          50236 kB
Active(anon):      41924 kB
Inactive(anon):    41968 kB
Active(file):       8640 kB
Inactive(file):     8268 kB
Unevictable:        1164 kB
Mlocked:           17028 kB
HighTotal:             0 kB
HighFree:              0 kB
LowTotal:         234312 kB
LowFree:            3448 kB
SwapTotal:        196604 kB
SwapFree:         114384 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         83900 kB
Mapped:            53944 kB
Shmem:                44 kB
Slab:              17540 kB
SReclaimable:       5828 kB
SUnreclaim:        11712 kB
KernelStack:        4184 kB
PageTables:         5304 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      313760 kB
Committed_AS:    2792956 kB
VmallocTotal:     778240 kB
VmallocUsed:      115160 kB
VmallocChunk:     405852 kB
解释:
MemTotal: 所有可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)

    MemFree: LowFree与HighFree的总和

    Buffers: 用来给块设备做的缓冲大小(只记录文件系统的metadata以及 tracking in-flight pages,就是说 buffers是用来存储,目录里面有什么内容,权限等等。)

    Cached: 用来给文件做缓冲大小(直接用来记忆我们打开的文件). 它不包括SwapCached

    SwapCached: 已经被交换出来的内存,但仍然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口。

    Active: 最近经常被使用的内存,除非非常必要否则不会被移作他用.

    Inactive: 最近不经常被使用的内存,非常用可能被用于其他途径.

    HighTotal:
    HighFree: 高位内存是指所有在860MB以上的内存空间,该区域主要用于用户空间的程序或者是缓存页面。内核必须使用不同的手法使用该段内存,因此它比低位内存要慢一些。

    LowTotal:
    LowFree: 低位可以达到高位内存一样的作用,而且它还能够被内核用来记录一些自己的数据结构。
                   Among many other things, it is where everything from the Slab is
                   allocated.  Bad things happen when you're out of lowmem.

    SwapTotal: 交换空间的总和

    SwapFree: 从RAM中被替换出暂时存在磁盘上的空间大小

    Dirty: 等待被写回到磁盘的内存大小。

    Writeback: 正在被写回到磁盘的内存大小。

    Mapped: 影射文件的大小。

    Slab: 内核数据结构缓存

    VmallocTotal: vmalloc内存大小

    VmallocUsed: 已经被使用的虚拟内存大小。

    VmallocChunk: largest contigious block of vmalloc area which is free

    CommitLimit: Based on the overcommit ratio('vm.overcommit_ratio'),
              this is the total amount of  memory currently available to
              be allocated on the system. This limit is only adhered to
              if strict overcommit accounting is enabled (mode 2 in
              'vm.overcommit_memory').
              The CommitLimit is calculated with the following formula:
              CommitLimit = ('vm.overcommit_ratio' * Physical RAM) + Swap
              For example, on a system with 1G of physical RAM and 7G
              of swap with a `vm.overcommit_ratio` of 30 it would
              yield a CommitLimit of 7.3G.
              For more details, see the memory overcommit documentation
              in vm/overcommit-accounting.
         
Committed_AS: The amount of memory presently allocated on
the system.
The committed memory is a sum of all of the memory which
              has been allocated by processes, even if it has not been
              "used" by them as of yet. A process which malloc()'s 1G
              of memory, but only touches 300M of it will only show up
              as using 300M of memory even if it has the address space
              allocated for the entire 1G. This 1G is memory which has
              been "committed" to by the VM and can be used at any time
              by the allocating application. With strict overcommit
              enabled on the system (mode 2 in 'vm.overcommit_memory'),
              allocations which would exceed the CommitLimit (detailed
              above) will not be permitted. This is useful if one needs
              to guarantee that processes will not fail due to lack of
              memory once that memory has been successfully allocated.

    VmallocTotal: 可以vmalloc虚拟内存大小

    VmallocUsed: 已经被使用的虚拟内存大小。

    VmallocChunk: largest contigious block of vmalloc area which is free
提示:
使用adb shell cat /proc/meminfo 命令,查看剩余的空间还有多少,通常的系统剩余空间是: MemFree + cached
      如下看到的系统剩余空间是:5616K + 158632K
        cat proc/meminfo
          MemTotal:         483724 kB
          MemFree:            5616 kB
          Buffers:            2732 kB
          Cached:           158632 kB
          SwapCached:            0 kB
          Active:           277336 kB
          Inactive:          83232 kB
         Active(anon):     197452 kB
       需要注意的是,在 setting->apps->running app里面看到的剩余空间是上述MemFree + cached + background running app memory - SECOND_SERVER_MEM,具体的计算方法参考:RunningProcessView.java(/alps/package/apps /settings/src/com/android/setting/applications)里面的void refreshUi(boolean dataChanged)函数
vmstat
[root@localhost ~]# vmstat -n 3       (每个3秒刷新一次)
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b   swpd   free   buff cache   si   so    bi    bo   in    cs us sy id wa
1 0    144 186164 105252 2386848    0    0    18   166   83     2 48 21 31 0
2 0    144 189620 105252 2386848    0    0     0   177 1039 1210 34 10 56 0
0 0    144 214324 105252 2386848    0    0     0    10 1071   670 32 5 63 0
0 0    144 202212 105252 2386848    0    0     0   189 1035   558 20 3 77 0
2 0    144 158772 105252 2386848    0    0     0   203 1065 2832 70 14 15 0
vmstat所带参数请用man vmstat查看
Procs 
r: 等待运行的进程数 b: 处在非中断睡眠状态的进程数 w: 被交换出去的可运行的进程数。此数由 linux 计算得出,但 linux 并不耗尽交换空间 
Memory 
swpd: 虚拟内存使用情况,单位:KB
free: 空闲的内存,单位KB
buff: 被用来做为缓存的内存数,单位:KB
Swap 
si: 从磁盘交换到内存的交换页数量,单位:KB/秒
so: 从内存交换到磁盘的交换页数量,单位:KB/秒
IO 
bi: 发送到块设备的块数,单位:块/秒
bo: 从块设备接收到的块数,单位:块/秒
System 
in: 每秒的中断数,包括时钟中断
cs: 每秒的环境(上下文)切换次数
CPU 
按 CPU 的总使用百分比来显示 
us: CPU 使用时间
sy: CPU 系统使用时间
id: 闲置时间
准测
r,b≈0,
如果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没有也许存在不合理的平衡,或者对磁盘操作比较频繁,
vmstat各项:
procs:
r-->在运行队列中等待的进程数
b-->在等待io的进程数
w-->可以进入运行队列但被替换的进程
memoy
swap-->现时可用的交换内存(k表示)
free-->空闲的内存(k表示)
pages
re--》回收的页面
mf--》非严重错误的页面
pi--》进入页面数(k表示)
po--》出页面数(k表示)
fr--》空余的页面数(k表示)
de--》提前读入的页面中的未命中数
sr--》通过时钟算法扫描的页面
disk 显示每秒的磁盘操作。 s表示scsi盘,0表示盘号
fault 显示每秒的中断数
in--》设备中断
sy--》系统中断
cy--》cpu交换
cpu 表示cpu的使用状态
cs--》用户进程使用的时间
sy--》系统进程使用的时间
id--》cpu空闲的时间
如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。
如果pi,po 长期不等于0,表示内存不足。
如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。
Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。
  在Linux下有很多系统性能分析工具,比较常见的有top、free、ps、time、timex、uptime等。下文将介绍几个较为重要的性能分析工具vmstat、iostat和sar及其使用。
  用vmstat监视内存使用情况
  vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。
  vmstat的语法如下:

  vmstat [-V] [-n] [delay [count]]
  其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看
procrank
使用adb shell procrank 命令(仅ENG版本可用),查看有哪些app占用内存过多,请以PSS栏位为参考,重点关注自己安装的一些APK以及PSS值比较大的process
     adb shell procrank
       PID      Vss      Rss      Pss      Uss  cmdline
       476   65312K   65284K   38499K   35560K  com.android.launcher
      268   54916K   54880K   30001K   27000K  system_server
      110   32196K   28988K   18924K   12432K  /system/bin/surfaceflinger
      347   42400K   42320K   15445K   10704K  com.android.systemui

对于尚明中占用比较异常的process,可以透过 adb shell showmap [pid](仅ENG版本可用)查看具体使用情况。以system_server 为例,先adb shell ps system_server得到pid:
    adb shell ps system_server
         USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
        system    268   111   406736 54876 ffffffff 400e9c70 S system_server
  
    再  adb shell showmap 268查看各个.so以及 heap,stack的使用情况,做初步的判断(同样以PSS栏位参考)
     adb shell showmap 268
       virtual                     shared   shared  private  private
         size      RSS      PSS    clean    dirty    clean    dirty    # object
    -------- -------- -------- -------- -------- -------- -------- ---- ------------------------------
         72       20       20        0        0       20        0    1 /data/dalvik-cache/system@app@SettingsProvider.apk@classes.dex
         352      148      103       32       16       48       52   18 /data/dalvik-cache/system@framework@android.policy.jar@classes.dex
        1348       28        8       20        0        8        0    1 /data/dalvik-cache/system@framework@apache-xml.jar@classes.dex
         956       60       13       52        0        8        0    1 /data/dalvik-cache/system@framework@bouncycastle.jar@classes.dex
         24        8        0        8        0        0        0    1 /data/dalvik-cache/system@framework@core-junit.jar@classes.dex
        3292     1056      126     1012        0       44        0    1 /data/dalvik-cache/system@framework@core.jar@classes.dex
top
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。
top - 01:06:48 up  1:22,  1 user,  load average: 0.06, 0.60,  0.48
            Tasks:  29 total,   1 running,  28 sleeping,   0 stopped,   0  zombie
            Cpu(s):  0.3% us,  1.0% sy,  0.0% ni, 98.7% id,  0.0% wa,  0.0%  hi,  0.0% si
            Mem:    191272k total,   173656k used,    17616k free,    22052k  buffers
            Swap:   192772k total,        0k used,   192772k free,   123988k  cached
          
            PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM     TIME+  COMMAND
            1379 root      16   0  7976 2456 1980 S  0.7  1.3   0:11.03  sshd
            14704 root      16   0  2128  980  796 R  0.7  0.5   0:02.72 top
            1 root      16   0  1992  632  544 S  0.0  0.3   0:00.90 init
            2 root       34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
            3 root       RT   0     0    0    0 S  0.0  0.0   0:00.00  watchdog/0

统计信息区前五行是系统整体的统计信息。第一行是任务队列信息,同 uptime  命令的执行结果。其内容如下:
01:06:48 当前时间
up 1:22 系统运行时间,格式为时:分
1 user 当前登录用户数
load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。
            三个数值分别为  1分钟、5分钟、15分钟前到现在的平均值。

第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:
Tasks: 29 total 进程总数
1 running 正在运行的进程数
28 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s): 0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0% hi
0.0% si

最后两行为内存信息。内容如下:
Mem: 191272k total 物理内存总量
173656k used 使用的物理内存总量
17616k free 空闲内存总量
22052k buffers 用作内核缓存的内存量
Swap: 192772k total 交换区总量
0k used 使用的交换区总量
192772k free 空闲交换区总量
123988k cached 缓冲的交换区总量。
            内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,
            该数值即为这些内容已存在于内存中的交换区的大小。
            相应的内存再次被换出时可不必再对交换区写入。

进程信息区统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。
序号 列名 含义
a PID 进程id
b PPID 父进程id
c RUSER Real user name
d UID 进程所有者的用户id
e USER 进程所有者的用户名
f GROUP 进程所有者的组名
g TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
h PR 优先级
i NI nice值。负值表示高优先级,正值表示低优先级
j P 最后使用的CPU,仅在多CPU环境下有意义
k %CPU 上次更新到现在的CPU时间占用百分比
l TIME 进程使用的CPU时间总计,单位秒
m TIME+ 进程使用的CPU时间总计,单位1/100秒
n %MEM 进程使用的物理内存百分比
o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r CODE 可执行代码占用的物理内存大小,单位kb
s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t SHR 共享内存大小,单位kb
u nFLT 页面错误次数
v nDRT 最后一次写入到现在,被修改过的页面数。
w S 进程状态。
            D=不可中断的睡眠状态
            R=运行
            S=睡眠
            T=跟踪/停止
            Z=僵尸进程
x COMMAND 命令名/命令行
y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
z Flags 任务标志,参考 sched.h

默认情况下仅显示比较重要的  PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND  列。可以通过下面的快捷键来更改显示内容。
更改显示内容通过 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z  即可显示或隐藏对应的列,最后按回车键确定。
按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z  可以将相应的列向左移动。最后按回车键确定。
按大写的 F 或 O 键,然后按 a-z 可以将进程按照相应的列进行排序。而大写的  R 键可以将当前的排序倒转。

沒有留言: