QPS 数百万的系统是怎么样的?

2024年 1月 10日 28.0k 0

   

昨天早上还在去公司的路上,就看到有个微信群网友发了一份Oracle AWR报告,说有点意思。这一下就激发了我的好奇心了。我打开简单看了眼,确实也发现了几个有趣的地方:

   

实际上我们可以看到,这是一套Oracle 11.2.0.4 RAC(硬件配置为192c/512g),其中User calls是比较高的,每秒高达31508,Parses 为111408,Hard Parses是1247,Executes(SQL)是709032.9。这里能看出几个问题点,SQL执行量很高,硬解析较高(1247/11408)。从这里大概可以判断share pool设置估计也不算太合理,看了一眼果然:

实际上对于OLTP系统,我们建议share pool 设置大概为SGA的15%-20%(实际上Oracle MOS也有类似建议),当然这也要看数据库的实际情况。从这份awr报告来看,略微调大共享迟应该是可以适当降低解析的(进一步看awr会发现 sql area evicted 并不低的).接下来继续看下Top event:

     从上面的event来看,高并发带来了一些争用,这一点从event name和Wait Class可以看出来,不做过多解释了,都是一些非常常见的等待事件。说到这里,我在想,国产数据库什么时候才能有这样如此媲美Oracle一样的OWI,让性能诊断变的如此简单。

    比如对于cursor:pin S 实际调整数据库参数已经意义不大了,我看了下session_cached_cursors设置已经是500了,并不算小。实际上我们以前在某制造业客户也遇到了类似案例,通过调整SQL代码可以进一步降低解析代价,比如把SQL拆分成多个,类似select /*+SQL1 */.....;select *+SQL2 */..... 这样。

    我们来看看这几个执行频率极高的top SQL, 如果你简单计算一下,根据count(executions/900)大概就是QPS,都是select语句。

 

    随手转了下这份AWR报告,没想到群里有眼睛非常尖锐的朋友居然发现里面有TOP SQL是我司 zCloud 的监控SQL,这里来看看(这里插播一个广告,看上去这是一份证券行业性能数据,据称zCloud目前已应用国内超20家券商客户)。

   虽然物理读看上去有点高,实际上也还好了,15分钟内仅仅执行了1次,单词执行时间不到0.5s的SQL效率还算Ok了。我进一步看了下这2个SQL都是监控内的,其中一个是监控表空间使用情况的,而且都是经过SQL优化专家调优过的SQL:

    WITH fr AS
    (SELECT /*+materialize LEADING(@"SEL$4" "RB"@"SEL$4" "TS"@"SEL$4" "U"@"SEL$4" "FI"@"SEL$4") USE_NL(@"SEL$4" "U"@"SEL$4")*/ tablespace_name,
    sum(bytes) freesize
    FROM dba_free_space
    GROUP BY tablespace_name)
    SELECT /*+ordered use_hash(a b) use_hash(a t)*/ t.tablespace_name AS TABLESPACE_NAME,
    a.FILE_CNT AS file_count,
    t.contents AS contents,
    t.status,
    decode(t.status, 'ONLINE', 1, 'OFFLINE', 2, 3) status_code,
    t.extent_management AS extent_mgt,
    t.segment_space_management AS segment_mgt,
    ROUND(a.bytes / 1048576) AS total_mb,
    ROUND(maxbytes/ 1048576) AS max_mb,
    ROUND(nvl(b.freesize, 0)/1048576) free_mb,
    ROUND((maxbytes-(a.bytes-nvl(b.freesize, 0)))/1048576) max_free_mb,
    ROUND(nvl(b.freesize, 0)*100/a.bytes, 2) free_pct,
    100-ROUND(nvl(b.freesize, 0)*100/a.bytes, 2) usage_pct,
    ROUND(nvl((maxbytes-(a.bytes-nvl(b.freesize, 0))), 0)*100/a.maxbytes, 2) max_free_pct,
    100- ROUND(nvl((maxbytes-(a.bytes-nvl(b.freesize, 0))), 0)*100/a.maxbytes, 2) max_usage_pct,
    ROUND((a.bytes-nvl(b.freesize, 0))/1048576) used_mb,
    t.BLOCK_SIZE AS blockSizes,
    t.ENCRYPTED AS encryt,
    t.BIGFILE AS bigFile,
    t.LOGGING AS loggin,
    t.ALLOCATION_TYPE AS allocationTypepl ,
    decode(a.AUTOEXTENSIBLE, 'YES', 1, 'NO', 2) AUTOEXTENSIBLE_CODE
    FROM
    (SELECT tablespace_name,
    sum(bytes) bytes,
    sum(CASE WHEN maxbytes > bytes THEN maxbytes ELSE bytes END) AS maxbytes,
    count(*) FILE_CNT,
    decode(sum(decode(AUTOEXTENSIBLE, 'YES', 1, 0)), 0, 'NO', 'YES') AUTOEXTENSIBLE
    FROM dba_data_files t
    GROUP BY tablespace_name) a,
    fr b,
    dba_tablespaces t
    WHERE a.tablespace_name = t.tablespace_name
    AND a.tablespace_name = b.tablespace_name(+)
    AND t.contents NOT IN ('TEMPORARY',
    'UNDO')

    这份Oracle AWR 其实并不算非常大型的系统了,这里完再给大家看一份更为夸张的数据。

       这个用户的数据大家可以看到,实际上更为夸张,4节点RAC每秒SQL执行量之和大概是352万,IO层面来看每秒吞吐在4.5G/s 左右。当然这实际上并非最高峰时间点。

       不管怎么讲,这些数据我认为都是较大的,如果要进行国产化替换,也是一件比较有挑战的事儿。

    相关文章

    Oracle如何使用授予和撤销权限的语法和示例
    Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
    下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
    社区版oceanbase安装
    Oracle 导出CSV工具-sqluldr2
    ETL数据集成丨快速将MySQL数据迁移至Doris数据库

    发布评论