Linux性能分析工具详解

来源:互联网 发布:java 判断类型 编辑:程序博客网 时间:2024/05/16 07:55

Linux性能分析工具详解

常用用法:

这里用sudo因为当前帐号无权使用tcpdump,这里仅以一个tcp的例子来说明:sudo /usr/sbin/tcpdump tcp port 80 and host 172.23.1.69 -ieth1 -n

每一行中间都有这个包所携带的标志:

S=SYN,发起连接标志

P=PUSH,传送数据标志

F=FIN,关闭连接标志

ack    表示确认包

RST=RESET,异常关闭连接

. 表示没有任何标志

 常用参数:

Tcp/udp/arp等:指定协议类型。

(src/dst)Host:指定源端或者目的端ip

(src/dst)port:指定源端或者目的端

-i:指定网卡。

-n:显示ip,而不是主机名。

-c:指定抓多少个包后退出。

-A:以ASCII方式显示包内容,这个选项对文本格式的协议包非常有用。

-s:指定抓包显示一行的宽度,-s0表示显示完整的包,经常和-A一起用。

-x/-xx/-X/-XX:以十六进制显示包内容,几个选项只有细微的差别,详见man手册。

 上图示例的过程详解:

第一行:17:40:10这个时间,从172.17.66.27client)的临时端口49376172.23.1.66server)的9500监听端口发起连接,client初始包序号为1350828479,滑动窗口大小为5840字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),mss大小为1460(即可接收的最大包长度,通常为MTU40字节,IP头和TCP头各20字节)。

第二行:server响应连接,同时带上第一个包的ack信息,为client端的初始包序号加11350828480,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。Server端的初始包序号为258050143mss也是1460

第三行:client再次确认,三次握手完成。

第四行:client发请求包,包长度91字节。

第五行:server响应ack

第六行:server回包,包长度21字节。

第七行:client响应ack

第八行:client发起关闭连接请求。

第九行:server响应ack,并且也发送FIN标志关闭。

第十行:客户端响应ack,关闭连接的四次握手完成。

通过这个来理解tcp协议也挺好的,连接关闭过程,字节流顺序控制,拥塞控制,tcp状态转换等。不过这里就不详述了。

二、vmstat

vmstat是一个很全面的性能分析工具,可以观察到系统的进程 状态、内存使用、虚拟内存使用、磁盘的 IO、中断、上下问切 换CPU使用等。系统性能分析工具中,我使用最多的是这个,

除了 sysstat 工具包外,这个工具能查看的系统资源最多。

对于 Linux 的性能分析,100%理解 vmstat 输出内容的含义, 那你对系统性能分析的能力就算是基本掌握了。

我这里主要说明一下这个命令显示出的部分数据代表的含义,和 它反映出系统相关资源的状况。输出内容共有 6 类,分别说明如下。

 Vmstat的输出格式如(CentOS 3.3)

 Procs

r:

运行的和等待(CPU时间)运行的进程数, 这个值也可以判断是否需要增CPU(长期 大1)

b:

处于不可中断状态的进程数,常见的情况 是IO引起的

   Memory

 swpd: 切换到交换内存上的内(默认KB为单)

  如果 swpd 的值不为0,或者还比较大,比如超过100M了,但

si, so 的值长期为 0,这种情况我们可以不用担心,不会影响

系统性能。

 free: 空闲的物理内存

 buff: buffer cache的内存,对块设备的读写进行缓冲

 cache: page cache的内, 文件系统cache

•  如果 cache 的值大的时候,说明cache住的文件数多,如果频 繁访问到的文件都能被cache住,那么磁盘的读IO bi 会非常小。

 Swap

si: 交换内存使用,由磁盘调入内存

so: 交换内存使用,由内存调入磁盘

内存够用的时候,这2个值都是0,如果这2个值长期 大于0时,系统性能会受到影响。磁盘IOCPU资 源都会被消耗。

我发现有些朋友看到空闲内存(free)很少或接近于0 时,就认为内存不够用了,实际上不能光看这一点 的,还要结合si,so,如果free很少,但是si,so也很 少(大多时候是0),那么不用担心,系统性能这时 不会受到影响的。

 Io

bi: 从块设备读入的数据总(读磁盘) (KB/s)

bo: 写入到块设备的数据总(写磁盘)

(KB/s)

随机磁盘读写的时候,这2个 值越大(如超 出1M),能看到CPUIO等待的值也会越大

 System

in: 每秒产生的中断次数

cs: 每秒产生的上下文切换次数 上面这2个值越大,会看到由内核消耗CPU

时间会越多

   Cpu

 us: 用户进程消耗CPU时间百分比

 us 的值比较高时,说明用户进程消耗的CPU时间多,但是如果 长期超过50% 的使用,那么我们就该考虑优化程序算法或者进 行加速了(比如 PHP/Perl)

 sy: 内核进程消耗CPU时间百分比

 sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性 的表现,我们应该检查原因。

 wa: IO等待消耗CPU时间百分比

•  wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作 随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)

 id: CPU处在空闲状态时间百分比

 情景分析 这个vmstat的输出那些信息值得关注?

Procs r: 运行的进程比较多,系统很繁忙

Io bo: 磁盘写的数据量稍大,如果是大文件的写,

10M以内基本不用担心,如果是小文件2M以内

基本正常

Cpu us: 持续大于50,服务高峰期可以接受

Cpu wa: 稍微有些高

Cpu id:持续小于50,服务高峰期可以接受

 

三、Top

这个命令可以查看系统中运行的进程的状况,CPU使 用状况,系统负载,内存使用等。它是检查系统进程 运行状况最方便的工具了,它默认显示部分活动的进 程,并且按照进程使用CPU的多少排序。它可以显示 全部CPU的使用状况,也可以显示每个进程都运行在 那个CPU上面。

我习惯使用这个命令查看那些进程或者那类进程占用 CPU和内存资源最多,以此迅速定位存在性能问题的 进程,以及运行异常的进程。

 Top命令的输1 (CentOS 3.3)

 Top命令的输2 (CentOS 3.3)

  top 看到的内存的说(Mem的第2)

actv

active 活跃的内存页,正在映射给进程使用

in_d

inactive_dirty 非活跃的内存页,并且内存数据被 修改,需要写回磁盘

in_c

inactive_clean 非活跃的内存页,干净的数据,可 以被重新分配使用

 问题?

in_d in_c 以及 cache, buffer 的内存有何 不同?

我的理解:

actv, in_d, in_c VM 中对内存的管理组织 形式,buffer是块设备读写缓冲cache是文 件系统缓存

     top 看到的进程所处的几种状(STAT)

   D 不可中断休眠,通常是 IO 操作所处的状态

   R 正在执行的或者处在等待执行的进程队列中

   S 休眠中

   T 暂停刮起的(比Ctrl+Z),也可能是被 strace 命令调用中的状

   Z 僵尸进程,进程执行完成,但由于其父进程没有销毁该进程,而 init进程接管进行销毁。

   W 没有使用物理内存,所占用的物理内存被切换到交换内存

   < 高优先级的进程

   N 低优先级

有时候一个进程会有多个状态的标志,比SWNSW

 情景分析 前面两top的输出那些信息值得关注?

1)

 Load average: 系统负载有降低的趋势,但仍然较高

 Running: 3个进程正在运行,正常,因为系统有 4

CPU

 Cpu user: 200%了,有些大,服务高峰时可以接受

 Cpu idle: 200%了,需要注意

2)

Cpu iowait:接近200%了,很大

free命令显示系统内存的使用状况(物理内存和 交换内存)

通过这个命令我们可以看到系统进程实际使用的 物理内存,buffercache使用的物理内存

 free命令输出的第二(Mem)

这行分别显示了物理内存的总量(total)、已使用的 (used)、空闲(free)、共享(shared)buffer系统分配但未被使用的buffers 数量cache系统分配但未被使用的cache 数量的内存。

   free命令输出的第三行(-/+ buffers/cache) 这行最容易让人迷惑。

它显示的第一个值(used这一列)是这样得来的: Memused - Membuffers - Memcached列。(这个值就是实际使用的内存总量)

它显示的第二个值(free这一列)是这样得来的:Memfree + Membuffers + Memcached列。(这个值就是系统当前实际可用内存)

 free命令输出的第四(Swap) 这行显示交换内存的总量、已使用量、 空闲量

 

下面是bufferscached的区别。

buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.cached是用来给文件做缓冲。那就是说:buffers是用来存储,目录里面有什么内容,权限等等。而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。

实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。

#free

#man X

#free

#man X

#free

你可以先后比较一下free后显示buffers的大小。

另一个实验:

#free

#ls /dev

#free

你比较一下两个的大小,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。

因为Linux将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,系统会自动释放(不像windows那样,即使你有很多空闲内存,他也要访问一下磁盘中的pagefiles

因此,一个最简单的判断Linux下内存是否足够的办法是,只要基本没用到swap,这台机器的内存就是足够的。

原创粉丝点击