.NETAmazing .NETdotNET

结合“性能监视器” 排查、处理性能瓶颈导致应用吞吐率等指标上不去

2019-08-25  本文已影响0人  Nondeterminacy

本文转自:https://blog.zhuliang.ltd/2019/08/server/test-with-perfmon.html,转载请注明出处。

双11备战前夕,总绕不过性能压测环节,TPS 一直上不去 / 不达标,除了代码上的问题外,服务器环境、配置、网络、磁盘、CPU 亦是导致性能瓶颈的重要一环,本文旨在分享最近项目性能压测过程中的排查经验,文中的表单你可以作为排查手册保存,如有不对之处,还请在评论区分享、交流你的经验和观点:)

通过本文,你可以了解和掌握:

吞吐量 和 延时的关系

关于吞吐量/吞吐率、延时,你可以通过 Jmeter中的”聚合报告“和”用表格查看报告“来获取。

常见系统瓶颈:

定位性能瓶颈

定位的方式不一定是程序级别的,一开始可以先从操作系统的 CPU 使用率,内存使用率,系统 IO 和 网络 IO,网络连接数 着手分析。

性能优化的几个策略

性能监视器

在服务器上最直观监视性能的方式就是直接使用系统自带的”性能监视器“。

>perfmon #直接在 "运行" 中输入 perfmon 即可打开
image

windows 下计数器说明:

类别 计数器名称 描述 结论
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 请求的速率。

参考

上一篇下一篇

猜你喜欢

热点阅读