性能诊断

性能诊断

在做性能诊断时,一般从两个方面入手,一个是观察机器的运行状态,看看是否有什么瓶颈导致性能不佳。另一种是通过程序细节,看看具体哪些函数或者变量导致机器出现了瓶颈。本文主要介绍前面的方式,从CPU,内存,I/O,网络入手,用基本命令分析系统的瓶颈。

top命令分析

top实时显示系统各个进程的资源占用情况。可以通过top命令来大致判断可能的性能瓶颈出现在哪里,然后通过相关工具做进一步分析。

第一行重点关注 load average: 0.09, 0.07, 0.05: 三个数字分别表示1分钟,5分钟,15分钟的系统负载情况。数据是每隔5秒检查一次活跃的进程数,然后按特定的算法计算出的数值。如果这个数除以逻辑cpu的数量,结果高于5的时候表明系统在超负荷运转

第三行显示了cpu的状态信息 Cpu(s): 1.4%us, 1.5%sy, 0.0%ni, 97.0%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st

us — 用户空间占用CPU的百分比。

sy — 内核空间占用CPU的百分比。

ni — 改变过优先级的进程占用CPU的百分比

id — 空闲CPU百分比

wa — IO等待占用CPU的百分比

hi — 硬中断(Hardware IRQ)占用CPU的百分比

si — 软中断(Software Interrupts)占用CPU的百分比

st — (Steal time)。虚拟 CPU 等待实际 CPU 的时间的百分比。如果你的服务是运行在主机上的虚拟机中,需要关注此值。过高的此值,说明主机上运行的虚拟机过多,引起了cpu时间竞争。

上面的统计是针对所有cpu的平均值,如果要查看具体的cpu值,可以按 1。如果cpu用量分配不均匀,我们要找出引起此现象的进程来,尝试通过绑定cpu的方式来解决。

我们可以看到nginx有两个worker进程,一个分配到了cpu0上,一个分配到了cpu1上。如果cpu分配不均匀,我们可以通过 taskset命令把进程分配到指定的cpu上。

第四行显示了内存信息 Mem: 4057324k total, 3882404k used, 174920k free, 320412k buffers

total — 物理内存总量(4G)

used — 使用中的内存总量(3.8G)

free — 空闲内存总量(174M)

buffers — 缓存的内存总量(320M)

第五行swap分区信息 Swap: 0k total, 0k used, 0k free, 2670272k cached

total — 交换区总量(0K)

used — 使用的交换区总量(0K)

free — 空闲交换区总量(0K)

cached — 缓冲的交换区总量(2.6GB)

在linux系统中,free数量是一直减少的,但是并不是系统出了问题。内核使用内存后,会缓存之前的数据,并不释放。可以通过公式计算大体的内存容量。第四行free + 第四行buffers+第五行cached 就是可用的内存总量。

从第七行开始就列出了活跃的进程列表。能从这里直观的看到cpu及内存占用量。通过 SHIFT + P可以对CPU用量排序, SHIFT + M可以对内存用量排序。

PR — 进程优先级

NI — nice值。负值表示高优先级,正值表示低优先级

VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR — 共享内存大小,单位kb

S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU — 上次更新到现在的CPU时间占用百分比

%MEM — 进程使用的物理内存百分比

进程使用的内存用量可以通过 RES – SHR 简单的估算出来。 也可以通过ps命令监测进程。

CPU性能分析

mpstat

多处理器统计信息工具mpstat,能够报告每个CPU的统计信息。

上面显示了一共有两个CPU用量。具体值与top显示的第三行数据含义是一样的。

如果%sys数值过高,说明应该程序在大量的调用内核方法,利用strace命令进一步确定是哪个内核函数引起的。

strace

strace是一个系统调用接口的调试器。`strace -T -p 可以查看pid进程的系统调用情况。-T显示了系统调用时间。

下面是对进程1009的系统调用统计。

如果想查看具体的调用方法,可以使用 -e参数。

pidstat

pidstat工具按进程或线程打印CPU用量,包括用户态和系统态时间的分解。默认情况下,仅循环输出活动进程的信息。

内存性能分析

vmstat

vmstat是虚拟内存统计信息命令。它提供包括当前内存和换页在内的系统内存健康程度总览。

vmstat默认单位为KB。大内存系统的话,数据列会不对齐而影响阅读。可以用-S选项修改输出单位为MB。

  • r,可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用,每个可运行队列不应该超过3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程;
  • b,被 blocked 的进程数,正在等待 IO 请求;

  • swpd,已使用的 SWAP 空间大小;

  • free,可用的物理内存大小;

  • buff,物理内存用来缓存读写操作的 buffer 大小;
  • cache,物理内存用来缓存进程地址空间的 cache 大小;
  • si,数据从 SWAP 读取到 RAM(swap in)的大小;
  • so,数据从 RAM 写到 SWAP(swap out)的大小;
  • bi,磁盘块从文件系统或 SWAP 读取到 RAM(blocks in)的大小,block 为单位;
  • bo,磁盘块从 RAM 写到文件系统或 SWAP(blocks out)的大小,block 为单位;
  • in,被处理过的中断数
  • cs,系统上正在做上下文切换的数目

I/O性能分析

iostat

iostat汇总了单个磁盘的统计信息,统计信息来源由内核维护,工具开销几乎可以忽略不计。

  • tps:每秒事务数(IOPS)
  • kBread/s、kBwrtn/s:每秒读取KB数和每秒写入KB数
  • kBread、kBwrtn:总共读取和写入的KB数

  • rrqm/s:每秒合并放入驱动请求队列的读请求数
  • wrqm/s:每秒合并放入驱动请求队列的写请求数
  • r/s:每秒发给磁盘设备的读请求数
  • w/s:每秒发给磁盘设备的写请求数
  • rkB/s:每秒从磁盘设备读取的KB数
  • wkB/s:每秒向磁盘设备写入的KB数
  • argrq-sz:平均请求大小,单位为扇区(512B)
  • qvgqu-sz:在驱动请求队列和在设置中活跃的平均请求数
  • await:平均I/O响应时间,包括在驱动请求队列里等待和设置的I/O响应时间(ms)
  • svctm:(推断)磁盘设备的I/O平均响应时间(ms)
  • %util:设备忙处理I/O请求的百分比(使用率)

IO分为顺序IO和随机IO。监测前我们需要清楚系统偏向哪种IO。比如mysql应用更偏向于顺序IO,顺序请求大量数据。web服务应用更多是随机IO。但这也不是绝对的。比如大量的单行查询,可能会造成mysql表现为随机IO。

顺序IO更重视每次IO的吞吐能力(KB per IO)。用每秒读写 IO 字节数除以每秒读写 IOPS 数,rkB/s 除以 r/s,wkB/s 除以 w/s来评估。

随机IO依赖于磁盘的每秒能 IO 的次数,随机 IO 每秒同时会有更多的请求数产生,所以磁盘的每秒能 IO 多少次是关键。比如说SSD每次IO的执行时间短,IOPS就会比较大,在随机应用里面,SSD比普通硬盘性能要好。

网络性能分析

tcpdump

tcpdump是一个网络包分析工具,可以把网络中的包保存起来,供上层工具分析(比如wireshark,tcptrace)。功能十分强大,支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。可以使用tcpdump跟踪网络请求,学习网络协议等。

在docker开发时,访问数据库非常慢。我们实地抓包分析下。 tcpdump port 3306 -n -w 0416.pcap,对端口号进行过滤,只抓数据库访问的包,然后保存到文件0416.pcap。

我们用tcptrace进行简单分析。后面的输出进行了省略。

从上图看到,我们只抓了一个TCP请求周期。elapsed time 关注下这个时间,从第一个包到最后一个包的截止时间,用了347毫秒。再来看下具体的RTT,可以看到一个包来回用了40多毫秒。详细的内容解读,通过 tcptrace -houtput来说明。

用tcpdump抓包后,通过wireshark用图形化的方式进行分析

系统概况

sar 工具相当于系统的活动监视器。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar 会记录系统历史的状态。sar 选项较多,取重要的几个选项来说明。

  • -P ALL :每个CPU利用率
  • -u:CPU利用率
  • -q:CPU运行队列长度
  • -r:内存利用率
  • -S:交换区利用率
  • -d:磁盘统计信息
  • -n DEV:网络接口统计信息
  • -B 换页信息统计

更多的统计分析可以查看man手册。

此条目发表在性能分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。