目录
1. Linux与性能分析
2. CPU
2.1 /proc/cpuinfo
2.2 vmstat
2.3 top和gtop
2.4 sar
3. 内存
3.1 /proc/meminfo 和 /proc/slabinfo
3.2 free
3.3 ps
3.4 vmstat
3.5 sar
3.6 Valgrind
4. I/O
4.1 iostat
4.2 sar
5. 网络
5.1 网络统计信息
5.2 接口信息
5.3 TCP/IP协议统计数据
5.4 nfsstat
【写在前面】
前文参考:系统性能监控分析(Linux,Windows)
该文是学习笔记,来源于学习教材的总结,并加上自己的手动操作截图。在此记录,仅供自学。如侵删。
日益高涨的性能期望转化为对操作系统调度器,内存管理,磁盘以及网络I/O子系统的扩展性加以性能分析和改进。
系统性能的主要指标之一是系统对用户的响应速度。
在对系统的方法化分析中,最基本的工具之一常常是对系统CPU利用率的简单测量。
Linux和Unix都提供了一个命令uptime来显示系统的平均负荷(load average)。
备注:
(1)在平均情况下,处理器要执行的工作会多于它的处理能力。
(2)若在双CPU机器上,uptime显示的负荷平均值小于2.00的话,表示处理器仍拥有额外的空闲周期。若在4个CPU机器上,如果负荷平均值小于4.00,也表示处理器仍有额外的空闲周期。但负荷平均值也不能说明问题。
(1)/proc/cpuinfo确定系统的CPU情况
该文件描述中有6个条目适用于多内核和超线程技术(HT)检查:
processor:包括这一逻辑处理器的唯一标识符。
vender id:
physical id:表示每个物理封装的唯一标识符。拥有相同的physical id,表示所以逻辑处理器共享同一个物理插座。
siblings:列出了位于相同物理封装中的逻辑处理器的数量。它们可能支持也可能不支持超线程技术。
core id:代表每个内核的唯一标识符。所有带相同core id的逻辑处理器均位于同一个处理器内核上。
cpu cores:包含位于相同物理封装中的内核数量。也可表示是否支持多内核。
如果有一个以上逻辑处理器拥有相同的core id和physical id,则说明系统支持超线程技术。
如果有两个以上(含两个)的逻辑处理器拥有相同的physical id,但是core id不同,则说明这是一个多内核处理器。
(2)rpm i386, i586, i686 的区别
有的rpm有多个版本:
abc-1.2.3-4.i386.rpm
abc-1.2.3-4.i586.rpm
abc-1.2.3-4.i686.rpm
这里不同版本是指适用于intel i386, i586, i686兼容指令集的微处理器:
i386:Intel 386(老的386机器,反之IA32体系的CPU)
i486:Intel 486
i586:Intel 586(Pentium,K6级别CPU)
i686:Intel 686(Pentium II, Pentium III, Pentium 4, K7级别CPU)
通常,等级越高的机器可接受较低等级的rpm文件。通过cpu family就能知道CPU型号。
(3)常用命令实例
(4)什么是超线程技术
Hyper-Threading, 就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的运行效率。
超线程技术是在一个CPU同时执行多个程序而共同分享一个CPU内的资源,理论上要像两个CPU一样在同一时间执行两个线程,虽然采用超线程技术能同时执行两个线程,但它并不像两个真正的CPU一样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂停,让出资源,直到这些资源闲置后才能继续。因此,超线程的性能并不等于两个CPU的性能。
如果slibings是cpu cores的两倍,说明支持超线程,并且超线程已打开。
vmstat,vitual memory statistics, 是一个实时性能监视工具。
提供了有助于发现系统异常活动的数据,例如会降低系统性能的过多页面错误或上下文切换次数。
这些数据的显示评率可以指定。
如下命令表示:每5秒输出vmstat信息,共执行10次。
(1)procs
提供了在申城报告时正在运行的进程数目r,和被阻塞的进程数目b。
可以利用这些信息来检查运行中的数目和阻塞进程的数目,是否与预期值相符。
如果和预期不符,可以检查:应用和内核的参数,系统调度器和I/O调度器,进程在可用处理器之间的分布等。
举例:
当r超过40时,证明系统很忙。
理想情况下,等待或阻塞的进程数量应该为0或接近0。如果数值较高,则表示系统没有足够的资源。诊断性能问题时该信息非常有用。
(2)memory
提供了换出内存swpd, 空闲内存free,I/O数据结构的缓冲区缓存buff, 从磁盘读取文件的内存缓存cache的容量,单位我KB。swpd反映了kswapd的活动情况。
举例:
buffer数目很大,表示对设备块的读写较为频繁,需要缓冲大量的buffer。
Cache较大说明用到的cache文件很多,另外从bi那列数据很小,可以得出当前文件系统效率好。
如何计算空闲内存:
+buffer/cache = free + buffers + cache
-buffer/cache = used - buffers - cached
(3)swap
提供了从磁盘上换入的内存容量si,和换出到磁盘上的内存量so,单位是KB/s。
si反映了当页面被换回到物理内存时发生页面错误的情况。
so反映了数据被换出至交换区时kswapd的活动情况。
io提供了从设备读入的块数bi,和写出到设备上的块数bo,单位块/s。
当运行I/O密集的应用时,要特别注意bi和bo。
(4)io
io下的数据表示往返于磁盘的数据流。表示正在进行的磁盘活动量,这并不一定表名存在问题。当看到proc和b列(正在阻塞的进程)下有较大的数值和较高的I/O,则可能出现了严重的I/O争用问题。可以通过iostat, sar, top等命令进一步分析磁盘的负载性能。
(5)system
提供了每秒的中断数目in,和上下文切换数目cs。
常见业务会产生大量软中断的有:
大量的数据包,频繁读写文件,TCP/IP协议等。具体业务具体分析。
关于上下文切换:
如果可运行的线程数大于CPU的数量,那么OS最终会强行换出正在执行的线程,从而使其他线程能够使用CPU。这会引起上下文切换,它会保护当前运行线程的执行上下文,并重建新调入线程的执行上下文。
(6)cpu
提供了用户us,系统sy,真正空闲id,等待I/O完成wa在CPU总时间中所占的百分比。
CPU利用率也许是最常用的量度。往wa值过大,则应该检查I/O子系统。
延伸:Linux的中断
top和gtop可以显示哪些进程是活跃的以及哪些进程消耗的处理时间或内存最多。
top命令:对于所有正在运行的进程和系统载荷提供不断更新的概览信息,包括CPU负荷,内存使用以及每个进程的内存使用情况。
输出解析:
(1)第一行是任务队列信息: ==uptime
(2)第二,三行是进程和CPU信息:==mpstat -P ALL
(3)第四,五行是内存信息:==free
(4)第六,七行是进程信息:==ps aux
状态详解:
(1)可运行R:TASK_RUNNING
(2)可中断的睡眠S:TASK_INTERRUPTIBLE
(3)非自愿(不可中断或强制)睡眠D
(4)暂行状态或跟踪状态T:TASK_STOPPED OR TASK_TRACED
(5)僵死的进程Z:TASK_DEAD - EXIT_ZOMBIE
(1)什么是sar
sar是sysstat工具包的组成部分。
它手机并报告操作系统中广泛的系统活动,包括CPU利用率,上下文切换和中断速率,页换入和页换出速率,共享内存使用情况,缓冲区使用情况以及网络使用情况。
sar很有用,它不断地收集系统活动信息并将其记录到一组日志文件中,从而有可能在报告性能衰退时间之前以及在该时间之后评估性能问题。
sar常常用于确定时间的而时间,也可以用于标识特定的系统行为变化。
sar可以使用更短的时间间隔或固定数目的时间间隔来输出信息,类似vmstat。
sar工具可以指定时间间隔执行指定次数的信息输出操作。
sar可以为所收集的许多数据点提供平均信息。
小结:使用sar命令怀疑CPU存在瓶颈,可以用 sar -u -P -q来做初步分析。
(2)安装sar
sar是一个外部工具,需要先安装
(3)统计全部的报告 -A
-A 参数:代表sar命令会统计所以报告。包括:文件的读写情况,系统调用的使用情况,磁盘的I/O,CPU利用率,内存使用情况,进程活动等。
-o 参数:生成报告后,只能通过-f参数去查看。
(4)CPU利用率 -u:显示平均的CPU使用情况
输出解析:
%user:表示用户层面所使用的CPU利用率,可以通过ps,top等查出比较高的CPU进程。
%nice:在用户级别,用于nice操作,这里所占用CPU总时间的百分比0
%system :核心级别运行所使用CPU总时间的百分比
%iowait:用于等待I/O操作占用CPU总时间的百分比
%steal:管理程序hypervisor为另一个虚拟进程提供服务而等待虚拟CPU的百分比
%idle:空闲时间占用CPU总时间的百分比
(5)CPU利用率 -P{
(6)进程队列长度和平均负载状态监控 -q
输出解析:
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程processes和线程threads的数量
ldavg-1:最后1分钟的系统平均负载
ldavg-5 :过去5分钟的系统平均负载
ldavg-15 :过去15分钟的系统平均负载
通常,plist-sz显示的信息包括了进程和线程的数量。
命令: ps -eLf | wc -l 查看所有进程和线程的信息
工作负荷可能会耗尽所有可用的内存。
Linux提供了对物理内存进行合理高效的访问并可以访问潜在的海量虚存的技术。
虚存通常稍多于操作系统实际拥有的内存容量,以便将较少使用的数据卸载到磁盘存储器上,同时又呈现出系统拥有大量物理内存的假象。
但是,卸载内存的开销可能会比应用延迟高出数十数百倍。
如果被换出到磁盘上的内存空间是错误的内存页,或者如果应用程序的当前内存大于物理内存的话,那么这些过高的延迟会影响应用的响应时间。
许多性能问题都是由于内存不足而引起操作系统的交换。所以,需要监视内存的使用情况。
(1)命令:free [-b | -k | -m] [-o] [-s delay] [-t] [-V]
(2)free -m:查询当前内存使用情况,以兆为单位
输出解析:
第二行(mem):从OS的角度来内存的总体,使用,剩余和cache情况
total表示内存总数
used表示已经使用的内存数
free表示空闲的内存数
shared当前已经废弃不用,总是0
buffers Buffer缓存内存数
cached Page 缓存内存数
公式:Total = used + free = (- buffers/cache) + cached + buffers + shared + free
第三行(+/-buffers/cache):
used内存数: 指的是第一部分Mem行中的used-buffers-cached
free内存数:指的是第一部分Mem行中的free+buffers+cached
-buffer/cache反映的是被程序实实在在用掉的内存
+buffer/cache反映的是可以挪用的内存总数
公式: Total = (- buffers/cache) + cached + buffers + shared + free
1)buffer
作为buffer cache的内存,是块设备的读写缓存区。
2)cache
作为page cache的内存,文件系统的cache。
Cache能有效缩短I/O系统调用的时间。
ps工具可以获取每个进程的内存占用情况。
通过命令 ps aux,输出结果显示了每个进程小哈哦系统内存的总体百分比,以及该进程的虚存印迹(VSZ),当前使用的物理内存(RSS)。
也可以使用top,通过交互的方式对进程列表进行排序,以便查看哪些进程当前消耗的内存最多,以及内存使用情况如何随着系统的运行而变化。
可以通过输入top命令后,再同时按住Shift+m两个按键,可以让监控的程序以内存使用率排序。
(1)什么是Valgrind
官网链接:
http://www.valgrind.org/
https://ibm.com/developerworks/cn/linux/1-cn-valgrind/
是一套Linux下,开放源码的仿真调试工具的集合。
Valgrind由内核和基于内核的其他调试工具组成。
内核类似于一个框架,模拟了一个CPU环境,并提供服务给其他工程,而其他工程类似于插件,利用内核提供的服务完成各种特定的内存调试任务。
(2)Valgrind体系结构
图源网络:
Valgrind工具解析(详解略,稍后深入学习后补):
Memcheck:
Callgrind:
Cachegrind:
Helgrind:
Massif:
Extension:
(3)Linux程序内存空间布局
图源网络
iostat的参数详解:略,稍后深入学习后补。
(1)什么是netstat工具
netstat工具是在Net-tools软件包中的,可以显示大量与网络子系统相关的信息。
netstat是监视Linux服务器上网络连接最常用的工具之一。
显示每种网络协议,比如TCP, UDP的活跃socket列表,还提供了关于网络路由的信息以及网络接口的累积统计数据,包括输入输出报文数量以及报文冲突次数。
随后的netstat输出信息显示了大量网络协议统计数据和路由信息。
基于这些统计信息,可以判断收到的报文数目是否和预期的相符。
该工具还可以用于研究内核版本之间的性能差别。
Linux内核支持将RFC2012中规定的统计计数器作为简单网络管理协议SNMP的管理信息库MIB的组成部分。还实现了大量与Linux相关并且捕获网络协议时间(主要是TCP)的计数器。
网络文件系统(Network File System, NFS),可以将远程机器的文件系统和本地文件系统融合起来,即NFS使用与本地相同的读写接口来远程访问数据。
nfsstat是一个打印NFS内核统计信息的简单工具,可以打印出工作负荷中NFS的API调用数量。