在对互联网服务进行服务端性能测试时,主要关注两方面的性能指标:
  业务指标:如吞吐量(QPS、TPS)、响应时间(RT)、并发数、业务成功率等
  资源指标:如CPU、内存、Disk I/O、Network I/O等资源的消耗情况
  本文主要介绍一些广泛适用的、基本的资源指标以及这些指标在Linux服务器的获取方式。
  一. CPU
  关于CPU资源,有三个重要概念是我们需要关注的:使用率、运行队列和上下文切换,这里借助一张描述进程状态的图来进行简要说明:

  Process state -via wikipedia
  Running:正在运行的进程
  Waiting:已准备绪,等待运行的进程
  Blocked:因为等待某些事件完成而阻塞的进程,通常是在等待I/O,如Disk I/O,Network I/O等。
  这里的Running和Waiting共同构成Linux进程状态中的可运行状态(task_running),而Blocked状态可以对应Linux进程状态中的不可中断睡眠状态(task_uninterruptible)
  在Linux可以使用vmstat来获取这些数据:
[hbase@ecs-097 ~]$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
6  0      0 4591436 176804 1185380    0    0     0     0 7915 10357 83  5 12  0  0
  CPU使用率(CPU Utilization Percentages):有进程处于Running状态的时间/总时间。在vmstat主要通过us、sys和id三列数据来体现:
  · us:用户占用CPU的百分比
  · sy:系统(内核和中断)占用CPU的百分比
  · id:CPU空闲的百分比
  性能测试指标中,CPU使用率通常用us + sy来计算,其可接受上限通常在70%~80%。另外需要注意的是,在测试过程中,如果sy的值长期大于25%,应该关注in(系统中断)和cs(上下文切换)的数值,并根据被测应用的实现逻辑来分析是否合理。
  运行队列进程数(Processes on run queue):Running状态 + Waiting状态的进程数,展示了正在运行和等待CPU资源的任务数,可以看作CPU的工作清单,是判断CPU资源是否成为瓶颈的重要依据。vmstat通过r的值来体现:
  · r: 可运行进程数,包括正在运行(Running)和已绪等待运行(Waiting)的。
  如果r的值等于系统CPU总核数,则说明CPU已经满负荷。在负载测试中,其可接受上限通常不超过CPU核数的2倍。
  上下文切换(Context Switches):简单来说,context指CPU寄存器和程序计数器在某时间点的内容,(进程)上下文切换即kernel挂起一个进程并将该进程此时的状态存储到内存,然后从内存中恢复下一个要执行的进程原来的状态到寄存器,从其上次暂停的执行代码开始继续执行至频繁的上下文切换将导致sy值增长。vmstat通过cs的值来体现:
  · cs:每秒上下文切换次数。
  另外还有一个指标用来作为系统在一段时间内的负载情况的参考:
  平均负载Load Average:在UNIX系统中,Load是对系统工作量的度量。Load取值有两种情况,多数UNIX系统取运行队列的值(vmstat输出的r),而Linux系统取运行队列的值 + 处于task_uninterruptible状态的进程数(vmstat输出的b),所以会出现CPU使用率不高但Load值很高的情况。Load Average是在一段时间内的平均负载,系统工具top、uptime等提供1分钟、5分钟和15分钟的平均负载值。
  [hbase@ecs-097 ~]$ top
  top - 19:23:28 up 18:05,  3 users,  load average: 0.80, 0.60, 0.53
  上面示例中的0.80即是1分钟内的Load average,以此类推。
  当我们需要了解当前系统负载情况时,可以先查看Load average的值,如果系统持续处于高负载(如15分钟平均负载大于CPU总核数的两倍),则查看vmstat的r值和b值来确认是CPU负荷重还是等待I/O的进程太多。