Power9问世又怎样,一条SQL就把最牛小型机搞瘫了(有彩蛋)

 

看惯了各种深入原理、细致入微的分析,今天写一个简单、轻松的话题,但愿不会耽误你的时间。好吧,标题是有点夸张,放心,这不是一个标题党就完事的文章,毕竟我还希望你能持续看我的后续文章呢。

◆  ◆  ◆  ◆  ◆  

 
 

说到史上最强的小型机,我想,应该是IBM Power880了吧:

 

 

不用想,读者诸君,虽然POWER9的芯片本月已经发布了,但Power880你肯定还没有用过,因为在国内暂时还没有上架呢。

 

今天我说的是上面这孩子的叔叔,Power780,用的是POWER7的CPU处理器,顶配192个CPU,1TB内存,再配以DMX4顶级存储(SSD+SAS)。这单机配置放眼全国企业级服务中心,相信可以秒了许多吧。

 

 

毫不夸张的说,我刚看到这配置的时候,内心是惊诧的,1TB的X86服务器遍地跑,1TB的小型机真是第一次见。更重要的,这是I家的小型机,可跟H家、O家的这些不一样,最近出来的K家就更不提了。

 

不用说,这是客户的核心业务系统的主机了,48个core共192CPU,这在Power880里也是顶配了哦。客户成功升级到Power870后。大部分时候,CPU利用率从原来的七八十降低到了二三十。但是,就是这样顶配的小型机,居然成功被一条SQL搞瘫了!

 

而且,几乎是用最简单的方式。

◆  ◆  ◆  ◆  ◆  

 
 

如果你是DBA+社群的订阅者,那么一定看过一篇文章《Oracle后台专家解决library cache锁争用的终极武器》,这篇文章重点介绍了library cache:mutex X锁的原理以及各种解决方法。当然,如果你以前没有看过,那也不用着急去看,读完本文,你仍然急于求学的话,再看不迟。

 

搞死一个小型机的方法多种多样,但今天介绍的这种,应该是最快的。当然,最重要的是,搞死了你还不用承担刑事责任。如果你是一名开发人员,你可能也在用别的方法在搞死你的服务器,那是另外一回事,咱先不多谈。

 

我随便截取系统被搞瘫过程中其中一小段,也就是十几分钟的AWR,给你看看。

 


 

 

这条语句非常简单:

 

 

在一个本身业务压力就比较大的大型生产系统中,就夹杂在这么一条语句,系统就搞瘫了,在其核心业务单个SQL执行次数也就几万次的情况下,它执行了600多万次,平均每秒接近6000次。当然,你千万别问我,能不能给一个阀值,每秒执行多少次就可以搞瘫一个系统。

 

我可以来模仿这个系统被搞瘫的过程。脚本是俄罗斯人Andrey Nikolaev 写的,原文件名是@library_cache_mutex_contention.sql,摘录几段:

 

首先生产一个单会话语句:

 

 

再生成一个多会话语句:

 

 

然后,开几个客户端,执行@many_threads.tmp,在数据库里就会出现library cache: mutex X等待事件。如果你的机器还没被搞趴下,那就再开几个窗口,运行@many_threads.tmp。

 

重要提示,千万别在生成上搞,问题会很严重的!重要提示,千万别在生成上搞,问题会很严重的!重要提示,千万别在生成上搞,问题会很严重的!

 

◆  ◆  ◆  ◆  ◆  

 
 

如果耐着性子看到这里,你应该没去做这个试验。当然,试验你可以回头慢慢做,放心,一定能搞倒机器的,无非是多开几个终端。

你的疑问可能是,这个开发商为什么要这么频繁的执行这么一个简单的SQL语句?

 

或许你之前看得最多的是 select 1 from dual?许多开发商的开发人员,喜欢用select 1 from dual去探测数据库连接是否活着。

 

在本案例里,开发人员是要从数据库里读取服务主机的时钟,然后插入到业务记录里去。

 

需求正常么?好像也没什么不正常。

 

但你知道,一万多个sessions连接到一个数据库实例频繁这行这么个简单SQL,数据库就会变得非常不正常了。

 

解决这个问题的方法相信大家有很多思路。最简单易行的方法,设置一台时钟源,所有的业务主机、客户端都与该时钟源保持同步。然后应用程序读取自己机器的时间就好了。再说了,如果只是一个业务办理时间,不同步,或者不那么准时又如何呢?

 

最好的优化,不是把所谓的优化原理钻得多么透彻,而是把不该需要的“需求”准时的剔除掉。

 

◆  ◆  ◆  ◆  ◆  

 
 

作为一个技术人员来说,总归会有点叶公好龙的心态,看到“深入解析”“极致分析”“内核探秘”之类的文章都会想去学一学,到头来,其实除了浪费时间,啥也没得到。直到看到和菜头博文的一张图,配了一句绝精妙的话:“你的脑子装的都是别人的垃圾”。我就决定不写深入原理的文章,倒垃圾给别人了。这样的文章,其实除了让作者自己爽,绝大大多数人是什么都收获不到的。

 

因为社群,结识了很多朋友,有开发的大咖约我写一篇《开发人员必备的Oracle基础知识》,我觉得是个好题目,基础的东西才是影响最大的东西。动笔已经很久了,但一直没有写完,总怕写出来太深我也写不出或太浅写了也没太大意思。

 
 

作者介绍:杨志洪

 

  • 【DBA+社群】联合发起人
  • 数据管理专家,拥有十余年电信、银行、保险等大型行业核心系统Oracle数据库运维支持经验,掌握ITIL运维体系,擅长端到端性能优化、复杂问题处理。现主要从事数据架构、高可用及容灾咨询服务。
  • Oracle ACE、OCM、 SHOUG/ZJOUG核心成员、DAMA会员/CCF会员。ITpub版主,译著《Oracle核心技术》。


时间: 2024-09-21 11:23:32

Power9问世又怎样,一条SQL就把最牛小型机搞瘫了(有彩蛋)的相关文章

一条SQL语句变得巨慢的原因及其解决方法

现象:一条SQL突然运行的特别慢. select uidTable.column_value, first_name' ' last_name, company, job_title, upper(member_level), upper(service_value) from (select * from table(select cast(multiset (select b from bbb)as Taaa) from dual)) uidTable,member where uidTab

通过一条sql语句访问不同数据库服务器中的数据库对象的方法

对象|访问|服务器|数据|数据库|语句 在我们做数据库程序开发的时候,经常会遇到这种情况:需要将一个数据库服务器中的数据导入到另一个数据库服务器的表中.通常我们会使用这种方法:先把一个数据库中的数据取出来放到某出,然后再把这些数据一条条插入到目的数据库中,这种方法效率较低,写起程序来也很繁琐,容易出错.另外一种方法是使用bcp或BULK INSERT语句,将数据导入到一个文件中,再从此文件中导出到目的数据库,这种方法虽然效率稍高,但也有很多不如意的地方,单是在导入时怎样找到另外一台机器上的数据导

php CI框架插入一条或多条sql记录示例

  本节主要为大家介绍了php CI框架如何插入一条或多条sql记录,示例代码如下,不了解的朋友不要错过 1.插入一条记录 $data = array( 'title' => 'My title' , 'name' => 'My Name' , 'date' => 'My date' ); $this->db->insert('mytable', $data); // Produces: INSERT INTO mytable (title, name, date) VALU

mysql索引合并:一条sql可以使用多个索引

前言 mysql的索引合并并不是什么新特性.早在mysql5.0版本就已经实现.之所以还写这篇博文,是因为好多人还一直保留着一条sql语句只能使用一个索引的错误观念.本文会通过一些示例来说明如何使用索引合并. 什么是索引合并 下面我们看下mysql文档中对索引合并的说明: The Index Merge method is used to retrieve rows with several range scans and to merge their results into one. The

需求-一条SQL的写法,菜鸟提问

问题描述 一条SQL的写法,菜鸟提问 式样要求从A表里取出所有项目,并且从B,C,D,E 4张表里取出和A表的nodeid相同的device这个字段. 我的想法是用t1 left join (select nodeid ,device from t2 union select nodeid ,device from t3 union select nodeid ,device from t4 union select nodeid ,device from t5) t6 on t1.nodeid

sql oracle-关于怎么快速执行10000条sql语句

问题描述 关于怎么快速执行10000条sql语句 由于我的数据库有几千万条数据,每一条查询都会花费0.5秒,但是10000条查询需要半个多小时,所以希望有快速一点的方法,求各位大神指点,下面是我的函数. /** * 这是一个横着的for循环,图的缩放级别是13,11*10方格,不同区域到不同区域的上车点数量 */ public static void CountListPointsOfOnetoOne() { ArrayList ListSql = new ArrayList(); double

sqlserver-求各位大神给一条sql语句,急急急!!!

问题描述 求各位大神给一条sql语句,急急急!!! 我用的是sqlserver数据库,我希望完成这样的功能,有个数据库Test,里面有三张表ABC,我对其中的一张A表进行的分区,另外两张表没有分区,我希望通过sql语句查询到已经分区的表,就是要返回表A,只需获得表A的名称就行了.

select-各位前辈看下这条SQL应该怎么写

问题描述 各位前辈看下这条SQL应该怎么写 以在2011-01-01之后仍未销户以及新增(开户日小于2011-01-01且销户日大于等于2011-01-01,以及开户日大于等于2011-01-01)的活期存款账户为总体. 对201单位活期存款 和21101活期储蓄存款 科目下所有本币账户级数据抽取以下信息(包括2011-01至2014-11各月月末余额),数据格式如下: 账号 客户号 科目号 开户日 2011-01月末余额 2011-02月末余额 ... 2014-11 8位数字格式日期 表1账

把这四条sql语句从sqlsever变成oracle的sql语句,求帮忙

问题描述 把这四条sql语句从sqlsever变成oracle的sql语句,求帮忙 1C 1.SELECT top 1 MENUID+1 from app_menu ORDER BY CAST(MENUID AS int) desc 2.SELECT top 1 idfileNamefilePathcreateTimemd5fileSize FROM VIS_file WHERE md5=#md5# 3. SELECT top 1 USERIDREALNAMEGENDEROTELOEMAILQQ