关于性能监控:Perfmon监控Windows进程性能

Perfmon简介Perfmon(Performance Monitor)是一款Windows自带的性能监控工具,提供了图表化的零碎性能实时监视器、性能日志和警报治理。通过增加性能计数器(Performance Counter)能够实现对CPU、内存、网络、磁盘、过程等多类对象的上百个指标的监控。其中,性能日志可定义输入格局为二进制文件、文本文件、SQLSERVER记录等,以不便后续应用第三方工具进行剖析。 Perfmon数据收集器应用Perfmon反对选择性的监控感兴趣的数据收集器,指标范围广、粒度细,而且反对将监控数据长久化。应用办法: Win+r关上运行窗口,输出 perfmon 后回车关上perfmon.exe。 开展“数据收集器集”,右键单击“用户定义”,指向“新建”,而后单击“数据收集器集”,将启动“创立新数据收集器集”向导。依照向导一步步创立新的数据收集器。举荐手动创立,抉择本人感兴趣的指标监控。创立好后,通过工具栏的启动按钮能够启动数据收集器。点击工具栏上的进行按钮就能够进行数据收集器。之后,能够在右侧导航栏抉择”报告”,开展“用户定义”,查看报告。报告也能够另存为csv文件做进一步剖析。Perfmon对过程的监控指标一般来说,咱们次要关注本人过程的CPU、内存等性能数据。Perfmon设置了过程监控罕用指标,这些指标比拟直观地体现了过程的运行状况,是进行利用系统监控或利用零碎跟踪调优的根据。先监控这些指标须要在创立数据收集器的时候抉择监控process对象,并且选定对象的实例为想要监控的过程。 上面表格列出了Process对象的次要指标: 性能对象计数器提供的信息Process% Privileged Time% Privileged Time 是在特权模式下解决线程执行代码所花工夫的百分比。当调用 Windows 零碎服务时,此服务常常在特权模式运行,以便获取对系统专有数据的拜访。在用户模式执行的线程无法访问这些数据。对系统的调用能够是间接的(explicit)或间接的(implicit),例如页面谬误或距离。Process% Processor Time% Processor Time 是所有过程线程应用处理器执行指令所花的工夫百分比。指令是计算机执行的根底单位。线程是执行指令的对象,过程是程序运行时创立的对象。此计数包含解决某些硬件距离和陷阱条件所执行的代码。Process% User Time% User Time 指解决线程用于执行应用用户模式的代码的工夫的百分比。应用程序、环境分系统和汇合分系统是以用户模式执行的。Windows 的可执行程序、内核和设施驱动程序不会被以用户模式执行的代码损坏。ProcessCreating Process ID valueCreating Process ID value 指创立该过程的父过程号。ProcessElapsed Time该过程运行的总工夫(用秒计算)。ProcessHandle Count这个解决当初关上的句柄总数。这个数字等于这个解决中每个线程以后关上的句柄的总数。ProcessID ProcessID Process 指这个解决的特地的辨认符。ID Process 号可重复使用,所以这些 ID Process 号只能在一个解决的寿命期内辨认那个解决。ProcessIO Data Bytes/sec解决从 I/O 操作读取/写入字节的速度。这个计数器为所有由本解决产生的包含文件、网络和设施 I/O 的流动计数。ProcessIO Data Operations/sec本解决进行读取/写入 I/O 操作的速率。这个计数器为所有由本解决产生的包含文件、网络和设施 I/O 的流动计数。ProcessIO Other Bytes/sec解决给不包含数据的 I/O 操作(如管制操作)字节的速率。这个计数器为所有由本解决产生的包含文件、网络和设施 I/O 的流动计数。ProcessIO Other Operations/sec本解决进行非读取/写入 I/O 操作的速率。例如,管制性能。这个计数器为所有由本解决产生的包含文件、网络和设施 I/O 的流动计数。ProcessIO Read Bytes/sec解决从 I/O 操作读取字节的速度。这个计数器为所有由本解决产生的包含文件、网络和设施 I/O 的流动计数。ProcessIO Read Operations/sec本解决进行读取 I/O 操作的速率。这个计数器为所有由本解决产生的包含文件、网络和设施 I/O 的流动计数。ProcessIO Write Bytes/sec解决从 I/O 操作写入字节的速度。这个计数器为所有由本解决产生的包含文件、网络和设施。ProcessIO Write Operations/sec本解决进行写入 I/O 操作的速率。这个计数器为所有由本解决产生的包含文件、网络和设施 I/O 的流动计数。ProcessPage Faults/secPage Faults/sec 指在这个过程中执行线程造成的页面谬误呈现的速度。当线程援用了不在主内存工作集中的虚拟内存页即会呈现 Page Fault。如果它在备用表中(即曾经在主内存中)或另一个共享页的解决正在应用它,就会引起无奈从磁盘中获取页。ProcessPage File BytesPage File Bytes 指这个解决在 Paging file 中应用的最大字节数。Paging File 用于存储不蕴含在其余文件中的由解决应用的内存页。Paging File 由所有解决共享,并且 Paging File 空间有余会避免其余解决分配内存。ProcessPage File Bytes PeakPage File Bytes Peak 指这个解决在 Paging files 中应用的最大数量的字节。ProcessPool Nonpaged BytesPool Nonpaged Bytes 指在非分页池中的字节数,非分页池是指零碎内存(操作系统应用的物理内存)中可供对象(指那些在不处于应用时不能够写入磁盘上而且只有分派过就必须保留在物理内存中的对象)应用的一个区域。这个计数器仅显示上一次察看的值;而不是一个平均值。ProcessPool Paged BytesPool Paged Bytes 指在分页池中的字节数,分页池是零碎内存(操作系统应用的物理内存)中可供对象(在不处于应用时能够写入磁盘的)应用的一个区域。这个计数器仅显示上一次察看的值;而不是一个平均值。ProcessPriority Base这次解决的以后根本优先权。在一个解决中的线程能够依据解决的根本优先权进步或升高本人的根本优先权。ProcessPrivate BytesPrivate Bytes 指这个解决不能与其余解决共享的、已调配的以后字节数。ProcessThread Count在这次解决中正在流动的线程数目。指令是在一台处理器中根本的执行单位,线程是指执行指令的对象。每个运行解决至多有一个线程。ProcessVirtual BytesVirtual Bytes 指解决应用的虚拟地址空间的以字节数显示的以后大小。应用虚拟地址空间不肯定是指对磁盘或主内存页的相应的应用。虚拟空间是无限的,可能会限度解决加载数据库的能力。ProcessVirtual Bytes PeakVirtual Bytes Peak 指在任何工夫内该解决应用的虚拟地址空间字节的最大数。ProcessWorking SetWorking Set 指这个解决的 Working Set 中的以后字节数。Working Set 是在解决中被线程最近触到的那个内存页集。如果计算机上的可用内存处于阈值以上,即便页不在应用中,也会留在一个解决的 Working Set中。当可用内存降到阈值以下,将从 Working Set 中删除页。如果须要页时,它会在来到主内存前软故障返回到 Working Set 中。ProcessWorking Set PeakWorking Set Peak 指在任何工夫这个在解决的 Working Set 的最大字节数。监控CPU利用Perfmon监控过程的% Processor Time和% User Time这2个计数器能够监控其CPU应用,剖析CPU应用是否存在异样。% Processor Time记录了过程中应用CPU的百分比;% User Time记录了过程用户模式应用CPU的百分比;如果这2个值始终较大,或者继续升高,则可能存在CPU应用异样的问题。 ...

June 19, 2022 · 1 min · jiezi

关于性能监控:APM性能监控软件的监控类型服务及监控流程Alltesting泽众云测试

性能监控软件APMApplication Performance Management(简称APM)是一款业余的性能监控工具,能够对全链路如Web服务器、应用服务器、数据库服务器等进行实时监控,并以图表化的模式直观地出现监控数据,为零碎性能优化和定位问题提供精确的数据根据。 APM性能监控软件产品包含哪些方面性能一、监控类型全面 提供如下类型的系统监控服务,蕴含:JVM监控,JMX监控,服务器监控,MySQL慢日志监控,Oracle监控,Redis监控,Nginx监控,docker监控,链路跟踪监控。 二、操作简略 在被监控的服务器中启动监控客户端,配置相干的数据链接并点击启用,APM监控工具会主动获取监控数据并实时展现。 三、监控数据实时显示 APM监控工具能够实时监控被监控服务器的CPU信息,磁盘信息,内存信息,日志信息等,并以图表的模式直观动静地进行展现。 四、反对交互式剖析 APM监控工具提供实时、交互式剖析,可能展示利用零碎的各种信息,如线程、程序代码、锁、sql语句等,不便剖析性能计数器和性能指标, 定位确定性能瓶颈,精确定位问题。 五、性能预警 在告警配置页面能够自主设置监控数据预警值,当被监控数据达到设定的预警时,会通过邮箱和手机短信两种模式告诉预警信息。 APM性能监控软件监控流程有哪些1、启动监控器 2、登录APM零碎3、Web端 4、增加数据 5、启用数据6、剖析数据

June 8, 2022 · 1 min · jiezi

关于性能监控:博睿数据亮相全球信息系统稳定性峰会

近日,首届“寰球信息系统稳定性峰会”在京举办。此次大会由中国信息通信研究院和中国通信标准化协会领导,中国通信标准化协会大数据技术标准推动委员会和分布式稳定性实验室联结主办。当天,中国信通院也对《信息系统稳定性保障能力建设指南》作了解读。博睿数据作为《信息系统稳定性保障能力建设指南》的次要编撰者之一也缺席了峰会。 作为《建设指南》的次要编撰者之一,博睿数据为本次《建设指南》提供了规范制订、工具制订、能力要求制订等监控、告警、巡检以及拨测畛域的内容撑持,同时参加了信通院分布式系统稳定性实验室组织的行程卡稳定性保障工作,帮忙中国信通院总结稳定性保障相干实践经验、方法论的研究成果。 博睿数据高级金融总监刘颢示意:“在各行业数字化转型减速的背景下,时代呐喊新的零碎稳定性保障体系,2021年9月1日正式施行的《要害信息基础设施平安爱护条例》中对我国要害信息基础设施的稳定性保障工作提出了明确要求。技术方面,AIOps、混沌工程、全链路压测等新技术的呈现也为稳定性保障工作提供了新的思路。博睿数据十分荣幸参加由信通院主导的《信息系统稳定性保障能力建设指南》编写工作,助力信息系统稳定性的保障工作,助力数字化转型‘又快又稳’。” 同时,博睿数据也取得了分布式系统稳定性实验室成员单位证书。 博睿数据作为智能运维的领军者,自成立之初就致力于利用数据赋能IT运维,实现全业务链性能一体化治理,帮忙企业数字化业务高效衰弱倒退,有效应对企业采纳大规模简单分布式系统时传统运维伎俩有余等问题,显著进步IT零碎稳定性,助力企业数字化转型。 峰会现场,博睿数据北区技术总监张俊峰发表了题为《服务可达,体验为先—用户体验建设监控分享》的主题演讲,就博睿数据构建从代码到用户的性能管理体系方面的建设教训进行分享。 以后,随同着云计算、物联网、大数据、人工智能、5G等新兴技术的疾速倒退,数字经济正在减速到来。与此同时,数字化利用的爆发性增长,用户对利用体验提出了更高要求,新兴技术对市场的推动正在粗浅扭转着各行各业与数字经济的互动形式。同时,在疫情常态化的背景下,数字经济曾经成为我国国民经济倒退的要害组成部分,也是国家"十四五"布局中的重要一环。 张俊峰指出,“用户体验作为业务稳定性的要害一环起着无足轻重的作用。” 据统计机构 Statista的数据显示,寰球在客户体验治理中的相干技术投入逐年回升,企业的相干破费将会由2020年的4710 亿美元,攀升到2022年6410亿美元。 此外,在另一项数据考察中,这一趋势则更为显著:假如页面关上工夫慢1秒,那么就将导致用户量降落16%,访问量降落11%,整体转化率升高7%,页面超过3秒无响应,那么就有57%的用户放弃浏览。 从以上两组数据不难看出,用户体验是评判业务稳定性的重要指标。 2021年,博睿数据创新性的提出了数据链DNA概念,将DEM监控数据、NPM网络流量数据以及APM利用性能数据进行整合与剖析,通过前后贯通的TraceID,买通从客户端到主干网,到IDC网络,再到应用服务器之间的整个链路,构建从利用拓扑到网络拓扑的完满交融,打造欠缺的监控体系,确保服务可达和良好的用户体验。博睿数据数字体验治理(DEM),蕴含STM和RUM两种监控状态,涵盖了如PC、手机、WEB/WAP、APP、小程序等一系列利用。STM是无侵入的监测形式,或者说是模仿监测的模式。它次要依赖博睿数据的手机/PC终端监测网络而构建的模仿监测能力,也称拨测。它是非嵌码模式,主动式模仿用户申请,以工作配置的形式,随时随地进行相干利用的测试。同时通过监测,把握理解业务的可用性,理解企业在整个行业当中的位置,与竞品之间的差别等。 RUM是通过SDK/Js代码注入的形式,获取用户的实在体验数据,把握客户在WEB/WAP页面、手机APP以及小程序等业务拜访过程中的真实性能体验。博睿RUM产品通过用户会话性能,从用户应用业务的体验旅程登程,全面剖析各类性能指标对用户应用业务的影响。 同时,通过数据中台买通“云-管-边-端”,构建全面的监控体系,整合调用链(Traces)、指标(Metrics)、日志(Logs)数据,晋升云/云原生中的零碎可观测性,并联合数据的信息特色与业务流程、零碎体现、用户体验各环节的特点进行特色关联,实现全零碎观测、实时预警、分布式追踪以及代码级问题预警&解决。同时,利用机器学习、人工智能等技术一直晋升剖析预测的准确度,提供更具业务价值的智能告警能力,从而晋升用户业务在各个系统、各个阶段和各个区域的连续性,助力云原生时代服务可达。 将来,博睿数据也将继续打磨产品实力,同业界一道助力我国数字经济倒退“又快又稳”,推动寰球数据系统稳定性迈上新台阶。

May 9, 2022 · 1 min · jiezi

关于性能监控:火山引擎应用性能监控-面向中小企业启动助力行动

火山引擎 APMPlus 是火山引擎利用开发套件 MARS 下的性能监控产品。咱们通过先进的数据采集与监控技术,为企业提供全链路的利用性能监控服务,助力企业晋升异样问题排查与解决的效率。 12月30日,咱们特地推出「APMPlus 企业助力口头」,为中小企业提供利用性能监控免费资源包。当初申请,有机会取得60天收费性能监控服务,最高可享6000万条事件量。 1.搀扶资源详情 助力资源包 —— 中小企业0元申请APMPlus资源包 APMPLus新用户可取得60天收费服务助力资源蕴含 App 监控、Web 监控各4000万条事件量Server 监控探针个数不限小程序监控、网络拨测不限量业余工程师在线答疑 邀请升级包 —— 邀请好友,最高减少两千万事件量 已申请技术助力资源包的用户,可通过邀请其余企业用户申请「APMPlus企业助力口头」,取得额定事件量;每胜利邀请一位新用户申请「助力资源包」,邀请人原账户可在 App 监控/Web 监控任一监控对象的事件量中新增500万条;每位用户最多可取得2000万条事件量升级包;*失效账户以新用户申请表单中「推荐人」栏填写信息为准 更多助力权利 可获火山引擎年度大会及企业&技术峰会邀约资格有机会携手火山引擎 MARS 独特打造行业案例火山引擎 MARS 下其余产品性能享优先体验资格火山引擎 MARS 行业沙龙席位邀请*如对本次流动有疑难或倡议,欢送私信「MARS小助手」交换 2.申请流程1、注册登录火山引擎 APMPlus 控制台; 2、实现认证并创立利用,点击控制台banner 申请资源包;申请用户需为火山引擎中小企业用户,提交表单后 工作人员会在1-3个工作日内实现审核,并开明对应账户资源包。 开明胜利后,咱们会通过微信/短信等模式告知您,请留神查收。 ✨ 分享流动,降级资源包

January 11, 2022 · 1 min · jiezi

关于性能监控:移动端性能监测工具篇之UAPM

背景性能问题通常状况下,App的性能问题并不会间接导致其不能应用,却会潜在的影响用户体验。在泛滥App"内卷"的当下,一个不好的体验甚至能导致用户的散失。比方: •启动速度过慢•CPU占用率高导致的手机发热、耗电快•不明起因的闪退•…等等 预防和查看当然,作为一名开发者,在编写代码时就要做到防止一些性能问题的呈现。比方: •优化计算的复杂度从而缩小CPU占用率•编写单元测试•...等等 当然,善用工具能够高效地去监控App的性能问题,帮忙开发者及时修复产品体验上的缺点。市面上APM工具很多,因为笔者曾在我的项目中应用过U-App进行过利用信息的统计,在此就友盟U-APM来说一些应用体验。 U-APM应用体检集成参照官网平台的集成阐明,以iOS为例,这里做一个简述1.在U-APM创立利用,生成一个Appkey2.举荐应用CocoaPods来接入SDK pod 'UMCommon'3.pod 'UMDevice'4.pod ‘UMAPM’ 在 AppDelegate.m 文件中,增加如下 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [UMConfigure initWithAppkey:@"61276660870a7a610a4f67f5" channel:@""]; // Appkey在步骤1中生成 // channel字段为自定义渠道辨别,不填写则被默认为是"App store" return YES; }剖析后果1.解体剖析我仅仅是在我的项目中的首页手写了一个可被动触发的闪退Bug。剖析后果图解如下: 解体的曲线图对于开发者来说,算是一个兼顾的展现。重要的是,在页面下方的谬误列表中,能够查看某个谬误产生的次数,类型,影响的用户数。这很不便作为开发者在批改Bug时能疾速精确的判断优先级。另外,谬误都有独自的谬误明细页,大部分的Bug都能够被精准定位。 起初因为U-APM启动解体剖析的启发,我在我的项目内的启动办法中 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 即配置Appkey的前后,都别离写了闪退Bug,并临时用渠道名做了辨别。结果显示,在配置Appkey前产生的闪退,并不能被捕捉。 有人会问:那这不是必然的么?你都还没配置呢... 这也正是我想说的问题。因为在许多时候,咱们去配置一些第三方库时,因为集成办法过于简略,总是会很随便的依据官网教程去增加一行代码,并不去讲究它在我的项目代码中该当所处的最佳地位。因为这并不影响我的项目运行,这种细节也很容易被疏忽。我心愿在任何时候,开发者们都应该养成每一行代码在敲下去之前都尝试去思考的习惯。 2.卡顿剖析 卡顿的列表与明细也是和解体一样,能够查问和定位。并且可能标记(未解决、修复中、已疏忽、已修复)4种状态。 我还另外增加了卡顿告警打算,只有卡顿用户数占比超过5%,就会发邮件告诉我。它胜利的在一小时内触发告警信息并在邮件中揭示了我。 3.启动剖析我在启动时采纳了随机数去随机加快该项目标启动速度。默认首次启动/冷启动超过3秒为慢启动,热启动超过1秒为。这里以冷启动为例: 在剖析柱状图里也很好的展现了失常启动与慢启动的占比 4.内存剖析在OOM的剖析上,貌似对Android的反对更甚iOS。因为iOS的Jetsam机制,这里只剖析当程序内存超出限度时造成的一种非凡的Crash。包含异样的捕捉也不是全都能检测。 5.散布剖析平台均能在以上四个模块(解体、卡顿、慢启动、OOM异样)剖析中提供散布情况,包含设施散布、零碎散布、运营商散布、版本散布、页面散布、渠道散布、地区散布。 6.自定义配置模块 U-APM还提供了采集开关,须要在初始化前就在代码中配置好。 以上就是我体验的U-APM的全副性能。 还有一些我来不及体验的性能期待更多开发者去应用,比方“云真机”,"API上传符号表页面整体加载速度渲染"等等。 一些倡议分享在卡顿剖析与解体剖析的运营商模块中,呈现了一个剖析谬误。我应用的是电信宽带与电信卡,剖析后果却展现出我应用的是中国移动的运营商。当然对于这种问题,平台有另外的客服工单能够去提出,这里也不再赘述。(从过来应用其余友盟的产品来看,客服工单的反馈效率还是挺不错的) 另外值得一提的是,因为笔者在我的项目中曾经将开发语言齐全过渡到Swift,但在集成时,官网提醒Swift以后仅反对U-App统计,其余业务暂不反对Swift。我也是连夜创立一个OC我的项目去体验,并没有尝试在Swift我的项目中接入。而现如今,Swift已成iOS开发支流语言,心愿U-APM能在将来能全面反对Swift更加便当开发者。 当然,这不障碍它目前能够满足开发者们在OC我的项目中对性能监控的根本需要: •集成办法简略、迅速•追踪解体、卡顿的详细信息,轻松定位本源问题•剖析图解清晰明了,多状态方便管理•辨认设施类型(iPhone/iPad/iPod、操作系统版本、运营商类型),分类设施性能** 最初,我还是心愿,适当应用工具能够晋升开发效率,但也请不要过分依赖而忘了思考。

October 26, 2021 · 1 min · jiezi

关于性能监控:JConsole与JVisualVM工具

工具C:\Program Files\Java\jdk1.8.0_172\binjconsole.exejvisualvm.exetomcat配置批改tomcat的/bin/catalina.sh文件在其中“Execute The Requested Command”之前插入配置,内容如下:JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=11.12.86.102 -Dcom.sun.management.jmxremote"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=1099"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=1099"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"重启tomcat服务双击关上jconsole.exe新建连贯-近程过程输出11.12.86.102:12345,点击确定若重启tomcat,需从新连贯双击关上jvisualvm.exe文件-增加JMX连贯,输出11.12.86.102:12345,勾选不要求SSL连贯,点击确定若重启tomcat,需敞开再从新关上jvisualvm.exedocker配置批改docker-compose_ara-api.yml配置文件version: "3"services: ids-8423: image: docker.xdja.com/itsca/itsca-ids-web:2.0.5.4 restart: always ports: - 8123:8080 - 8423:8423 - 5008:5008 - 1099:1099 environment: - TZ=Asia/Shanghai volumes: - /etc/localtime:/etc/localtime - /home/logs/ids_tomcat/:/usr/local/tomcat/logs/ - /home/logs/ids/:/home/logs/ - /home/xdja/conf/ccsa/ids/:/home/xdja/conf/ccsa/ids/ - /home/xdja/conf/ccsa/ids/tomcat/conf/:/usr/local/tomcat/conf/ - /home/xdja/conf/ccsa/ids/tomcat/bin/:/usr/local/tomcat/bin/ - /usr/local/yunhsmsdk/conf/:/usr/local/yunhsmsdk/conf/批改/home/xdja/conf/ccsa/ids/tomcat/bin/catalina.sh文件在其中“Execute The Requested Command”之前插入配置,内容如下:JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=11.12.86.102 -Dcom.sun.management.jmxremote"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=1099"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=1099"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"进行原有docker容器并删除原有容器并从新创立容器docker-compose -f docker-compose_ara-api.yml up -d连贯形式见tomcat配置

May 31, 2021 · 1 min · jiezi

关于性能监控:第18问MySQL-CPU-高了怎么办

问题我的 MySQL CPU 高了,看了一下 processlist,切实有太多行了,我要不要筹备辞职? 试验MySQL CPU 飚高的起因有很多种,咱们先剖析一种最简略常见的。 还是先建个数据库: 还是依照之前试验 11 的技巧,疾速造一些数据: 重复执行最初一句 SQL: 上面来执行一条比拟坑的 SQL,让 CPU high 起来: 当初咱们忘掉之前做了什么,就来解决这个 CPU 高的问题。 先用 top -H 找到 CPU 高的线程,这里能够看到 CPU 高的线程始终是 17967 (如果 CPU 高的线程号始终在变,那可能不是单个 SQL 引起的 CPU 耗费,须要用其余办法来辅助剖析,办法咱们当前会介绍) 找到这个线程的工作: 能够看到很多有用的信息: 1. 能够看到 processlist 中对应这根线程的信息 2. 能够找到其在 processlist 中的 ID,这样咱们就能够下 kill 命令来完结 SQL 小贴士:应用 performance_schema 时,须要大家留神 MySQL 应用了多个线程编号,源自于不同视角: 1. PROCESSLIST_ID:在 processlist 中的编号,是使用者视角的编号,使用者能够间接用 kill 命令。2. THREAD_ID:是 MySQL 外部应用的线程编号,是 MySQL 外部视角的编号。3. THREAD_OS_ID:是在操作系统上,对应的线程编号,是操作系统视角的编号。大家应用时须要辨别好,不要 kill 错了 SQL。 ...

July 31, 2020 · 1 min · jiezi

用SkyWalking做分布式追踪和应用性能监控系统

【转载请注明出处】:https://segmentfault.com/a/1190000023089382 SkyWalking 是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。 特性: 多种监控手段,语言探针和service mesh多语言自动探针,Java,.NET Core和Node.JS轻量高效,不需要大数据模块化,UI、存储、集群管理多种机制可选支持告警优秀的可视化方案Skywalking 技术架构 整个系统分为三部分: agent:采集tracing(调用链数据)和metric(指标)信息并上报OAP:收集tracing和metric信息通过analysis core模块将数据放入持久化容器中(ES,H2(内存数据库),mysql等等),并进行二次统计和监控告警webapp:前后端分离,前端负责呈现,并将查询请求封装为graphQL提交给后端,后端通过ribbon做负载均衡转发给OAP集群,再将查询结果渲染展示Skywalking也提供了其他的一些特性: 配置重载:支持通过jvm参数覆写默认配置,支持动态配置管理集群管理:这个主要体现在OAP,通过集群部署分担数据上报的流量压力和二次计算的计算压力,同时集群也可以通过配置切换角色,分别面向数据采集(collector)和计算(aggregator,alarm),需要注意的是agent目前不支持多collector负载均衡,而是随机从集群中选择一个实例进行数据上报支持k8s和mesh支持数据容器的扩展,例如官方主推是ES,通过扩展接口,也可以实现插件去- - 支持其他的数据容器支持数据上报receiver的扩展,例如目前主要是支持gRPC接受agent的上报,但是也可以实现插件支持其他类型的数据上报(官方默认实现了对Zipkin,telemetry和envoy的支持)支持客户端采样和服务端采样,不过服务端采样最有意义官方制定了一个数据查询脚本规范:OAL(Observability Analysis Language),语法类似Linq,以简化数据查询扩展的工作量支持监控预警,通过OAL获取数据指标和阈值进行对比来触发告警,支持webhook扩展告警方式,支持统计周期的自定义,以及告警静默防止重复告警数据容器由于Skywalking并没有自己定制的数据容器或者使用多种数据容器增加复杂度,而是主要使用ElasticSearch(当然开源的基本上都是这样来保持简洁,例如Pinpoint也只使用了HBase),所以数据容器的特性以及自己数据结构基本上就限制了业务的上限,以ES为例: ES查询功能异常强大,在数据筛选方面碾压其他所有容器,在数据筛选潜力巨大(Skywalking默认的查询维度就比使用HBase的Pinpoint强很多)支持sharding分片和replicas数据备份,在高可用/高性能/大数据支持都非常好支持批量插入,高并发下的插入性能大大增强数据密度低,源于ES会提前构建大量的索引来优化搜索查询,这是查询功能强大和性能好的代价,但是链路跟踪往往有非常多的上下文需要记录,所以Skywalking把这些上下文二进制化然后通过Base64编码放入data_binary字段并且将字段标记为not_analyzed来避免进行预处理建立查询索引总体来说,Skywalking尽量使用ES在大数据和查询方面的优势,同时尽量减少ES数据密度低的劣势带来的影响,从目前来看,ES在调用链跟踪方面是不二的数据容器,而在数据指标方面,ES也能中规中矩的完成业务,虽然和时序数据库相比要弱一些,但在PB级以下的数据支持也不会有太大问题。 数据结构如果说数据容器决定了上限,那么数据结构则决定了实际到达的高度。Skywalking的数据结构主要为: 数据维度(ES索引为skywalking_*_inventory) service:服务instance:实例endpoint:接口network_adress:外部依赖数据内容 原始数据 调用链跟踪数据(调用链的trace信息,ES索引为skywalking_segment,Skywalking主要的数据消耗都在这里)指标(主要是jvm或者envoy的运行时指标,例如ES索引skywalking_instance_jvm_cpu)二次统计指标 指标(按维度/时间二次统计出来的例如pxx、sla等指标,例如ES索引skywalking_database_access_p75_month)数据库慢查询记录(数据库索引:skywalking_top_n_database_statement)关联关系(维度/指标之间的关联关系,ES索引为skywalking_relation)特别记录 告警信息(ES索引为skywalking_alarm_record)并发控制(ES索引为skywalking_register_lock)其中数量占比最大的就是调用链跟踪数据和各种指标,而这些数据均可以通过OAP设置过期时间,以降低历史数据的对磁盘占用和查询效率的影响。 调用链跟踪数据作为Skywalking的核心数据,调用链跟踪数据(skywalking_segment)基本上奠定了整个系统的基础,而如果要详细的了解调用链跟踪的话,就不得不提到openTracing。 openTracing基本上是目前开源调用链跟踪系统的一个事实标准,它制定了调用链跟踪的基本流程和基本的数据结构,同时也提供了各个语言的实现。如果用一张图来表现openTracing,则是如下: 其中: SpanContext:一个类似于MDC(Slfj)或者ThreadLocal的组件,负责整个调用链数据采集过程中的上下文保持和传递Trace:一次调用的完整记录 Span:一次调用中的某个节点/步骤,类似于一层堆栈信息,Trace是由多个Span组成,Span和Span之间也有父子或者并列的关系来标志这个节点/步骤在整个调用中的位置 Tag:节点/步骤中的关键信息Log:节点/步骤中的详细记录,例如异常时的异常堆栈Baggage:和SpanContext一样并不属于数据结构而是一种机制,主要用于跨Span或者跨实例的上下文传递,Baggage的数据更多是用于运行时,而不会进行持久化以一个Trace为例: 首先是外部请求调用A,然后A依次同步调用了B和C,而B被调用时会去同步调用D,C被调用的时候会依次同步调用E和F,F被调用的时候会通过异步调用G,G则会异步调用H,最终完成一次调用。 上图是通过Span之间的依赖关系来表现一个Trace,而在时间线上,则可以有如下的表达: 当然,如果是同步调用的话,父Span的时间占用是包括子Span的时间消耗的。 而落地到Skywalking中,我们以一条skywalking_segment的记录为例: { "trace_id": "52.70.15530767312125341", "endpoint_name": "Mysql/JDBI/Connection/commit", "latency": 0, "end_time": 1553076731212, "endpoint_id": 96142, "service_instance_id": 52, "version": 2, "start_time": 1553076731212, "data_binary": "CgwKCjRGnPvp5eikyxsSXhD///////////8BGMz62NSZLSDM+tjUmS0wju8FQChQAVgBYCF6DgoHZGIudHlwZRIDc3FsehcKC2RiLmluc3RhbmNlEghyaXNrZGF0YXoOCgxkYi5zdGF0ZW1lbnQYAiA0", "service_id": 2, "time_bucket": 20190320181211, "is_error": 0, "segment_id": "52.70.15530767312125340"}其中: trace_id:本次调用的唯一id,通过snowflake模式生成endpoint_name:被调用的接口latency:耗时end_time:结束时间戳endpoint_id:被调用的接口的唯一idservice_instance_id:被调用的实例的唯一idversion:本数据结构的版本号start_time:开始时间戳data_binary:里面保存了本次调用的所有Span的数据,序列化并用Base64编码,不会进行分析和用于查询service_id:服务的唯一idtime_bucket:调用所处的时段is_error:是否失败segment_id:数据本身的唯一id,类似于主键,通过snowflake模式生成这里可以看到,目前Skywalking虽然相较于Pinpoint来说查询的维度要多一些,但是也很有限,而且除了endPoint,并没有和业务有关联的字段,只能通过时间/服务/实例/接口/成功标志/耗时来进行非业务相关的查询,如果后续要增强业务相关的搜索查询的话,应该还需要增加一些用于保存动态内容(如messageId,orderId等业务关键字)的字段用于快速定位 指标指标数据相对于Tracing则要简单得多了,一般来说就是指标标志、时间戳、指标值,而Skywalking中的指标有两种:一种是采集的原始指标值,例如jvm的各种运行时指标(例如cpu消耗、内存结构、GC信息等);一种是各种二次统计指标(例如tp性能指标、SLA等,当然也有为了便于查询的更高时间维度的指标,例如基于分钟、小时、天、周、月) ...

July 4, 2020 · 1 min · jiezi

监控微信小程序中的慢HTTP请求

摘要: 请求时间太长,影响用户体验,使用 Fundebug 监控慢请求。 Fundebug 的微信小程序监控插件在 0.5.0 版本已经支持监控 HTTP 请求错误,在小程序中通过wx.request发起 HTTP 请求,如果请求失败,会被捕获并上报。时隔一年,微信小程序插件已经更新到 1.3.1, 而且提供了一个非常有用的功能,支持监控 HTTP 慢请求。对于轻量级的性能分析,可以说已经够用。 本文我们以一个天气微信小程序为例(由bodekjan开发),来演示如何监控慢请求。bmap-wx.js中的weather()函数调用百度地图小程序 api 提供的接口来获取天气预报信息。 接入监控由于使用百度的 api,我们无法确认该接口的稳定性,可能有时候会特别慢,导致天气信息显示不出来。于是,我们使用 Fundebug 来监控请求过慢的情况。接下来,我们来演示如何监控慢请求。注册账户后,记得要在创建项目是选择“微信小程序”这一项目类型。 根据指示完成接入流程: 在app.js顶部加入下面的代码(记得将 apikey 替换成你自己的): var fundebug = require("./utils/fundebug.1.3.1.min.js");fundebug.init({ apikey: "YOUR-API-KEY", monitorMethodCall: true, monitorMethodArguments: true, monitorHttpData: true, setSystemInfo: true, setUserInfo: true, setLocation: true, httpTimeout: 200});虽然init()函数只要设置apikey即可使用,但是为了最大程度发挥监控的威力,我们不妨多设置一些监控选项。微信小程序插件有很多的可配置项,由于涉及到数据,默认处于关闭状态。我们可以监控函数调用(monitorMethodCall),以及函数调用的参数(monitorMethodArguments),监控 HTTP 请求的 Body 中的数据(monitorHttpData),获取系统信息(setSystemInfo)、用户信息(setUserInfo)、地理位置(setLocation)。 监控慢请求最后,最重要的一步,配置httpTimeout来监控超过特定时长的请求,httpTimeout 类型为 Number,单位为毫秒(ms)。演示起见,我们将时间设置为 200 毫秒。 在微信开发者工具内运行代码,Fundebug 立马收到报错。小程序发往https://api.map.baidu.com/telematics/v3/weather接口的请求时长为 571ms,超过预设时间 200ms。 错误详情该请求返回代码 200,表明能够正常获取数据。点击该条错误,查看错误详情: ...

June 27, 2019 · 1 min · jiezi

点评CAT在Spring-Cloud中的实践

作者在基于Spring Cloud微服务的架构时,一直苦于寻找一个可靠的性能监控平台,后在大神的推荐下,详细研究了点评CAT,其满足对应用性能监控的需求(包含SQL性能,URL响应性能等),将踩过的坑进行分享一下。 下载cat 3.0并启动由于微服务集群并不是很庞大,且服务器资源有限,所以暂时只采用了单点部署的CAT,集群部署和使用请参考CAT的github,这里暂不做分享 配置系统的JDK,以及下载对应的tomcat,本人使用的是JDK8和tomcat8.5.x版本(JDK的配置和tomcat的下载不做详细说明)CAT下载地址http://unidal.org/nexus/servi...修改tomcat的server.xml使其支持中文的URL <Connector port="8080" protocol="HTTP/1.1" URIEncoding="utf-8" connectionTimeout="20000" redirectPort="8443" /><!-- 增加 URIEncoding="utf-8" -->创建CAT使用的文件夹,并修改其配置 mkdir /datachmod -R 777 /data/ 修改CAT配置文件,创建/data/appdatas/cat/client.xml并修改如下 <?xml version="1.0" encoding="utf-8"?><config mode="client"> <servers> <server ip="127.0.0.1" port="2280" http-port="8080"/> </servers></config>修改cat的数据库配置文件/data/appdatas/cat/datasource.xml <?xml version="1.0" encoding="utf-8"?><data-sources> <data-source id="cat"> <maximum-pool-size>3</maximum-pool-size> <connection-timeout>1s</connection-timeout> <idle-timeout>10m</idle-timeout> <statement-cache-size>1000</statement-cache-size> <properties> <driver>com.mysql.jdbc.Driver</driver> <url><![CDATA[jdbc:mysql://127.0.0.1:3306/cat]]></url> <!-- 请替换为真实数据库URL及Port --> <user>root</user> <!-- 请替换为真实数据库用户名 --> <password>root</password> <!-- 请替换为真实数据库密码 --> <connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties> </properties> </data-source></data-sources>运行CAT的SQL脚本初始化数据库 将CAT的war重命名为cat.war放到tomcat的webapps下,并启动tomcat(默认用户名密码admin:admin),即可通过服务器IP:8080/cat进行访问springboot集成cat clientmaven引入cat client <dependency> <groupId>com.dianping.cat</groupId> <artifactId>cat-client</artifactId> <version>3.0.0</version></dependency>使用SPI方式配置cat client 其中com.dianping.cat.configuration.ClientConfigProvider文件中填写完成实现类名称,实现类代码如下: public class CatClientConfigProvider implements ClientConfigProvider { @Override public ClientConfig getClientConfig() { List<Server> servers = Lists.newArrayList(); //cat 服务器地址,多个则需要使用,分割 String catServersStr = SpringUtils.getProperties("cat.servers"); if (catServersStr != null) { String[] catServers = catServersStr.split(","); for (String catServer : catServers) { servers.add(new Server(catServer)); } //domain直接去springboot的application name String domain = SpringUtils.getProperties("spring.application.name"); ClientConfig config = new ClientConfig(); config.setServers(servers); config.setDomain(domain); return config; } return null; }}app.properties文件中填写app.name=应用名称 ...

June 25, 2019 · 1 min · jiezi

微信小程序生命周期与关键性能指标

本文将介绍微信小程序整个App的生命周期、单个页面的生命周期和组件的生命周期,并研究了这三个元素生命周期的关系,这在学习和开发过程中对理解小程序运行机制有重要意义。最终,由生命周期整理出小程序的关键指标,仅供参考。 App的生命周期在app.js中有其生命周期相关的三个方法:onLaunch、onShow和onHide。 首先是onLaunch,这是整个小程序的第一个生命周期回调函数,在小程序初始化完成后调用。 接着,小程序将触发onShow事件,如果小程序从后台切回前台后也会触发该事件。 最后,是小程序切到后台的事件onHide。 Page的生命周期在每个页面注册函数Page()的参数中,有生命周期的方法:onLoad、onShow、onReady、onHide、onUnload。 页面触发的第一个生命周期回调是onLoad,在页面加载的时候触发,其参数是页面的query参数,一个页面只有一次; 接着是onShow,监听页面的显示,与onLoad不同,如果页面被隐藏后再次显示(例如:进入下一页后返回),也会触发该生命周期; 触发onShow之后,逻辑层会向渲染层发送初始化数据,渲染层完成第一次渲染之后,会通知逻辑层触发onReady生命周期,一个页面只有一次; onHide是页面隐藏但未卸载的时候触发的,如 wx.navigateTo 或底部tab切换到其他页面,小程序切入后台等。 onUnload是页面卸载时触发,如wx.redirectTo或wx.navigateBack到其他页面时。 Component的生命周期组件最重要的生命周期是created、attached、detached ,包含一个组件实例生命流程的最主要时间点。 首先,当组件实例刚被创建时, created生命周期被触发。此时,还不能调用setData 。 通常情况下,这个生命周期只应该用于给组件this添加一些自定义属性字段。 接着,在组件完全初始化完毕并且进入页面节点树后, attached生命周期被触发。此时, this.data 已被初始化为组件的当前值,绝大多数初始化工作可以在这个时机进行。 在组件离开页面节点树后, detached生命周期被触发。退出一个页面时,如果组件还在页面节点树中,则 detached 会被触发。 此外,组件生命周期还有ready和move生命周期,分别在视图层布局完成和组件实例被移动到节点树另一个位置时执行。 整体周期现在我们知道了App、Page、和Component分别的生命周期顺序,那么他们之间的生命周期顺序又是如何?通过开发一个简单的demo,观察运行结果,可以得到如下结论: 打开页面的情况首先,前一个页面隐藏,在加载下一个页面之前,需要先初始化新页面的组件。页面首次渲染之后,会触发组件的ready,最后触发的是页面的onReady,如下图: 从PageA打开pageB时的生命周期顺序 离开页面的情况离开当前页面时,首先触发当前页面的卸载onUnload,接着是组件离开节点树的detached。最后显示之前的页面,触发onShow。如下图: 从PageB返回到PageA的生命周期顺序 打开App的情况App、Page与Component生命周期运行顺序,先从App加载然后再加载Page,在加载Page之前会先初始化该页面所用的所有组件,之后才触发页面的onLoad生命周期,如下图: 打开App时的生命周期顺序 切换到后台切换到后台时,小程序和页面并没有卸载,只会触发隐藏。先触发页面的onHide,接着是App的onHide。如下图: 切换到后台时的生命周期顺序 切换到前台切换到后台时,小程序会先触发onShow,之后才是页面的onShow。如下图:切换到前台时的生命周期顺序 关键性能指标了解了小程序各个阶段的生命周期,我们可以制定出关键节点的性能指标,整理如下表: 维度指标含义App小程序打开时间firstPage.onLoad - onLaunch 打开首页显示时间firstPage.onReady - onLaunch页面首次渲染时间page.onReady - page.onLoad 可交互时间(首屏时间)首屏相关模块最后一次setData的时间点 - page.onLoad 接口请求时间请求返回时间 - 请求发送时间参考文档官方文档 Page:https://developers.weixin.qq....官方文档 App:https://developers.weixin.qq....官方文档 页面生命周期:https://developers.weixin.qq....官方文档 组件生命周期:https://developers.weixin.qq....

April 30, 2019 · 1 min · jiezi

深入理解前端性能监控

在同样的网络环境下,有两个同样能满足你的需求的网站,一个唰的一下就加载出来了,另一个白屏转圈转了半天内容才出来,如果让你选择,你会用哪一个?页面的性能问题是前端开发中一个重要环节,但一直以来我们没有比较好的手段,来检测页面的性能。直到W3C性能小组引入的新的API window.performance,目前IE9以上的浏览器都支持。它是一个浏览器中用于记录页面加载和解析过程中关键时间点的对象。放置在global环境下,通过JavaScript可以访问到它。使用性能API你可以通过以下方法来探测和兼容performance:var performance = window.performance || window.msPerformance || window.webkitPerformance;if (performance) { // 你的代码} 先来了解一下performance的结构:performance.memory是显示此刻内存占用情况,它是一个动态值,其中:usedJSHeapSize表示:JS 对象(包括V8引擎内部对象)占用的内存数totalJSHeapSize表示:可使用的内存jsHeapSizeLimit表示:内存大小限制通常,usedJSHeapSize不能大于totalJSHeapSize,如果大于,有可能出现了内存泄漏。performance.navigation显示页面的来源信息,其中:redirectCount表示:如果有重定向的话,页面通过几次重定向跳转而来,默认为0type表示页面打开的方式,0 表示 TYPE_NAVIGATENEXT 正常进入的页面(非刷新、非重定向等)1 表示 TYPE_RELOAD 通过 window.location.reload() 刷新的页面2 表示 TYPE_BACK_FORWARD 通过浏览器的前进后退按钮进入的页面(历史记录)255 表示 TYPE_UNDEFINED 非以上方式进入的页面performance.onresourcetimingbufferfull 属性是一个在resourcetimingbufferfull事件触发时会被调用的 event handler 。它的值是一个手动设置的回调函数,这个回调函数会在浏览器的资源时间性能缓冲区满时执行。performance.timeOrigin是一系列时间点的基准点,精确到万分之一毫秒。performance.timing是一系列关键时间点,它包含了网络、解析等一系列的时间数据。下面是对这些时间点进行解释timing: { // 同一个浏览器上一个页面卸载(unload)结束时的时间戳。如果没有上一个页面,这个值会和fetchStart相同。 navigationStart: 1543806782096, // 上一个页面unload事件抛出时的时间戳。如果没有上一个页面,这个值会返回0。 unloadEventStart: 1543806782523, // 和 unloadEventStart 相对应,unload事件处理完成时的时间戳。如果没有上一个页面,这个值会返回0。 unloadEventEnd: 1543806782523, // 第一个HTTP重定向开始时的时间戳。如果没有重定向,或者重定向中的一个不同源,这个值会返回0。 redirectStart: 0, // 最后一个HTTP重定向完成时(也就是说是HTTP响应的最后一个比特直接被收到的时间)的时间戳。 // 如果没有重定向,或者重定向中的一个不同源,这个值会返回0. redirectEnd: 0, // 浏览器准备好使用HTTP请求来获取(fetch)文档的时间戳。这个时间点会在检查任何应用缓存之前。 fetchStart: 1543806782096, // DNS 域名查询开始的UNIX时间戳。 //如果使用了持续连接(persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和fetchStart一致。 domainLookupStart: 1543806782096, // DNS 域名查询完成的时间. //如果使用了本地缓存(即无 DNS 查询)或持久连接,则与 fetchStart 值相等 domainLookupEnd: 1543806782096, // HTTP(TCP) 域名查询结束的时间戳。 //如果使用了持续连接(persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和 fetchStart一致。 connectStart: 1543806782099, // HTTP(TCP) 返回浏览器与服务器之间的连接建立时的时间戳。 // 如果建立的是持久连接,则返回值等同于fetchStart属性的值。连接建立指的是所有握手和认证过程全部结束。 connectEnd: 1543806782227, // HTTPS 返回浏览器与服务器开始安全链接的握手时的时间戳。如果当前网页不要求安全连接,则返回0。 secureConnectionStart: 1543806782162, // 返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的时间戳。 requestStart: 1543806782241, // 返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的时间戳。 //如果传输层在开始请求之后失败并且连接被重开,该属性将会被数制成新的请求的相对应的发起时间。 responseStart: 1543806782516, // 返回浏览器从服务器收到(或从本地缓存读取,或从本地资源读取)最后一个字节时 //(如果在此之前HTTP连接已经关闭,则返回关闭时)的时间戳。 responseEnd: 1543806782537, // 当前网页DOM结构开始解析时(即Document.readyState属性变为“loading”、相应的 readystatechange事件触发时)的时间戳。 domLoading: 1543806782573, // 当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的时间戳。 domInteractive: 1543806783203, // 当解析器发送DOMContentLoaded 事件,即所有需要被执行的脚本已经被解析时的时间戳。 domContentLoadedEventStart: 1543806783203, // 当所有需要立即执行的脚本已经被执行(不论执行顺序)时的时间戳。 domContentLoadedEventEnd: 1543806783216, // 当前文档解析完成,即Document.readyState 变为 ‘complete’且相对应的readystatechange 被触发时的时间戳 domComplete: 1543806783796, // load事件被发送时的时间戳。如果这个事件还未被发送,它的值将会是0。 loadEventStart: 1543806783796, // 当load事件结束,即加载事件完成时的时间戳。如果这个事件还未被发送,或者尚未完成,它的值将会是0. loadEventEnd: 1543806783802}这些参数非常有用,可以帮助我们获取页面的Domready时间、onload时间、白屏时间等,以及单个页面资源在从发送请求到获取到rsponse各阶段的性能参数。对我们比较有用的页面性能数据大概包括如下几个,这些参数是通过上面的performance.timing各个属性的差值组成的,它是精确到毫秒的一个值,计算方法如下:重定向耗时:redirectEnd - redirectStartDNS查询耗时 :domainLookupEnd - domainLookupStartTCP链接耗时 :connectEnd - connectStartHTTP请求耗时 :responseEnd - responseStart解析dom树耗时 : domComplete - domInteractive白屏时间 :responseStart - navigationStartDOMready时间 :domContentLoadedEventEnd - navigationStartonload时间:loadEventEnd - navigationStart,也即是onload回调函数执行的时间。如何优化?重定向优化:重定向的类型分三种,301(永久重定向),302(临时重定向),304(Not Modified)。304是用来优化缓存,非常有用,而前两种应该尽可能的避免,凡是遇到需要重定向跳转代码的代码,可以把重定向之后的地址直接写到前端的html或JS中,可以减少客户端与服务端的通信过程,节省重定向耗时。DNS优化:一般来说,在前端优化中与 DNS 有关的有两点: 一个是减少DNS的请求次数,另一个就是进行DNS预获取(Prefetching ) 。典型的一次DNS解析需要耗费 20-120 毫秒(移动端会更慢),减少DNS解析的次数是个很好的优化方式,尽量把各种资源放在一个cdn域名上。DNS Prefetching 是让具有此属性的域名不需要用户点击链接就在后台解析,而域名解析和内容载入是串行的网络操作,所以这个方式能减少用户的等待时间,提升用户体验 。新版的浏览器会对页面中和当前域名(正在浏览网页的域名)不在同一个域的域名进行预获取,并且缓存结果,这就是隐式的 DNS Prefetch。如果想对页面中没有出现的域进行预获取,那么就要使用显示的 DNS Prefetch 了。下图是DNS Prefetch的方法:<html><head> <title>腾讯网</title> <link rel=“dns-prefetch” href="//mat1.gtimg.com" /> <link rel=“dns-prefetch” href="//inews.gtimg.com" /> <link rel=“dns-prefetch” href="//wx.qlogo.cn" /> <link rel=“dns-prefetch” href="//coral.qq.com" /> <link rel=“dns-prefetch” href="//pingjs.qq.com" />TCP请求优化:TCP的优化大都在服务器端,前端能做的就是尽量减少TCP的请求数,也就是减少HTTP的请求数量。http 1.0 默认使用短连接,也是TCP的短连接,也就是客户端和服务端每进行一次http操作,就建立一次连接,任务结束就中断连接。这个过程中有3次TCP请求握手和4次TCP请求释放。减少TCP请求的方式有两种,一种是资源合并,对于页面内的图片、css和js进行合并,减少请求量。另一种使用长链接,使用http1.1,在HTTP的响应头会加上 Connection:keep-alive,当一个网页打开完成之后,连接不会马上关闭,再次访问这个服务时,会继续使用这个长连接。这样就大大减少了TCP的握手次数和释放次数。或者使用Websocket进行通信,全程只需要建立一次TCP链接。HTTP请求优化:使用内容分发网络(CDN)和减少请求。使用CDN可以减少网络的请求时延,CDN的域名不要和主站的域名一样,这样会防止访问CDN时还携带主站cookie的问题,对于网络请求,可以使用fetch发送无cookie的请求,减少http包的大小。也可以使用本地缓存策略,尽量减少对服务器数据的重复获取。渲染优化:在浏览器端的渲染过程,如大型框架,vue和react,它的模板其实都是在浏览器端进行渲染的,不是直出的html,而是要走框架中相关的框架代码才能去渲染出页面,这个渲染过程对于首屏就有较大的损耗,白屏的时间会有所增加。在必要的情况下可以在服务端进行整个html的渲染,从而将整个html直出到我们的浏览器端,而非在浏览器端进行渲染。还有一个问题就是,在默认情况下,JavaScript 执行会“阻止解析器”,当浏览器遇到一个 script 外链标记时,DOM 构建将暂停,会将控制权移交给 JavaScript 运行时,等脚本下载执行完毕,然后再继续构建 DOM。而且内联脚本始终会阻止解析器,除非编写额外代码来推迟它们的执行。我们可以把 script 外链加入到页面底部,也可以使用 defer 或 async 延迟执行。defer 和 async 的区别就是 defer 是有序的,代码的执行按在html中的先后顺序,而 async 是无序的,只要下载完毕就会立即执行。或者使用异步的编程方法,比如settimeout,也可以使用多线webworker,它们不会阻碍 DOM 的渲染。<script async type=“text/javascript” src=“app1.js”></script><script defer type=“text/javascript” src=“app2.js”></script>资源性能APIperformance.timing记录的是用于分析页面整体性能指标。如果要获取个别资源(例如JS、图片)的性能指标,就需要使用Resource Timing API。performance.getEntries()方法,包含了所有静态资源的数组列表;每一项是一个请求的相关参数有name,type,时间等等。下图是chrome显示腾讯网的相关资源列表。可以看到,与 performance.timing 对比: 没有与 DOM 相关的属性,新增了name、entryType、initiatorType和duration四个属性。它们是name表示:资源名称,也是资源的绝对路径,可以通过performance.getEntriesByName(name属性的值),来获取这个资源加载的具体属性。entryType表示:资源类型 “resource”,还有“navigation”, “mark”, 和 “measure”另外3种。initiatorType表示:请求来源 “link”,即表示<link> 标签,还有“script”即 <script>,“img”即<img>标签,“css”比如background的url方式加载资源以及“redirect”即重定向 等。duration表示:加载时间,是一个毫秒数字。受同源策略影响,跨域资源获取到的时间点,通常为0,如果需要更详细准确的时间点,可以单独请求资源通过performance.timing获得。或者资源服务器开启响应头Timing-Allow-Origin,添加指定来源站点,如下所示:Timing-Allow-Origin: https://qq.com 方法集合除了performance.getEntries之外,performance还包含一系列有用的方法。如下图performance.now()performance.now() 返回一个当前页面执行的时间的时间戳,用来精确计算程序执行时间。与 Date.now() 不同的是,它使用了一个浮点数,返回了以毫秒为单位,小数点精确到微秒级别的时间,更加精准。并且不会受系统程序执行阻塞的影响,performance.now() 的时间是以恒定速率递增的,不受系统时间的影响(系统时间可被人为或软件调整)。performance.timing.navigationStart + performance.now() 约等于 Date.now()。let t0 = window.performance.now();doSomething();let t1 = window.performance.now();console.log(“doSomething函数执行了” + (t1 - t0) + “毫秒.”) 通过这个方法,我们可以用来测试某一段代码执行了多少时间。performance.mark()mark方法用来自定义添加标记时间。使用方法如下: var nameStart = ‘markStart’; var nameEnd = ‘markEnd’; // 函数执行前做个标记 window.performance.mark(nameStart); for (var i = 0; i < n; i++) { doSomething } // 函数执行后再做个标记 window.performance.mark(nameEnd); // 然后测量这个两个标记间的时间距离,并保存起来 var name = ‘myMeasure’; window.performance.measure(name, nameStart, nameEnd); 保存后的值可以通过 performance.getEntriesByname( ‘myMeasure’ )或者 performance.getEntriesByType(‘measure’)查询。Performance.clearMeasures()从浏览器的性能输入缓冲区中移除自定义添加的 measurePerformance.getEntriesByName()返回一个 PerformanceEntry 对象的列表,基于给定的 name 和 entry typePerformance.getEntriesByType()返回一个 PerformanceEntry 对象的列表,基于给定的 entry typePerformance.measure()在浏览器的指定 start mark 和 end mark 间的性能输入缓冲区中创建一个指定名称的时间戳,见上例Performance.toJSON() 是一个 JSON 格式转化器,返回 Performance 对象的 JSON 对象资源缓冲区监控Performance.setResourceTimingBufferSize()设置当前页面可缓存的最大资源数据个数,entryType为resource的资源数据个数。超出时,会清空所有entryType为resource的资源数据。参数为整数(maxSize)。配合performance.onresourcetimingbufferfull事件可以有效监控资源缓冲区。当entryType为resource的资源数量超出设置值的时候会触发该事件。Performance.clearResourceTimings()从浏览器的性能数据缓冲区中移除所有的 entryType 是 “resource” 的 performance entries下面是mdn上关于这个属性的一个demo。这个demo的主要内容是当缓冲区内容满时,调用buffer_full函数。function buffer_full(event) { console.log(“WARNING: Resource Timing Buffer is FULL!”); performance.setResourceTimingBufferSize(200);}function init() { // Set a callback if the resource buffer becomes filled performance.onresourcetimingbufferfull = buffer_full;}<body onload=“init()">使用performance的这些属性和方法,能够准确的记录下我们想要的时间,再加上日志采集等功能的辅助,我们就能很容易的掌握自己网站的各项性能指标了。兼容性目前主流浏览器虽然都已支持performance对象,但是并不能支持它上面的全部属性和方法,有些细微的差别。本文主要依据chrome和qq浏览器测试了相关属性和方法,均可使用。我们做了什么?(划重点)现在的很多性能监控分析工具都是通过数据上报来实现的,不能及时有效的反馈页面的性能问题,只能在用户使用之后上报(问题出现之后)才能知道。所以基于新闻前端团队基于performance API做了一款实时查看性能的的工具,它并能给出详细的报表,在开发阶段把性能问题给解决掉。superProfiler【外部开源流程中】它是一款JavaScript性能监控工具库,通过脚本引用,加载展示在页面右侧,无须依赖任何库和脚本,可以实时查看当前页面的FPS、代码执行耗时、内存占用以及当前页面的网络性能,资源占用。 还能查看最近的(10次)页面性能的平均数。点击“生成报表”按钮会生成更详细的数据报表概览。小结Performance API 用来做前端性能监控非常有用,它提供了很多方便测试我们程序性能的接口。比如mark和measure。很多优秀的框架也用到了这个API进行测试。它里面就频繁用到了mark和measure来测试程序性能。所以想要开发高性能的web程序,了解Performace API还是非常重要的。最后通过superProfiler工具可以更快更便捷的查找出性能问题,针对性的击破问题,提高开发效率,提升用户体验。当然这只是前端性能优化的第一步,道阻且长。希望大家提出问题和指出疑问,一起进步。作者:TNFE 大鹏哥团队推广最后,腾讯新闻TNFE前端团队为前端开发人员整理出了小程序以及web前端技术领域的最新优质内容,每周更新✨,欢迎star,github地址:https://github.com/Tnfe/TNFE-… ...

April 8, 2019 · 2 min · jiezi

Jenkins performance插件生成性能测试报告

昨天把Jenkins部署好了,但是用了之后发现performance插件有问题,如果按下面这样设置统计所有的jtl文件,会导致文件夹过于臃肿,于是,而且生成的Performance Trend 比较混乱,不是很直观,于是思考修改一下试验了一下发现如果多次构建后生成在同一个jtl文件里,解析出的Performance Trend是正确的,但是我原本的设置中,jtl文件名是精确到分钟的,需要修改成精确到天的,这样正好一天的结果能看的很直观。 修改不是很难,总共修改3个地方即可 1.build.xml文件中的时间戳精度 原来是这样的,,jtl和html用的是同一个时间变量,咱们需要把这两个分开来修改后如下,也就是多建立一个精确到天的时间变量2.在Jenkins系统设置中建立一个精确到天的时间变量,TimeStamp插件提供了新建时间变量的功能,咱们只要把时差设置为0即可,注意,负号和0之间有空格3.修改任务中performance插件的jtl路径,使用新的时间变量设置好了,运行看一下

March 25, 2019 · 1 min · jiezi

性能监测工具的使用

数据流转理论上,我们需要对系统数据流转的每个节点做监控,收集数据,以便于分析,但受限于环境或时间问题,因此,需要进行简单分类,选择最需要的地方进行监控系统硬件资源对于承载应用的最基础设备,需要充分了解其使用情况,需要关注的内容由CPU、Memory、I/O,Network注意点:CPU关注的是%us[user使用率,应用使用率通常为用户CPU使用率],%sy[系统使用率]需要注意Linux下,空闲memory的计算方式,基于LINUX系统的内存使用原则,不要看到free的数据少了,觉得是瓶颈*eg:linux下 内存:Total 2G usred 1.5G free 200M buffer 1G cache 500M实际可用内存总量为free+buffer+cache [linux内存使用原则:尽可能的使用内存]*IO的瓶颈的确认需要特别注意,需要多方考虑,综合思考,“一切问题皆IO”Network需要注意上下行及单位监测工具:Nmon 小巧精炼的工具,安装使用均很方便,支持多个版本linux,内容丰富Glances【重点推荐】,业内号称linux系统实时监控的瑞士军刀,监控覆盖全面,界面清晰linux自带命令:Top\iostat\pidstat\sar\netstat\iftop\jstat\jps等等应用层资源监控操作系统的资源消耗可以理解为是应用层问题的外在表现阻塞:正在运行的线程没有运行结束,暂时让出CPU争用:多个线程对同一段数据进行不同的操作死锁:好的线程锁是业务的保障,不好的锁就是灾难理解线程状态图,有助于我们解决问题基于JAVA的监控工具Jvisualvm JDK自带监控工具,无需安装,需简单配置,可全方位监控代码运行情况JProfiler【商业软件】,直觉式的GUI可以让你快速找到性能瓶颈,抓出内存泄露数据库资源的监控[80%的性能问题,会出现在数据库层面]关注的点:SQL的执行效率,或者说执行计划索引的正确使用大数据量情况下分库分表其他TOP N的消耗OracleAWR报告[这个报告可以看出Oracle数据库的各问题]MysqlMONyog:内容全面,界面清爽,查看慢SQL【需安装,轻量级】

February 19, 2019 · 1 min · jiezi

不改一行代码定位线上性能问题

背景最近时运不佳,几乎天天被线上问题骚扰。前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题。大致的现象是:我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。尝试解决由于这种也不是业务问题,不能直接定位。所以尝试在测试环境复现,但遗憾的测试环境贼快。没办法只能硬着头皮上了。中途有抱着侥幸心里让运维查看了 Nginx 里 OpenAPI 的响应时间,想把锅扔给网络。结果果然打脸了;Nginx 里的日志也表明确实响应时间确实有问题。为了清晰的了解这个问题,我简单梳理了这个调用过程。整个的流程算是比较常见的分层架构:客户端请求到 Nginx。Nginx 负载了后端的 web 服务。web 服务通过 RPC 调用后端的 Service 服务。日志大法我们首先想到的是打日志,在可能会慢的方法或接口处记录处理时间来判断哪里有问题。但通过刚才的调用链来说,这个请求流程不短。加日志涉及的改动较多而且万一加漏了还有可能定位不到问题。再一个是改动代码之后还会涉及到发版上线。工具分析所以最好的方式就是不改动一行代码把这个问题分析出来。这时就需要一个 agent 工具了。我们选用了阿里以前开源的 Tprofile 来使用。只需要在启动参数中加入 -javaagent:/xx/tprofiler.jar 即可监控你想要监控的方法耗时,并且可以给你输出报告,非常方便。对代码没有任何侵入性同时性能影响也较小。工具使用下面来简单展示下如何使用这个工具。首先第一步自然是 clone 源码然后打包,可以克隆我修改过的源码。因为这个项目阿里多年没有维护了,还残留一些 bug,我在它原有的基础上修复了个影响使用的 bug,同时做了一些优化。执行以下脚本即可。git clone https://github.com/crossoverJie/TProfilermvn assembly:assembly到这里之后会在项目的 TProfiler/pkg/TProfiler/lib/tprofiler-1.0.1.jar 中生成好我们要使用的 jar 包。接下来只需要将这个 jar 包配置到启动参数中,同时再配置一个配置文件路径即可。这个配置文件我 copy 官方的解释。#log file namelogFileName = tprofiler.logmethodFileName = tmethod.logsamplerFileName = tsampler.log#basic configuration items# 开始取样时间startProfTime = 1:00:00# 结束取样时间endProfTime = 23:00:00# 取样的时间长度eachProfUseTime = 10# 每次取样的时间间隔eachProfIntervalTime = 1samplerIntervalTime = 20# 端口,主要不要冲突了port = 50000debugMode = falseneedNanoTime = false# 是否忽略 get set 方法ignoreGetSetMethod = true#file paths 日志路径logFilePath = /data/work/logs/tprofile/${logFileName}methodFilePath =/data/work/logs/tprofile/${methodFileName}samplerFilePath =/data/work/logs/tprofile/${samplerFileName}#include & excludes itemsexcludeClassLoader = org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader# 需要监控的包includePackageStartsWith = top.crossoverjie.cicada.example.action# 不需要监控的包excludePackageStartsWith = com.taobao.sketch;org.apache.velocity;com.alibaba;com.taobao.forest.domain.dataobject最终的启动参数如下:-javaagent:/TProfiler/lib/tprofiler-1.0.1.jar-Dprofile.properties=/TProfiler/profile.properties为了模拟排查接口响应慢的问题,我用 cicada 实现了一个 HTTP 接口。其中调用了两个耗时方法:这样当我启动应用时,Tprofile 就会在我配置的目录记录它所收集的方法信息。我访问接口 http://127.0.0.1:5688/cicada-example/demoAction?name=test&id=10 几次后它就会把每个方法的明细响应写入 tprofile.log。由左到右每列分别代表为:线程ID、方法栈深度、方法编号、耗时(毫秒)。但 tmethod.log 还是空的;这时我们只需要执行这个命令即可把最新的方法采样信息刷到 tmethod.log 文件中。java -cp /TProfiler/tprofiler.jar com.taobao.profile.client.TProfilerClient 127.0.0.1 50000 flushmethodflushmethod success其实就是访问了 Tprofile 暴露出的一个服务,他会读取、解析 tprofile.log 同时写入 tmethod.log.其中的端口就是配置文件中的 port。再打开 tmethod.log :其中会记录方法的信息。第一行数字为方法的编号。可以通过这个编号去 tprofile.log(明细)中查询每次的耗时情况。行末的数字则是这个方法在源码中最后一行的行号。其实大部分的性能分析都是统计某个方法的平均耗时。所以还需要执行下面的命令,通过 tmethod.log tprofile.log 来生成每个方法的平均耗时。java -cp /TProfiler/tprofiler.jar com.taobao.profile.analysis.ProfilerLogAnalysis tprofiler.log tmethod.log topmethod.log topobject.logprint result success打开 topmethod.log 就是所有方法的平均耗时。4 为请求次数。205 为平均耗时。818 则为总耗时。和实际情况是相符的。方法的明细耗时这是可能还会有其他需求;比如说我想查询某个方法所有的明细耗时怎么办呢?官方没有提供,但也是可以的,只是要麻烦一点。比如我想查看 selectDB() 的耗时明细:首先得知道这个方法的编号,在 tmethod.log 中可以看查到。2 top/crossoverjie/cicada/example/action/DemoAction:selectDB:84编号为 2.之前我们就知道 tprofile.log 记录的是明细,所以通过下面的命令即可查看。grep 2 tprofiler.log通过第三列方法编号为 2 的来查看每次执行的明细。但这样的方式显然不够友好,需要人为来过滤干扰,步骤也多;所以我也准备加上这样一个功能。只需要传入一个方法名称即可查询采集到的所有方法耗时明细。总结回到之前的问题;线上通过这个工具分析我们得到了如下结果。有些方法确实执行时快时慢,但都是和数据库相关的。由于目前数据库压力较大,准备在接下来进行冷热数据分离,以及分库分表。在第一步操作还没实施之前将部分写数据库的操作改为异步,减小响应时间。考虑接入 pinpoint 这样的 APM工具。类似于 Tprofile 的工具确实挺多的,找到适合自己的就好。在还没有使用类似于 pinpoint 这样的分布式跟踪工具之前应该会大量依赖于这个工具,所以后续说不定也会做一些定制,比如增加一些可视化界面等,可以提高排查效率。你的点赞与分享是对我最大的支持 ...

November 12, 2018 · 1 min · jiezi