第003篇 服务器性能分析

  谈到服务器性能,可能第一个从脑中蹦出来的是:查询速度?这确实是我们最常接触的方面,但性能其实还包括例如CPU利用率、可扩展性等很多方面。通过总结发现,不管修改的是哪一方面,最终都在影响一个量:时间。因此不妨将性能定义为:完成任务所需时间的度量(性能即响应时间)。那什么是优化呢?如果认为优化是降低CPU使用率 那么此时可能你的任务需要更长的时间来完成。如果认为是提升了每次查询(select,update,delete,insert等)的量,这其实只是吞吐量的优化,此时你的CPU的压力可能已经增大了。因此我们只能假设性能优化是在一定的工作负载下尽可能的降低响应时间。最后我们将实际的讨论两种类型的性能剖析:基于执行时间的分析基于等待的分析

基于执行时间的分析:什么任务的执行时间最长

基于等待的分析:判断任务在什么地方被阻塞的时间最长

1、剖析全局性能

性能优化的前提当然是我们得知道哪出了问题,通常可以通过慢日志和pt_query_digest进行分析,对于应用程序我们则可以使用new Relic、xhprof、xdebug、Ifp(Instrumentation-for-php)来进行检测。当然对于性能分析我们不能时时进行检测,因为大量检测IO本身对应用会有影响。可以通过以下语句来控制频率:

<?php
$profile_enable = mt_rand(0, 100) > 99;

此时利用该标志可以让1%的请求为我们提供检测样本

2、剖析局部性能

在经过全局剖析后,通常能定位出具体问题点,接下来就对具体问题进行分析;在实战过程主要使用:show status; show profile; 检查慢日志条目

2.1 show profile

该工具默认为禁用状态,需要手动开启(该工具提供的功能在新版本中由Performance Schema来实现,简化了使用)

开启后 该工具会将查询请求记录至一张临时表中,

该工具详细记录了每次查询请求的执行时间,但对于一些执行较快的语句精度似乎还有欠缺,于是我们使用:

通过该结果我们可以看到第8号查询(select * from member where id=2)的所有时间消耗,经过对比,发现的主要时间花在了starting、cleaning up过程,不过这样不是很直观,因为每条语句执行后经过上述分析返回的内容不尽相同,有什么办法可以更方便的看到信息呢?没错就是INFORMATION_SCHEMA.PROFILING

set @query_id = 8;select   state,   sum(duration) total_time,  round(100 * sum(duration) / (select sum(duration) from information_schema.profiling where query_id=@query_id), 2) percent,  count(*) call_times,   sum(duration)/count(*) avg_time from information_schema.profiling where query_id[email protected]_id group by state order by total_time desc

从上述结果看,和之前的分析大致一直,之后我们就可以根据实际情况进行优化调整 当然根据优化原则,一些占比比较低的是没有必要优化的。该结果帮我们定位到了问题,但并没有告诉我们是什么原因导致的,因此还需要进一步进行分析。

2.2 show status

show status并不算一个剖析工具,它是一个计数器,该命令返回的计数器既有服务器级别的也有回话级别的,因此需要注意区分,具体的参考官方文档说明。show global status则显示的是服务器级别的计数器。show status中仅有一项表示操作时间(innodb_row_lock_time),而且也是全局的。虽然不能给出消耗了多少时间,但是我们通过观察一些有用的计数器还是可以得到一些非常有用的信息。例如:句柄计数器(handler counter)、临时文件和表计数器

其中created_tmp*表示使用到的临时表的情况 当然因为本次查询相对简单 并没有使用使用到临时表。handler_read_rnd_next表示没有使用索引的读操作。上述部分结果似乎我们通过explain也可以得到,但explain是通过估算得到的结果,而上述结果是经过实际测量得到的。而且explain无法告诉我们临时表是否是磁盘表,这和内存临时表性能的差别是很大的

2.3 慢查询日志

2.4 使用performance schema

该结果指示了系统主要的等待原因

 2.5 区别单条查询问题还是服务器问题

使用 show global status

该方法实际是以较高频率执行show global status 来捕获数据,可通过Threads_running、Threads_connected、Questions和Queries的波动来发现问题。例如:

如果这三个数据的趋势对于服务器级别的偶尔停顿的敏感性很高,一般发生此类问题时,根据原因的不同和应用连接数据库方式的不同,每秒的查询数(queries)一般会下跌,而其他两个则至少有一个会出现尖刺。

使用 show processlist

这个方式是不停的捕获 show processlist的输出来观察是否有大量线程处于不正常的状态或者其他不正常的特征。例如查询很少长时间处于"statistics"状态,该状态一般指服务器在查询优化阶段如何确定表关联的顺序(通常很快),也很少见到大量线程报告当前连接用户是"Unauthenticateduser"未经验证的用户,这只是在连接握手的中间过程中的状态,当客户端等待输入用于登陆的用户信息的时候才会出现。

如果要查看不同的列,修改grep的模式即可。当然该结果也可以通过查询information_schema.processlist来获取。其中大量线程处于"freeing items"状态是出现了大量有问题查询的明显特征和指示

使用慢日志发现问题 需要开启慢日志并在全局级别色值long_query_time为0,并且要确认所有的连接都采用了新的设置。如果因为某些原因,不能设置慢日志记录所有的查询,也可通过tcpdump和pt_query_digest工具来模拟。要注意找到吞吐量突然下降时间段的日志。查询是在完成阶段才写入到慢日志查询,所以堆积会造成大量查询处于完成阶段。

awk ‘/^# Time:/{print $3, $4, c;c=0}/^# User/{c++}‘ nagexiaopangzis-MacBook-Pro-slow.log

2.6 使用 user_statistics

在MySQL中我们通常可以对一些表的监测找到数据库最花费时间的地方,什么表或索引使用频率比较高或者那些索引创建后并未有使用:

show tables from information_schema like ‘%_statistics‘;该命令根据实际情况主要展示出一下表:statisticsclient_statisticsindex_statisticstable_statisticsthread_statisticsuser_statistics

原文地址:https://www.cnblogs.com/2019PawN/p/12271592.html

时间: 2024-10-07 18:58:41

第003篇 服务器性能分析的相关文章

性能测试分析与性能调优诊断--史上最全的服务器性能分析监控调优篇

一个系统或者网站在功能开发完成后一般最终都需要部署到服务器上运行,那么服务器的性能监控和分析就显得非常重要了,选用什么配置的服务器.如何对服务器进行调优.如何从服务器监控中发现程序的性能问题. 如何判断服务器的瓶颈在哪里等 就成为了服务器性能监控和分析时重点需要去解决的问题了. 1     服务器的性能监控和分析 1.1      Linux服务器的性能指标监控和分析 1.1.1       通过vmstat深挖服务器的性能问题 1.1.2       如何通过mpstat 分析服务器的性能指标

linux服务器性能分析与优化

#1 查看硬件产品名称dmidecode |grep 'Product Name' #2 查看主板序列号dmidecode |grep -i 'serial number' |grep CN #3 查看CPU型号grep name /proc/cpuinfo #4 查看CPU个(核)数:grep 'physical id' /proc/cpuinfo #5 查看cpu使用情况top #6 查看内存信息grep MemTotal /proc/meminfo free -mvmstat #7 查看分

linux服务器性能分析

top 1时,看各个cpu是否均衡:看每个cpu的使用率分布是否合理 看load average的负载( 1分钟.5分钟.15分钟前到现在的平均值) 看内存的使用 看进程数运行.休眠数 M看各个进程内存的占用 iostat -x 1 看cpu的iowait和idle. 关键是r/s,w/s每秒的读写次数和量 平均的数据大小和io队列长度(仅参考) 结合await_time,来看svctm每次io操作的服务时间,前者远大于后者有问题. vmstat 2 procs 中 r的数目大于cpu数,注意了

性能分析神器VisualVM

VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回收器.执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作.本文主要介绍如何使用 VisualVM 进行性能分析及调优. 目录: 准备工作 内存分析篇 内存堆Heap 永久保留区域PermGen CPU分析篇 线程分析篇 参考文献 准备工作 自从 JDK 6 Update 7 以

SQL2005性能分析一些细节功能你是否有用到?(二)

原文:SQL2005性能分析一些细节功能你是否有用到?(二) 上一篇:SQL2005性能分析一些细节功能你是否有用到? 我简单的提到了些关于SQL性能分析最基本的一些方法,下面的文章我会陆续补充.前面提到了根据SQL的执行IO和执行计划来分析,还有一个特别重要的参数,就是SET STATISTICS TIME. 第一: SET STATISTICS TIME 定义:SET STATISTICS TIME (Transact-SQL)  显示分析.编译和执行各语句所需的毫秒数. 语法:SET ST

DICOM:基于JMeter+dcm4che2测试PACS服务器性能的解决方案(前篇)

背景: 目前对于传统WEB网站性能(压力/负载)的测试工具有很多,loadrunner.iperf.siege等,操作都比较简单,这里就不介绍了.然而对于医疗领域内的服务器,通常指的是DICOM服务器,提供满足DICOM3.0标准规定的各项DIMSE服务,诸如DIMSE-C(C-STORE.C-FIND.C-MOVE.C-ECHO).DIMSE-N(N-CREATE.N-DELETE)等等.倘若使用传统的压力测试工具会有几大局限性: 常见压力测试工具,通过模拟上千万用户实施并发负载及实时性能监测

【原创】一文掌握 Linux 性能分析之 I/O 篇

本文首发于我的公众号 CloudDeveloper(ID: cloud_dev),专注于干货分享,号内有大量书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 一文掌握 Linux 性能分析之 CPU 篇 一文掌握 Linux 性能分析之内存篇 这是 Linux 性能分析系列的第三篇,前两篇分别讲了 CPU 和 内存,本篇来看 IO. IO 和 存储密切相关,存储可以概括为磁盘,内存,缓存,三者读写的性能差距非常大,磁盘读写是毫秒级的(一般 0.1-10ms),内存读

【转】一文掌握 Linux 性能分析之网络篇

比较宽泛地讲,网络方向的性能分析既包括主机测的网络配置查看.监控,又包括网络链路上的包转发时延.吞吐量.带宽等指标分析.包括但不限于以下分析工具: ping:测试网络连通性 ifconfig:接口配置 ip:网络接口统计信息 netsat:多种网络栈和接口统计信息 ifstat:接口网络流量监控工具 netcat:快速构建网络连接 tcpdump:抓包工具 sar:统计信息历史 traceroute:测试网络路由 pathchar:确定网络路径特征 dtrace:TCP/IP 栈跟踪 iperf

MySQL监控、性能分析——工具篇

MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其 事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预警.容量扩展问题上得到更好的解决方案,就要利用各种工具来对MySQL各种指标进行分 析.本文是读书笔记,下面提及的工具,读者可能都用过,或打算准备是使用.MySQL服务器的发布包没有包含那些能完成许多常见任务的工具,例如监控服务器的工具.比较服务器间数据的工具.我们把这些工具分成以下几类:界面.监