第二部分 Linux系统性能监控
Linux系统性能监控一共四部分:
整体系统CPU利用
内存利用
磁盘I/O利用和等待时间
网络利用
Linux后台进程和性能分析
影响性能的因素有很多。显然,处理器速度,内存大小,网络带宽或磁盘I/O控制器,磁盘的大小和速度等都是影响性能的重要指标。其他主要的组件包括应用程序自己的性能问题,自然负荷,应用间的交互,磁盘上数据的存取或网络,当然,终端用户使用应用程序的应用模块等。
优化特定的负载常常开始于假设硬件环境不变,例如处理器的数量,处理器类型,磁盘数量等等。主要的性能分析目标是定位在增加性能和整体吞吐量的情况下,找出负载最大的组件为当前瓶颈。当可用的硬件负载能力已经饱和,需要明确改善哪个硬件将增加负载的吞吐量和性能。
CPU利用
一个系统性能的主要指标就是系统对用户的响应时间。尽管大多数用户性能报告趋于主观,但是有很多定量测试的方式好于终端用户的感受。例如,人们趋向于接受50毫秒的响应时间也就是实际上的一瞬间。交互型应用,特别是那些包含文本输入,当50毫秒的阀值一超过,就出现了响应慢。使用复杂系统的用户或许已经适应了系统响应时间为多秒或更复杂的应用操作甚至几分钟。每个负载有其自己的响应时间,通常是建立在用户长年累月与系统交互得到的感受。当用户的期待不再满意的时候,用户会投诉表示响应时间过长,可能是灾难性的,也许就是用户没有在合理时间内完成他的任务。
这些投诉请求作为计划外的情况来使用多样的性能分析工具。不幸的是,对于没有经验的人员确实是一个挑战,因为他们没有通过这些工具得到应用程序响应时间的基线。在危机前,有一个监控应用的机会,就要创建和归档各样的性能统计,一般来说有助于加快解决客户投诉的抱怨。一些通用识别确定系统性能问题前兆的经验在理解工作负荷的性能问题上是非常重要的。系统的,有规律的应用工具介绍,以及典型的通用负载知识结合,应该能够精确定位任何性能瓶颈。通过系统级别瓶颈的知识,一个系统管理员或性能分析员应该能够进行系统优化,系统重构,负载重构,或特定负载组件的精细化分析来进一步定位和最后解决任何性能瓶颈。
在一个有序的系统分析过程中,通常在最开始使用最基本的工具做一次系统CPU使用情况的简单度量。详细点说,Linux和大部分基于UNIX的操作系统都提供一个命令来显示系统的平均负载:
uptime
$ uptime
17:37:30 up 3 days, 17:06, 7 users, load average: 1.13, 1.23, 1.15
(当前时间,运行时间,任务数目,在过去1分钟、5分钟、15分钟的平均负载)
详细点说就是,平均负载表示在过去的1,5,15分钟内平均任务数的平均负载情况。可运行任务是那些要么正在运行,要么等待可用处理器,然后运行。可以通过/proc/cpu文件查看CPU数量:
$ cat /proc/cpu
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 6
cpu MHz : 647.195
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca
cmov pat pse36 mmx fxsr sse
bogomips : 1291.05
在这个例子中,对于单核处理器来说,仅有一个入口,平均来说对单核处理器工作量轻微超过其处理的能力。在压力更大的情况下,也就意味着机器将有更大的负荷。
注意:在双CPU的机器上,如果uptime展现的是负载平均值小于2.00,也就表示处理器依然有额外的处理能力。同样,四CPU的负载平均值小于4,以此类推。当然仅根据负载平均值不能说明全部问题。
这个例子中,提到的机器是笔记本电脑,负载包括一个邮件客户端,word文档处理,web浏览器,一些客户应用程序,聊天客户端等等,同时运行。然而这么多负载的响应时间是被客户接受的。
这也意味着操作系统调度适当设置优先级任务,其他基于最多交互的任务应该优先处理。在机器上运行的不是有意义的服务器,所以在客户端或机器上的高负载平均值都没有任何影响。
所以,尽管工具显示CPU已经满负荷,但是并不能说明系统正在做什么或为什么如此忙碌。并且,如果系统用户对响应时间是可以接受的,那么也就没有理由对操作系统进行更加深入的探查。
然而,本章就这么结束将是无趣的。通常,像uptime的简易工具只是用户尝试统计应用响应时间慢的快速方法。如果系统的负载平均值表明响应时间是由超载的处理器引起的,其他工具将被用来精确定位负载的起因。
进一步研究处理器是如何被使用的,通过三个工具将提供给我们CPU使用的不同见识:vmstat,iostat,top。每个命令对于系统监控有不同的关注点,每个命令被用来获得处理器如何使用的不同透视。详细说明,下一步将理解如果处理器主要在操作系统上消耗时间(常常作为内核空间被提及)或应用程序(常常作为用户空间被提及)或处理器是空闲。进一步说,如果处理器是空闲,对进一步性能分析来说理解为什么是空闲是一个关键。处理器空闲有很多原因。比如,最明显的原因是进程不能运行。这个听起来太明显了,但是如果是一个负载的组件呢,如一个特定的进程或任务没运行,性能将产生影响。在一些情况下,缓冲组件或撤退机制允许一些应用继续运行,尽管是低吞吐量。介绍一个例子,互联网域名服务器常被配置成去与一个叫named的后台监督进程或一个off-host服务进行交互。如果一台域名服务器(在/etc/resolv.conf文件中nameserver行列出的第一台服务器名字)没有运行,在与其他信息提供服务器交互前,有一个超时的区间。对用户来说,出现一个应用程序的偶尔延迟。对使用uptime监控系统的人来说,负载平均值不会出现非常高。然而,在这种情况下,vmstat工具的输出将帮助定位问题。特别说明,本章介绍的很多工具已及后面的两个将帮助你理解CPU将做什么,性能分析者可以设置系统性能的假设,然后验证这些假设。
Vmstat
Vmstat是一个实时性能监控工具。Vmstat命令提供不寻常系统活动的数据,例如高页面错误或过度上下文切换,这些降低系统性能。数据显示频度由用户定义参数决定。Vmstat输入的例子如下:
Vmstat产生如下信息:
l Procs部分报告正在运行进程的数量(r)和阻塞进程的数量(b)。可以使用这些信息来检查是否正在运行进程的数量和阻塞进程的数量与你期望的数量一样多。如果不是,可以检查如下内容:应用程序和内核的参数,系统调度和I/O调度,在可用处理器上的进程分布等等。
l Memory部分报告交换出去的内存数量(swpd),可用内存(free),I/O数据结构的高速缓冲区(buff),从硬盘读取数据后用于存放文件的缓冲存储器(cache),单位kb。Swpd值反射kswapd活动。
l Swap部分返回从硬盘切换进内存的数据量(si)和从内存切换进硬盘的数据量(so),单位kb/s。注意so反映kswapd活动作为数据被切换到交换区。然后,si反映页面错误活动(page fault activities)作为页面被切换到物理内存。
l Io部分报告从设备阻塞读入的数量(bi)和阻塞读出到设备(bo),单位kb/s。遇到执行I/O操作强烈的应用,要特别注意这两个区域。
l System部分报告每秒中断数量(in)和每秒上下文切换(cs)数量。
l Cpu部分报告用户占用(us),系统(sy),真实空闲(sy)和等待I/O完成(wa)的总共CPU时间的百分比。或许最普通的度量就是CPU利用。如果wa很大,可以推断需要检查I/O子系统,需要增加更多的I/O控制器和磁盘来减少I/O等待时间。
针对I/O负载强烈的情况,你可以监控bi和bo得到传输率,in得到中断率。你可以监控swpd,si和so来查看是否系统正在转储。如果是,你可以检查转储率。或最通用的度量就是CPU利用率,通过监控us,sy,id,wa。如果wa值很大,你需要检查I/O子系统。能够得出结论需要增加更多I/O控制器和磁盘来减少I/O等待时间。
像uptime一样,当vmstat不带任何可选项运行,仅报告单一系统瞬间快照。如果你在uptime后面再运行vmstat,可以得到一个忙碌系统的快照,还有处理器的指标,其中包含用户,系统,空闲和I/O等待次数等百分比分解指标。另外,vmstat提供可捕获处理器数量的瞬时计数。注意uptime提供跨越三个时间区间(1min,5min,15min)的可捕获处理器数量的视图。所以,如果通过uptime得到的负载平均值在任何时间区间依然大于1,那么通过vmstat报告的可捕获任务的数字也应该接近1.
因为vmstat也可以提供标准的重复间隔的信息,你可以通过如下命令得到更多动态的系统视图:
$ vmstat 5 10
这个命令输出vmstat信息间隔5秒10次迭代。
Top
Top是非常有用的工具,用来理解任务和进程,以vmstat或uptime为基础提供高级别信息。可以展示哪些进程是活动的,哪些超时了,以及消耗最多进程时间或内存的信息。
Top命令提供所有运行进程和系统负载的更新概况。Top命令提供CUP负载,内存使用,单个进程使用的详细快照情况。也提供如uptime命令的负载平均值快照;然而,top也提供中断的进程数量,即进程被创建但当前正在睡眠,和正在运行中的进程。
Top命令在其输出中包含如下信息:
l 第1行显示系统运行时间,宝货当前时间,自上次重启系统已经运行多久,当前用户数量,3个负载平均值数字。负载平均值数字展现处理器在过去1,5,15分钟内运行的平均数。
l 第2行包含进程统计,包含当前正在运行的进程总数。该行也包含睡眠进程数,运行进程数,僵尸进程数和停止进程数。
l 第3行和第4行显示单独CPU统计,包括被用户,系统,输入输出和空闲进程占用的CPU时间百分比。
l 第5行提供内存统计,包括总内存,已用内存,可用内存,不同进程的共享内存,供缓存使用的内存。
l 第6行显示虚拟内存或转换统计,包括总的可用转换空间,已用的转换空间,可用转换空间,和缓存转换空间。
内存应用
应用负载易于耗尽所有可用内存,linux提供了一个虚拟内存的解决方案,当内存不够用的时候,卸载一部分内存中使用频率不高的数据到硬盘存储,不幸的是,代价就是造成十倍或者百倍的应用程序的等待,造成应用程序响应时间的过高,更有戏剧性的问题是,当把应用程序需要的内存数据卸载到硬盘上,或应用程序实际需要的内存容量大于实际物理内存,将不断进行卸载内存数据操作。
很多性能问题是由内存不足引起的,触发系统频繁卸载内存数据到硬盘。
/proc/meminfo
Linux提供了监控整个系统内存资源的应用,/proc/meminfo和/proc/slabinfo。这两个文件捕捉物理内存的状态。/proc/meminfo的部分显示如下:
MemTotal: 8282420 kB
MemFree: 7942396 kB
Buffers: 46992 kB
Cached: 191936 kB
SwapCached: 0 kB
HighTotal: 7470784 kB
HighFree: 7232384 kB
LowTotal: 811636 kB
LowFree: 710012 kB
SwapTotal: 618492 kB
SwapFree: 618492 kB
Mapped: 36008 kB
Slab: 36652 kB
MemTotal 显示整个系统的物理内存,MemFree显示未使用内存大小。
Buffers对应I/O操作的缓冲器大小。Cached对应从硬盘读取文件的内存大小。
SwapTotal显示虚拟内存总大小。如果基于IA32架构系统物理内存大于1GB,HighTotal就是非零。
HtghTotal对应物理内存大于860MB的内存。
LowTotal属于内核专用内存。Mapped对应内存映射文件。
Slab对应内核数据架构应用内存。在捕获/proc/meminfo期间,可以建立一个内存应用模型。就是简单脚本和图形工具的目的,模型用于视觉汇总。
/proc/slabinfo
理解内核内存消耗,审查/proc/slabinfo。/proc/slabinfo的部分显示如下:
第一列显示内核数据结构列表名称。进一步解释Tcp_bing_bucket,总共有224个tcp_bind_bucket对象,56个处于活动状态,每个数据结构占用32字节。在两个页面中至少有一个活动对象,且一共有两个已分配页。此外,一个页面指定一个长字节。拥有这些数据结构数据可以帮助集中焦点,比如比较大的计数或大小。因此,通过一起捕捉meminfo和slabinfo,你能够开始理解操作系统的什么元素消耗更多的内存。如果LowFree或HighFree的值是相对较小(或比平常更小),这是表明系统正处于比以往更多的内存请求,这将导致整体性能或应用响应时间的下降。
Ps
找出每个特定进程是如何使用内存的,使用ps查看每个进程使用内存情况:
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 1528 528 ? S 15:24 0:00 init [2]
root 2 0.0 0.0 0 0 ? SN 15:24 0:00 [ksoftirqd/0]
root 3 0.0 0.0 0 0 ? S< 15:24 0:00 [events/0]
root 4 0.0 0.0 0 0 ? S< 15:24 0:00 [khelper]
root 5 0.0 0.0 0 0 ? S< 15:24 0:00 [kacpid]
root 48 0.0 0.0 0 0 ? S< 15:24 0:00 [kblockd/0]
root 63 0.0 0.0 0 0 ? S 15:24 0:00 [pdflush]
root 64 0.0 0.0 0 0 ? S 15:24 0:00 [pdflush]
(VSZ)虚拟内存覆盖
(RSS)当前占用内存
/proc/pid/maps 查看进程的虚拟地址空间层。
Vmstat
Vmstat在CPU利用部分介绍过了。然而,该命令的主要目的是监控可用内存和活动交换,提供I/O活动的概述。Vmstat常用来帮助查找异常系统活动,例如高页面错误或过度的上下文切换,这些将导致系统性能的下降。Vmstat的输出如下:
Vmstat产生的与内存相关的数据报告如下:
l Memory部分报告交换出去的内存数量(swpd),可用内存(free),I/O数据结构的高速缓冲区(buff),从硬盘读取数据后用于存放文件的缓冲存储器(cache),单位kb。Swpd值反射kswapd活动。
l Swap部分返回从硬盘切换进内存的数据量(si)和从内存切换进硬盘的数据量(so),单位kb/s。注意so反映kswapd活动作为数据被切换到交换区。然后,si反映页面错误活动(page fault activities)作为页面被切换到物理内存。
l Io部分报告从设备阻塞读入的数量(bi)和阻塞读出到设备(bo),单位kb/s。遇到执行I/O操作强烈的应用,要特别注意这两个区域。
针对I/O负载强烈的情况,你可以监控bi和bo得到传输率,in得到中断率。你可以监控swpd,si和so来查看是否系统正在转储。如果是,你可以检查转储率。或最通用的度量就是CPU利用率,通过监控us,sy,id,wa。如果wa值很大,你需要检查I/O子系统。能够得出结论需要增加更多I/O控制器和磁盘来减少I/O等待时间。
I/O利用
尽管整体的处理器速度,内存大小和I/O速度在持续提高,I/O的吞吐量和等待时间依旧慢于内存访问速度的几个数量级。另外,因为很多负载量有实质的I/O组件,I/O可以轻易的成为整体吞吐量和整体应用响应时间的重要瓶颈。对于I/O操作密集的应用,性能分析人员必须能够通过使用工具来帮助提供I/O子系统的操作详情。
本节只看磁盘I/O。下一节将查看网络I/O,因为度量吞吐量和等待时间的工具不同。
对于磁盘I/O,性能通常就是吞吐量和等待时间。对于大量顺序传输和小量随机传输,磁盘驱动器能很快的处理大量顺序传输。大量顺序传输允许进行例如先读后写这样的优化,让存储系统减少头一动和尽可能的执行全轨道写。然而,很多应用程序是不同的存取数据形式,通常是在磁盘上的非预期位置。结果就是,多样的I/O负载形式是顺序和随机I/O的组合,且是不同块大小的传输。
当评估系统I/O性能的时候,性能分析师需要遵守几件事。首先,或许是最明显的(也是经常被忘记的),I/O性能不可能超过基础硬件的性能。尽管在这方面没有更深入的说明,在理解系统基础限制的情况下去分析I/O吞吐量和等待时间是有帮助的。例如,存储设备的性能方面,I/O总线连接存储设备(例如,SCSI和光纤),总之,不同的基础架构会有不同的I/O性能分析。在一些复杂的系统配置,保留一个“速度和喂养”(speeds and feeds)这样的清单是有益于判断是硬件瓶颈还是软件瓶颈的。
理解软件瓶颈和相关的性能影响,两个主要的考虑是总的I/O吞吐量和任何单个I/O请求的等待时间。理想情况下,一个系统想要优化从介质写入和读出的数据传输率。然而,因为一个单独请求的等待时间能极大超出处理器处理的时间,应用能有效停止来等待I/O的处理。例如,应用读取一块数据信息,该信息是如何访问下一块数据的信息,等等类似情况。如果系统或应用不能优化这部分,I/O的组合等待时间就是性能的限制。该问题的一个通用解决办法就是并行执行很多类似的操作。允许应用或操作系统并行处理多任务的能力可以有效调度很多并行I/O请求等待时间。结果就是,I/O子系统的整体效率,或总I/O吞吐量,将接近基础I/O子系统的实际处理能力。尽管这是操作系统和单个应用优化整体系统吞吐量的一个目标,如此做的一个终端用户响应时间的代价通常是不被接受的。
基本的I/O等待时间能够被数据传输请求的输入模式严重影响。例如,如果磁盘I/O请求在磁盘介质的开头和结尾进行交替执行,物理磁盘机械臂需要进行相对缓慢的调整来定位选定磁盘块的磁盘头。这样的存取类型将明显减慢所有的访问,因此减少I/O操作的次数可以在一定时间内完成。这种奇怪的访问方式不仅仅减少每个逻辑驱动器设备的访问次数,也将提高整体的I/O传输率。
其他针对多任务的解决方案是确认从应用和操作系统的数据求情很好的分布在多硬盘上。分布I/O请求道多硬盘上,有效提高并行处理能力,进一步减少磁盘驱动器的等待时间的性能问题。多磁盘上的应用数据的重分配,通常需要一个可理解的固定负载量,也就是数据访问方面的负载量的理解。
尽管系统监控工具不能提供针对特定应用问题追踪每个I/O操作的能力。一些工具允许性能分析人员监控系统进程产生的I/O的总数,每个逻辑磁盘I/O操作数量,总的I/O传输率。两个主要工具将在后面进行介绍,iostat和sar。将帮助你理解I/O瓶颈所在,哪个磁盘或哪个连接未充分利用,通过系统透视数据(相对于应用透视数据)了解都有哪些等待时间。
在探索特定工具之前,了解一些改进I/O性能的计数。这些技术包括纯粹的硬件相关解决办法(例如磁盘驱动器选择转数高,低I/O等待时间,大磁盘缓存,或大控制器缓存)。也包括改进数据传输率的读写,提高I/O总线速度,I/O光纤速度,这些都能提高数据传输率和减少I/O等待时间。一些磁盘驱动器和磁盘存储系统提供多口逻辑或物理磁盘,允许从单磁盘进行平行I/O,再次增加潜在I/O吞吐量。另外,硬件或软件RAID也被设计来增加并行访问,即把数据在多硬盘上按照条纹形式来存储。
Iostat
Iostat命令监控系统I/O活动,通过观察物理磁盘活动与平均传输率的关系。Iostat命令产生报告用来改变系统配置来更好的平衡物理磁盘间I/O负载。Iostat也提供CPU应用情况,有时对于I/O活动的分析进行比较也是很有帮助的。如果没有指定间隔,iostat给出自上次启动以来的I/O信息。如果指定显示间隔,第一个记录集显示自启动以来的活动总数,后来仅显示增量活动。
Iostat报告CPU利用情况类似于top工具。它剥离CPU时间为用户,nice(标准输入输出控制执行程序),系统,I/O等待和系统空闲。Tps字段显示的是针对逻辑磁盘产生的I/O请求数。然而,I/O请求的大小没有给出。Blk_read/s和Blk_wrtn/s表示每秒磁盘数据块读,每秒磁盘数据块写(每秒读写的块数)。再一次没有给出块大小。最后Blk_read和Blk_wrtn对应磁盘数据块读总数,磁盘数据块写总数,依然没有说明块大小。
使用-k可选项,按照kb显示统计,-p可选项获得每个分区统计,-x可选项获得平均等待时间和平均服务时间。
Sar
Sar包含在sysstat包里。Sar收集和报告更广泛区域的系统活动信息。活动包括I/O操作,CPU利用,上下文切换率和中断,页面换入换出率,共享内存使用,缓冲区和网络。基于计数值和间隔值参数,sar –b 3 12 报告磁盘使用,每3秒统计一次,共12次。统计的最后给出平均统计。Sar拥有众多可选项。可通过man sar进行学习。
网络应用
本节探索一些在大部分linux上可用的工具,主要有netstat,nfsstat,tcpdump,ethtool,snmp,ifport,ifconfig,route,arp,ping,TRaceroute,host,nslookup。
系统和网络管理员每天都使用这些工具。例如ping,route,arp,TRaceroute,ethtool和tcpdump可用来检查网络问题。
网络统计
Netstat应用在网络工具包里可用,显示大量关于网络系统的相关信息。
Netstat是一个频繁使用的工具,用来监控linux服务器的网络连接情况。Netstat显示每个网络协议的活动socket包,例如TCP和UDP。也提供网络路由信息和网络接口的累积信息,包括输入输出包的数量,包冲突数量。Netstat输出包括大量的网络协议统计和路由信息,比如互联网协议(IP),传输控制协议(TCP),用户数据报文协议(UDP)。通过统计信息,你可以分辨接收到的包数量的高低是否与预期一致。该工具很容易调查因为内核引起的性能降低问题。
netstat
毫无疑问,netstat显示已存在的网络socket列表和连接信息。所有协议都将显示,包括UNIX域socket。如下内容为典型输出:
第一个字段表明socket协议组,通常为tcp,udp或unix。第二和第三字段表明数据的数量,单位bytes,即当前存在的接受和发送socket队列。第四,第五列显示本地和远程地址和端口信息。最后一行显示当前socket协议状态。
IP地址通常转换为主机名(nethostA,nethostB),除非使用netstat –n命令。
仅显示选择的地址组,需要提供相应的标志位。例如netstat –tcp或-t,仅显示当前TCP sockets。了解更多标志位man netstat。
星号(*)表示通配符。对本地地址,是典型的监听进程,监听所有本地接口。远程主机地址和端口信息当socket已经连接到远程主机将被显示,是established状态。你可以查看ssh,http,ftp连接在先前的显示中。
Netstat –in
rx-err:网卡输入包错误个数
tx-err:网卡输出包错误个数
如果上面几个列值大于零,则说明网卡或网线、交换机等工作不正常,或配置有问题
Linux查看网络即时网速
sar -n DEV 1 100
1代表一秒统计并显示一次
100代表统计一百次
https://blog.csdn.net/hguisu/article/details/7493661