查看: 3273|回复: 15

[讨论] 关于性能优化若干问题的讨论,请大虾们积极发言

[复制链接]
论坛徽章:
15
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:312012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15灰彻蛋
日期:2011-06-09 13:34:032011新春纪念徽章
日期:2011-02-18 11:43:32设计板块每日发贴之星
日期:2010-07-04 01:01:02
发表于 2011-5-2 11:27 | 显示全部楼层 |阅读模式
一直以来,不管是数据库工作者还是企业都非常关心数据库的性能问题。那么,怎么提升数据库的性能呢?数据库优化工作一般情况从哪些方面入手呢。。。。。。请各路大虾分享一下各自的心得、见解

-------可能这个论题太笼统,聊起来会有点不着边际啊。
招聘 : 数据库管理员
认证徽章
论坛徽章:
20
祖国60周年纪念徽章
日期:2009-10-09 08:28:00数据库板块每日发贴之星
日期:2011-02-20 01:01:01ITPUB季度 技术新星
日期:2011-04-02 10:31:09ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:192013年新春福章
日期:2013-02-25 14:51:242011新春纪念徽章
日期:2011-02-18 11:43:33
发表于 2011-5-2 18:03 | 显示全部楼层
个人觉得优化的范围太广了 不仅仅是db  还有主机 网络 存储IO之类的
至于要详细说如何优化?到什么程度了,优化算是 成功的? 这个都是需要有关预期优化目标的

通常来说,大家所指的优化,仅仅是db的优化,而db的优化大多数就集中在应用,也就是sql语句的优化。

使用道具 举报

回复
论坛徽章:
4
鲜花蛋
日期:2011-07-21 16:06:54双黄蛋
日期:2011-09-02 20:36:17ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29奥运会纪念徽章:射箭
日期:2012-07-26 19:04:19
发表于 2011-5-2 19:14 | 显示全部楼层
是的,这个话题的确太广泛了,考虑的因素很多。

从我的理解上来说,大体上可以分为两类:

1、“病情”不算太严重,“发病时间”还不是很长。

2、“病情”已经出现了很久,而且长时间得不到“治疗”,“病情”已经恶化,最可怕的是,已经引起了许多“并发症”。


关于第一类:   
       这是通常所谈到的调优——问题还不太严重。出现这类问题通常有如下特征:

a、突然性:系统本身运行得很好,突然有人(开发人员或用户)抱怨慢了。
b、诱因单一:要么是某个sql运行得不好(统计信息老化、索引建立有问题、cluster_factor等),要么是某个表碎片化了(用delete替代了truncate)。
c、硬件故障:某些硬件故障不会导致数据丢失,但会导致IO速度下降。
d、......

       这一类调优,最大的特点是几乎可以“毫无顾虑”,只要抓住了问题,就可以直接下手,没有后顾之忧!
       解决起来比较容易,解决思路如下:
a、vmstat,iostat:
      这两条命令可以看看整个服务器硬件资源(几乎可以认为只包括CPU、磁盘、RAM这个“三角形”)的使用情况,确定当前的服务器瓶颈到底是“三角形”中的哪一个角——这两条命令通常不能解决性能问题,而只能为性能问题的诱因指明一个方向。
      关于vmstat和iostat,大家都比较熟悉了。只是我想说一点,我自己觉得很重要的,看iostat时,一定要看磁盘对应的%b,也就是繁忙程度。没有%b的前提,谈论IO速度是没有多大意义的。
b、top,v$session_wait。为什么把top和v$session_wait结合到一起呢?
      top可以看出有没有高消耗cpu的server进程,如果有,多半是这样的进程引起的性能问题,直接抓住相应的sql优化就可以了。
      如果top里没有高消耗cpu的server进程,cpu的使用比较均衡,就可以能从v$session_wait入手。看看系统当前到底在等待什么?知道系统在等待什么了以后,对整个系统的运行状况就有个底了。如果等待事件不太正常,抓住sql直接优化就可以了。

关于第二类:

    这类优化都是牛人们做的——问题已经比较严重了——不能直接下手。由于我也比较菜,只能说说自己的理解。
    只是举个简单的例子。
    如果CPU的使用率持续在90%以上,同时,IO也出现了瓶颈。等待事件显示的“latch free”。
    这里,出现了两个问题:
          a、因为此时系统的“并发症”比较多,如何判断引起系统的性能问题的原因是什么?
          b、老白比较著名的优化“排队效应”——“effective of enquque”( 他老人家的翻译) 。“排队效应”的核心是:先优化哪个才能把服务器硬件的瓶颈降下来,同时,其余的“并发症”不会因为先前的优化而更加恶化!
               以上边的例子来说,CPU和IO都出现了瓶颈,应用可能有了几十个阻塞——本来系统早该垮掉了,但是因为CPU和IO都出现了问题,反而“以毒攻毒”了。这时候突然把IO优化了,几十个阻塞都突然释放了,一下子冲到CPU哪儿去抢夺资源,CPU本来还好好的,一下子任务多起来了,现在能不能撑得住就值得考虑了。而且必须好好考虑,如果考虑的不好,后果不堪设想。

     以上是我个人的浅见,很浅,请各位不吝指点

[ 本帖最后由 freas 于 2011-5-2 20:54 编辑 ]

使用道具 举报

回复
论坛徽章:
24
授权会员
日期:2007-03-03 23:55:31ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15ITPUB季度 技术新星
日期:2011-11-18 16:54:31玉石琵琶
日期:2012-02-21 15:04:38ITPUB 11周年纪念徽章
日期:2012-10-09 18:06:202013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
发表于 2011-5-2 19:43 | 显示全部楼层
如果应用无法在逻辑上优化了。。。。。。

系统集成和维护DBA就干

硬件优化;
参数优化;
增加索引;

使用道具 举报

回复
认证徽章
论坛徽章:
41
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:26紫蛋头
日期:2012-11-22 10:14:302013年新春福章
日期:2013-02-25 14:51:24鲜花蛋
日期:2013-07-09 19:31:16本田
日期:2013-11-16 13:09:52马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2011-5-2 21:21 | 显示全部楼层
我总结如下:
1.检查日志,包括OS和DB的运行日志,确认不是相关的硬件和数据库出现问题造成,排除硬件故障dmesg 、/var/adm/syslog.log及相关,$ORACLE_BASE/admin/sid/bdump/alertSID.log
2,检查I/O情况,确认不是OI过于繁忙造成,iostat ,sar -d,topas,这个可能是硬件也可能是sql方面的问题
3,检查CPU,MEMORY使用情况,是否出现使用率较高,看看是否是系统和应用用户占用,如果是系统请检查虚拟内存及内核参数方面的设置是否合理,如果是用户方面的占用比较大的的话进行下一步,这个主要通过top/vmstat/topas/
4,如果是应用用户相关进程的话,可以通过ps/top/topas/等等抓住相关用户进程pid号。然后通过数据库方面的视图连接信息抓住sql。oracle可以通过v$process.pid,和v$session.spid相关字段管理,然后通过hash_value关联v$sql_text找到这个sql
5,对sql的执行计划进行分析,set autotrace on/explain plan table、10046、dbms_session等待查看执行计划,对表中的字段和索引相关信息进行分析,看看是否正常,统计分析等信息是否正常
6.如果以上均正常的话就要收集statspack/awr信息进行分析,部署好statspack程序后收集系统运行高峰期的时段的信息,从等待事件和命中率方面一步步着手进行分析
以上套路基本可以通用了,当然其他的分析思路细节就看个人的经验和相关的原理明白的情况了

使用道具 举报

回复
论坛徽章:
4
鲜花蛋
日期:2011-07-21 16:06:54双黄蛋
日期:2011-09-02 20:36:17ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29奥运会纪念徽章:射箭
日期:2012-07-26 19:04:19
发表于 2011-5-2 21:46 | 显示全部楼层
以下我把自己遇到的一个案例贴出来,让大家做个参考。抛砖引玉,希望大家、大侠、大牛等多多指导!



这样的案例是我第二次遇见了(以前也有网友向我求助,我没帮上忙,又遇上这样的情形了,还是束手无策)。

案例的特征如下:
Unix/Linux(第一次HP-UX(内存48G居然被吃得差不多了),第二次Linux(内存4G,所剩无几)下的Oracle:

        1、服务器物理内存使用殆尽,只剩10几MB。
        2、swap现象不严重(10-30MB)。
        3、CPU空闲很高(98.8% idle)。
        4、分配给Oracle的RAM大约是1/2物理内存。

通过如下的top命令,可以对以上特征有个直观的感受:

top - 12:08:11 up 50 days, 16:02,  1 user,  load average: 0.07, 0.15, 0.16
Tasks: 201 total,   1 running, 200 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.2% us,  0.1% sy,  0.0% ni, 98.8% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:  4144676k total,  4129224k used,    15452k free,    19856k buffers
Swap:  5116660k total,    19976k used,  5096684k free,  3477884k cached

  PID      USER      PR  NI  VIRT      RES     SHR    S     %CPU        %MEM     TIME+     COMMAND            
1492     oracle     15   0  1278m    1.1g    1.1g    S         1            26.7     15:52.54   oracle            
30196    oracle     15   0  1286m    1.1g    1.1g    S         1            26.8     22:30.60   oracle            
30368    oracle     15   0  1287m    1.1g    1.1g    S         1            26.8     21:48.33   oracle            
30198    oracle     15   0  1287m    1.1g    1.1g    S         1            26.8     22:19.13   oracle            
18217    oracle     16   0  1280m    1.1g    1.0g    S         0            26.6     11:38.01   oracle            
30058    oracle     15   0  1278m    827m   824m  S         0            20.5       1:32.28   oracle            
32019    oracle     15   0  1286m    1.1g    1.1g    S         0            26.8      18:07.48   oracle

本次案例的环境如下:
操作系统:Linux。
物理内存:4GB。
SWAP:5G。
SGA:1.4G。
PGA:400M。
我的思路如下(最后没解决问题):
1、看系统在等待什么:
SQL> select sid,event from v$session_wait;

       SID EVENT
---------- ----------------------------------------------------------------
        23 SQL*Net message from client
        25 SQL*Net message from client
        26 SQL*Net message from client
        27 SQL*Net message from client
        28 SQL*Net message from client
        29 SQL*Net message from client
        ...
一共70行
空闲等待事件比较多。


1、据网友描述,系统目前业务是秒级插入。因此,我确认Oracle的业务繁忙程度:
SQL> select group#,bytes/1024/1024 MB,status from v$log;

    GROUP#         MB      STATUS
---------- ---------- ----------------
         1                50       INACTIVE
         2                50       CURRENT
         3                50       INACTIVE
两个日志处于INACTIVE状态,Oracle不繁忙。

2、查看服务器上Oracle的进程数:
[root@localhost ~]# ps -ef | grep oracle| wc -l
94
Oracle的进程数在100个以内,没有异常。

3、我怀疑有共享内存段因为得不到释放,所以出现大量的内存消耗的问题:
[root@localhost ~]# ipcs -m

------ Shared Memory Segments --------
key                  shmid       owner     perms       bytes            nattch     status      
0xd5183e94    1179648    oracle       640        1243611136     68                     
0x00000000    2359297    root         600        196608              2           dest         
0x00000000    163842      gdm         600        393216              2           dest         
0x00000000    2392067    root         600         196608             2           dest         
0x00000000    2424836    root         600         196608             2           dest         
0x00000000    2457605    root         600         196608             2           dest         
0x00000000    2490374    root         600         196608             2           dest         
0x00000000    2523143    root         600         196608             2           dest         
0x00000000    2555912    oracle       600        196608             2           dest         
0x00000000    2588681    oracle       600        196608             2           dest         
0x00000000    2621450    oracle       600        196608             2           dest         
0x00000000    2654219    oracle       600        196608             2           dest         
0x00000000    2686988    oracle       600        196608             2           dest         
0x00000000    2719757    oracle       600        196608             2           dest         
0x00000000    2785295    oracle       600        196608             2           dest         
0x00000000    2818064    root         600        196608              2           dest
也没有异常的问题。

傻眼了,接下来咋办呢......

使用道具 举报

回复
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2011-5-2 22:53 | 显示全部楼层
建议楼主去看看今年的数据库大会李奎阳_更多角度看性能优化的ppt


   丌精通SQL的设计人员也成丌了好的性能优化师
   丌熟悉应用的DBA丌是好的性能优化师
   丌清楚系统架构的程序员丌可能是好的性能优化师
   丌熟悉中间件的系统管理员也难成为好的性能优化师
性能优
化师

数据库
程序代

中间件
架构设

..


性能优化本身牵扯的太多了 非但是db and dba。

[ 本帖最后由 yyp2009 于 2011-5-2 22:54 编辑 ]

使用道具 举报

回复
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2011-5-2 22:55 | 显示全部楼层
一叶障目不见泰山

使用道具 举报

回复
招聘 : 数据库管理员
认证徽章
论坛徽章:
20
祖国60周年纪念徽章
日期:2009-10-09 08:28:00数据库板块每日发贴之星
日期:2011-02-20 01:01:01ITPUB季度 技术新星
日期:2011-04-02 10:31:09ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:192013年新春福章
日期:2013-02-25 14:51:242011新春纪念徽章
日期:2011-02-18 11:43:33
发表于 2011-5-2 23:06 | 显示全部楼层

回复 #6 freas 的帖子

0xd5183e94    1179648    oracle       640        1243611136     68      

从这个看 oracle基本上只用了1.2G内存左右   物理内存为4G?

看看其他内存都被什么进行占用了 不然不好排查

free -m 结果如何?  cache好像就占用了3g多啊

使用道具 举报

回复
论坛徽章:
4
鲜花蛋
日期:2011-07-21 16:06:54双黄蛋
日期:2011-09-02 20:36:17ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29奥运会纪念徽章:射箭
日期:2012-07-26 19:04:19
发表于 2011-5-2 23:39 | 显示全部楼层
原帖由 huanhuanlove 于 2011-5-2 23:06 发表
0xd5183e94    1179648    oracle       640        1243611136     68      

从这个看 oracle基本上只用了1.2G内存左右   物理内存为4G?

看看其他内存都被什么进行占用了 不然不好排查

free -m 结果如何?  cache好像就占用了3g多啊


非常抱歉,已经过了一段时间了,无法操作。

我找不到解决的思路,无法发现突破口,所以提出来问问,而且类似的问题遇见了两次

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表