双11备战前夕,总绕不过性能压测环节,TPS 一直上不去 / 不达标,除了代码上的问题外,服务器环境、配置、网络、磁盘、CPU 亦是致使性能瓶颈的重要一环,本文旨在分享最近项目性能压测过程当中的排查经验,文中的表单你能够做为排查手册保存,若有不对之处,还请在评论区分享、交流你的经验和观点:)html
原文地址(样式排版上更好点,另外文章的后续更新会及时体如今我的博客中) :https://blog.zhuliang.ltd/2019/08/Performance/test-with-perfmon.htmllinux
经过本文,你能够了解和掌握:算法
关于吞吐量/吞吐率、延时,你能够经过 Jmeter中的”聚合报告“和”用表格查看报告“来获取。数据库
定位的方式不必定是程序级别的,一开始能够先从操做系统的 CPU 使用率,内存使用率,系统 IO 和 网络 IO,网络链接数 着手分析。windows
在服务器上最直观监视性能的方式就是直接使用系统自带的”性能监视器“。缓存
>perfmon #直接在 "运行" 中输入 perfmon 便可打开
类别 | 计数器名称 | 描述 | 结论 |
---|---|---|---|
Memory | Available M bytes | 当前空闲物理内存。 | 当这个数值变小时,说明 windows 开始频繁地调用磁盘页面文件,若是这个数值很小(如小于 5Mb,系统会将大部分时间消耗在操做页面文件上),通常要保留 10% 的可用内存,此值太小多是内存不足或者内存泄漏。 |
Pages/sec | 是 Pages Input/sec 和 Pages Output/sec 总和。 | Pages/sec 推荐 0-20,若是服务器没有足够的内存处理其工做符合,此值数值将会一直很高,若是大于 80 ,表示有问题(太多的读写数据要访问磁盘,可考虑增长内存或优化读写数据的算法),该系列的值比较低,说明请求响应比较快,不然多是服务器内存短缺引发(也多是缓存太大,致使系统内存太少。)通常若是Pages/sec 持续高于几百,那么应该进一步研究页交换活动。有可能须要增长内存,以减小换页的需求。Pages/sec 的值很大不必定代表内存有问题,而多是运行使用内存映射文件的程序所致。计数器的比率高表示分页过多。 | |
Pages Read/sec | 读取磁盘,以提取解决页错误所需页的次数。 | 其阈值为 5,该值越低越好(越低,说明响应时间越短);该值大表示磁盘读,而非缓存读。 若是 Page Reads/sec 持续保持为 5,表示可能内存不足。 | |
Page Faults/sec | 该值表示页错误的个数: 当处理器向内存指定位置请求一页(多是数据,也多是代码)出现错误时,这就构成了一个“页错误”。若是该页在内存的其余位置,该错误就被称为软错误(用 Transition Fault/sec衡量);若是该页必须从硬盘上从新读取时,被称为硬错误。 | 许多处理器能够在有大量软错误的状况下继续操做,而硬错误会致使明显的拖延。当进程使用的数据所处的内存页不在内存中时,就会产生该值。若是某页已经在主内存中,或者它正被共享此页的其余进程使用,那么就不会从磁盘调入该页。 | |
Cache Bytes | 分配在RAM中的驻留页面数。 | 默认状况下为 50% 的可用内存。 | |
Committed Bytes | 指以字节表示的确认虚拟内存,是磁盘页面文件上保留空间的物理内存。 | 不超过物理内存的 75% 。 | |
Process | %Processor Time | 处理器消耗的处理器时间,若是专用于某种特定应用(如数据库服务器和应用服务器),则可用应用相关进程 %Process Time 进行衡量。 | 可接受的上限通常不超过 85% 。 |
Page Faults/sec | 将进程产生的页故障与系统产生的相比较,以判断该进程对系统页故障产生的影响。 | ||
Working Set | 表示进程正在使用的物理内存的量。(至因而具体进程仍是全部进程,须要看监控实例是具体的仍是全部的。) | 系统在工做集中的内存页进行寻址的时候,不会引起 Page Fault。另外,若是服务器有足够的空闲内存,页就会留在工做集中,而当空闲内存少于一个特定的阈值时,页就会被清除出工做集中。 | |
Private Bytes | 此进程所分配的没法与其余进程共享的当前字节数量。若是系统性能随着时间而下降,则此计数器能够是内存泄漏的最佳指示器。 | ||
Processor | %Processor Time | 指处理器执行非闲置线程时间的百分比。此计数器能够做为处理器活动的主要指示器。(%Processor Time = 100% - Idle Process时间比例) | 若是该值持续超过95%,代表瓶颈是 CPU,能够考虑增长或更换更快的处理器。正常状况下,保持在 80%±5% 比较好,太低说明 CPU 利用率不高,太高表示是瓶颈是 CPU。虽然该计数器高不必定是坏事,但若是其余处理器相关的计数器(如 Privileged Time 或者 Processor Queue Length)线性增长的话,高 CPU 使用率就值得调查了。 |
%User Time | 非内核操做耗费的CPU时间。通常来讲,若是系统中使用了大量的算法或者复杂的计算操做,该值就会比较大。 | ||
%Privileged Time | 这个计数器表示一个线程在特权模式下所使用的时间比例,当你的程序调用操做系统的方法(如文件操做,I/O 或者分配内存)时,这些操做系统的方法就是在特权模式下运行的。 | 若是数值持续大于 75% 就表示存在瓶颈。 | |
%DPC Time | CPU 消耗在网络处理上的时间。 | 该值越小越好。若是持续高 %DPC 时间,则可能存在 CPU 瓶颈或应用程序或硬件相关问题。 | |
%Interrupt Time | 表示 CPU 接收、处理硬件中断所使用的时间比例。 | 阈值取决于处理器。通常,当该值 >15% 的时候说明可能存在硬件问题。 这个值间接指出产生中断的硬件设备活动,好比网络变化。这个计数器显著增长的话表示硬件可能存在问题 | |
Interrupts/sec | 中断率,表示每秒设备中断 CPU 的次数,能够产生中断的装置包括:系统定时器,鼠标,数据通信联网,网络卡以及其余外部设备等。中断操做在后台完成。 | 该值阈值取决于处理器,但越低越好,不宜超过 1000,若是该值显著增长而系统活动没有相应的增长,则代表存在硬件问题,须要检查引发中断的网络适配器、磁盘或其余硬件。 | |
Physical Disk | %Disk Time | 指所选磁盘驱动器忙于读/写入请求所用的时间百分比。 | 正常值<10,此值过大表示耗费太多时间来访问磁盘,可考虑增长内存、更换更快的硬盘、优化读写数据的算法。若数值持续超过 80(此时处理器和网络并无饱和),则多是内存泄漏。 |
Current Disk Queue Length | 是在收集性能数据时磁盘上当前的请求数量。它还包括在收集时处于服务的请求。这是瞬态的快照,不是时间间隔的平均值。此计数器会反映暂时的高或低的队列长度,可是若是磁盘驱动器被迫持续运行,它有可能一直处于高的状态。 | 请求的延迟与此队列的长度减去磁盘的轴数成正比。为了提升性能,此差应该平均小于 2。 | |
Average Disk Queue Length | 指读取和写入请求的平均数。该值不该超过磁盘数的 1.5~2倍。要提升性能,可增长磁盘。注意,一个Raid Disk 实际有多个磁盘。 | 正常值应小于 5,此值持续过大表示磁盘 IO 太慢,要更换更快的硬盘。建议结合 Pages /sec 一块儿分析,看是内存分页过多致使磁盘一直在读写仍是就是磁盘问题。 | |
Average Disk Read/Write Queue Length | 指读取/写入请求(队列)的平均数。 | ||
DiskRead(Writes)/sec | 物理磁盘上每秒磁盘读、写的次数。 | 二者相加,应该小于磁盘设备最大容量。 | |
Average Disk sec/Read | 指以秒计算的在磁盘上读取数据所需的平均时间。 | ||
Average Disk sec/Write | 指以秒计算的在磁盘上写入数据所需的平均时间。 | ||
Network Interface | Bytes Total/sec | 为发送和接受字节的速率,包括帧字符在内。判断网络链接速度是不是瓶颈,能够用该计数器的值和目前网络的带宽比较。 | 建议不要超过带宽的 50% 。 |
System | %Total Processor Time | 系统上全部处理器都忙于执行非空闲线程的平均时间的百分比,该值反映了用于有用做业上的时间的比率。对单处理器系统来讲,该值很容易理解;对多处理器来上,该值体现了全部处理器的平均繁忙程度。eg:若是全部处理器都繁忙,此值为 100%,若是有一半的处理器繁忙,另外一半处理器彻底空闲,此值为 50%。 | |
File Data Operation/sec | 计算机对文件系统设备执行读取和写入操做的速率。本计数器的计数不包括文件控制文件。 | ||
Processor Queue Length | 处理器队列的线程数量,该计数器显示的是等待中的线程数量,不包括正在运行的线程数量。 | 在 CPU 利用率 80~90% 的系统中,该值应为 "[1,3] * 处理器数量":如在一台 8 核处理器,该值在 [8, 24] 区间范围内算正常;而在 CPU 利用率较低的系统上,该值应为 [0,1],若持续大于 2,就有可能碰到了问题资源,须要进一步排查。 | |
Call/sec | 指运行在计算机上的全部处理器调用操做系统服务例行程序的综合速率,这些例行程序执行全部在计算机上的如安排和同步活动等基本的程序,并提供对非图形设备、内存管理和名称空间管理的访问。 | 该值跟 Processor.Interrupts/sec 联合使用,若是 Processor.Interrupts/sec 大于 Call/sec,则说明系统中某一硬件产生了过多的终端。 | |
Context Switches/sec | 进程切换率,指计算机上的全部处理器所有从一个线程切换到另外一个线程的综合速率。产生上下文的可能状况:当正在运行的线程自动放弃处理器时出现上下文切换;一个有更高优先级的线程取代一个正在运行的低优先级线程的时候会发生上下文切换;在用户模式和内核模式之间切换时产生上下文切换。 | 通常,该值小于 5000/秒/CPU 是不须要担忧的。若是Context 该值达到 15000/秒/CPU 的话就是一个制约因素了,须要看下是否代码致使(如过多的异步操做)。P.S.:上下文切换一样会发生在许多线程拥有相同优先级的状况,若是 CPU 使用率不高且 Context Swtich 很是低,那么可能线程被堵塞。 | |
Web Service | Current Connections | 当前链接数(针对到 IIS 实例)。 | 结合压测用户/线程数进行分析。 |
Current Anonymous Users | 当前匿名链接数。 | 结合压测用户/线程数进行分析。 | |
Current NonAnonymous Users | 当前非匿名用户/匿名链接数。 | 结合压测用户/线程数进行分析。 | |
Get/Put/Post Requests/sec | 使用Get/Put/Post 方式 HTTP 请求的速率。 |
参考性能优化
- 提升 IIS/P2P 并发数,请参见:(经过设置注册表提升 P2P/IIS 并发数)[https://blog.zhuliang.ltd/2019/09/Performance/tcpip-max-limit.html]
Processor queue length:https://social.msdn.microsoft.com/Forums/vstudio/en-US/356b87a3-e8b1-48ad-9355-e68ce3eef754/processor-queue-length?forum=vstest服务器
Interrupt Time 说明:https://docs.microsoft.com/en-us/previous-versions/technet-magazine/cc718984(v=msdn.10)网络
性能计数器:http://www.appadmintools.com/documents/windows-performance-counters-explained/多线程