My Life My Dream!

守信 求实 好学 力行
随笔 - 193, 文章 - 0, 评论 - 55, 阅读 - 34万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Fiddler

    fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据。 使用Fiddler无论对开发还是测试来说,在诊断分析问题时,都有很大的帮助。

下载地址:http://www.telerik.com/download/fiddler

工作原理和使用说明可参考:http://www.cnblogs.com/TankXiao/archive/2012/02/06/2337728.html

image

 

当然我们如果仅开发WEB系统,使用浏览器自身的开发者工具也可以看到http的请求响应时间。不再赘述。

image

 

SQL Profiler

     对于企业应用系统,绝大部分单功能的性能问题出现在数据库的SQL脚本执行上,所以当我们发现fiddler中有响应时间较长的http请求时,往往做的第一件事就是跟踪出该功能执行的SQL,找出响应时间最长的SQL脚本,直接执行该SQL,分析IO、执行计划。一般来说,逻辑IO是SQL性能的主要因素。

     如果数据库使用的是sqlserver,这个工作会比较简单,,我们可以使用sqlserver Profiler直接使用缺省设置即可(但sqlserver本身其实很复杂,即使是这简单的Profiler工具,在深入使用的时候也有很大的学问,以后有机会我会再针对sqlserver起一个专题)。

      使用Oracle数据库的话,可以借助性能视图找出性能较差的SQL。sqlserver也有大量的动态性能视图,不过sqlserver的图形界面工具做的如此优秀,以至于我们只有在整体性能下降等复杂场景下才使用它。

 

     在此我们仅以Oracle为例,列出常用的一些性能视图的SQL脚本。当然如果我们的业务系统本身提供了获取SQL脚本的功能或机制更好。

复制代码
--.查找前十条性能差的sql(磁盘读取较大,缺少索引或语句不合理)
SELECT *
  FROM (SELECT PARSING_USER_ID EXECUTIONS,
               SORTS,
               COMMAND_TYPE,
               DISK_READS,
               sql_text
          FROM v$sqlarea
         ORDER BY disk_reads DESC)
 WHERE ROWNUM < 10;

SELECT sql_text, hash_value, executions, buffer_gets, disk_reads, parse_calls
 FROM V$SQLAREA
WHERE buffer_gets > 10000000 OR disk_reads > 1000000
ORDER BY buffer_gets + 100 * disk_reads DESC;
复制代码

 

复制代码
-- 最近10分钟最消耗CPU的SQL语句: 
select sql_text 
from (
        select sql_id,count(*) as cn
        from v$active_session_history 
        where sample_time > sysdate - 10/24/60 
            and session_type <> 'BACKGROUND'
            and SESSION_STATE = 'ON CPU'
        group by sql_id
        order by cn desc
    ) ash, v$sql s
where ash.sql_id=s.sql_id;


-- 最近10分钟最消耗IO的SQL语句:
select sql_text 
from (
        select sql_id,count(*) as cn
        from v$active_session_history 
        where sample_time > sysdate - 10/24/60 
            and session_type <> 'BACKGROUND'
            and WAIT_CLASS='User I/O'
        group by sql_id
        order by cn desc
    ) ash, v$sql s
where ash.sql_id=s.sql_id;
复制代码

 

在plsql中查看SQL的执行计划时,我一般增加IO和CPU耗费两项。

image

 

在sqlplus等工具中,可以使用如下命令查看执行计划与IO

复制代码
--1
explain plan for 
        select count(1) from emp a where a.dept_no=5;
select * from table(dbms_xplan.display());

--2
set autotrace traceonly exp;
复制代码
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示