Linux下尝试性能分析之top和free命令


    一般提起性能分析时,一般都会有几个维度。一个是CPU,一个是IO。

 首先分析,当一个进程cpu占用很高时,怎么分析排查?

步骤:

     1.使用命令,ps -mp pid -o THREAD,tid,time 查看进程中个线程的运行时间

     2.使用命令gstack查看进程中各个线程的函数调用栈

     3. 使用命令 pstack pid 查看线程的函数调用栈

     4. 根据函数调用栈,确认问题。

我们还可以通过strace命令,查看系统调用的次数以及花费的时间:

    strace -T -r -c -p pid,-c参数显示统计信息,去掉此参数可以查看每个系统调用话费的时间及返回值。

top命令

 使用top,可以查看系统的实时状态信息。下面我们看看运行top后出现的界面显示。

top - 15:26:41 up 49 days, 17:47, 19 users,  load average: 0.16, 0.25, 0.34
Tasks: 3580 total,   1 running, 3531 sleeping,   0 stopped,  48 zombie
Cpu(s): 24.8%us,  4.6%sy,  0.0%ni, 68.4%id,  1.7%wa,  0.0%hi,  0.5%si,  0.0%st
Mem:   8059660k total,  5229356k used,  2830304k free,   229028k buffers
Swap: 10289144k total,  1948108k used,  8341036k free,  1866412k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND   

分析:

     top :显示当前系统信息概览。15:26:41-当前时间; up  days系统运行的总时间;  users 登录的用户数量; load average-系统负荷,三个值分别是1分钟系统负荷、5分钟系统负荷、15分钟系统负荷。关于系统负荷的具体信息,可以查看这个链接:http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html

    Tasks: 进程的信息概览。total-总进程数;  running-正在运行的进程个数;  sleeping -正在睡眠的进程个数; zombie - 处于僵死状态的进程个数;

    Cpu:cpu使用情况。us- user cpu time,用户空间占用cpu百分比; sy-system cpu time,内核空间占用CPU百分比;ni- nice cpu time,用户进程空间内改变过优先级的进程占用CPU百分比;id- idle,空闲CPU百分比(值越大,cpu越空闲);wa - iowait,等待输入输出的cpu时间百分比;hi - hardware irq,硬件中断的CPU时间百分比;si - software irq,软件中断的CPU时间百分比;

st - steal time,虚拟CPU等待实际CPU的时间的百分比。

    Mem:物理内存统计。total-总物理内存大小; used-已分配的物理内存大小;free-未分配的物理内存大小;buffers-已分配但未使用的块设备缓冲区大小。缓冲用于存储速度不同步的设备或优先级不同的设备之间传递数据的区域。是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和磁盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写回磁盘),也可以通过sync命令手动清空缓冲。

    Swap:交换内存信息。total-交换内存大小;used -已分配的交换区内存大小;free -未分配的物理内存大小;cached - 已分配但未使用的页缓冲大小。cache,是把读取过的数据保存在缓冲区上,重新读取时如果命中,就不用再去读磁盘,若没有命中,则读取磁盘,然后将内容写入缓存中。(不一定就是正确的理解,总感觉有点问题)

注意:

    top中的used,并非真的就是应用进程使用了这么多内存。和我们理解的used概念不一样。我们通过一个表格说明

内存状态
你的认为
Linux的认为
被进程使用 used(消耗了) used
被进程使用,但可以被重新使用或得到 Free(or Available) used(and Available)
没有被任何进程使用 Free Free

正是因为我们认为的used和linux认为的used理解有所偏差,所以我们看到top命令中的used的时候,会认为这是已经被使用了的内存,但实质上,这一部分的内存是=正在被使用+可得到的内存。

free命令

我们可以使用free命令,查看当前的内存使用情况。

                 total         used             free         shared      buffers     cached
Mem:       1020348     944252      76096          0             119304     575480
-/+ buffers/cache:      249468     770880
Swap:       950264     106876     843388
         Swap表示硬盘上交换区的使用情况。这里我们不分析。

系统的总物理内存:1020348(1020M),但系统当前真正可用的内存并不是第一行free 标记的 76096 kb,它仅代表未被分配的内存。
  我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
  total1:表示物理内存总量。
  used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
  free1:未被分配的内存。
  shared1:共享内存,一般系统不会用到,这里也不讨论。
  buffers1:系统分配但未被使用的buffers 数量。
  cached1:系统分配但未被使用的cache 数量。
  used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。
  free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

可以整理出如下等式:
    total1 = used1 + free1
    total1 = used2 + free2
    used1 = buffers1 + cached1 + used2
    free2 = buffers1 + cached1 + free1
可见,used2 是真正使用的, 比used1 小, used1 包含分配但未使用内存。
      free2 是真正可使用的。比free1 大,free1 未包含分配但未使用内存

    以上的区域内容,来源于网页:http://blog.csdn.net/hejinjing_tom_com/article/details/12199759

Q1:实际使用的buffers 与cache 总量,也是实际使用的内存总量。为何会这样?

A:阅读过linux内核源码的伙伴会知道,malloc申请的内存,是通过brk系统调用,从slab高速缓冲区中分配来的。那么,这一部分的空间,是否是属于buffer??

Q2:buffers和cache,具体是有什么区别?

A:我们知道,cpu是有三级高速缓存,Cache L1,Cache  L2,Cache L3。这里说的Cache,是在CPU内的,是位于CPU与主存之间的一种容量小,但速度快的存储器。Cache中存放的是从主存中读取的一部分数据。

    上面说的Cache,不是我们在free中提到的cache。所以。我们了解就好,就不再继续深入了。现在来看看free中的Cache,即内存中的cache。下面是一段英文翻译,原文来源于:https://stackoverflow.com/questions/6345020/what-is-the-difference-between-buffer-vs-cache-memory-in-linux

    cache:cache是内存的一部分,它透明地存储数据,以便将来对该数据的请求可以得到更快的服务。cache被内核用来存储磁盘数据用以提高IO性能。内核试着保存各个运行在系统上的进程需要的数据或者相关进程将来要用到的数据。cache在进程结束的时候并不会被回收,然而当其他进程需要更多的内存时,内核会回收这一部分cache,即写入到磁盘,然后将这一内存用于新的进程。当任意的文件或数据被请求时,内核会首先查看用户操作的文件的一部分拷贝,如果拷贝不存在,内核会为cache分配新页框,并用从磁盘中得到的数据来填充。SystemV的共享内存段,也是作为cache内存,尽管内存内存在磁盘上并没有代表的数据.(这句话似乎不怎么正确,shm的共享内存在磁盘中也有文件对应,只是shm文件系统是特殊文件系统的一类,在系统目录树中没有安装点,无法挂载。因此,用户不能通过普通的vfs系统调用打开并访问它的文件)。

    buffers:存储在页缓存下,表示块设备的数据。Buffers包含页缓存中的files/data 内的元数据,比如:当对出现在页缓存中的数据进行请求,内核首先检查包含了指向这些真正的页缓存中的files/data的元数据的buffers。一旦从元数据中得知文件的实际块地址,就由内核读取用于处理。

    依然不是很清晰。

总结:

     性能分析时,要善于使用这些命令。其实这些命令,就是我们常听说的一些性能分析工具。



评论

发表评论