[20200223]关于latch and mutext的优化.txt
--//前一段时间一直在测试使用DBMS_SHARED_POOL.MARKHOT标识热对象以及sql语句的优化。
--//有别人问感觉我花很大的精力做一件无意义的工作,实际上我以前优化sql语句更多的放在IO上,SQL语句减少逻辑读上。
--//很少关注开发人员为什么要执行这些sql语句,更多地第三方的方式介入数据库的优化工作。
--//比如我们生产系统1小时 awr报表:
Snap Id Snap Time Sessions Cursors/Session Instances
Begin Snap: 43914 01-Nov-19 10:00:32 4283 2.2 2
End Snap: 43915 01-Nov-19 11:00:53 4522 2.2 2
Elapsed: 60.36 (mins)
DB Time: 404.88 (mins)
--//db_time = 404.88,相当于 404.88*60 = 24292.8秒
....
SQL ordered by Executions
%CPU - CPU Time as a percentage of Elapsed Time
%IO - User I/O Time as a percentage of Elapsed Time
Total Executions: 29,779,711
Captured SQL account for 29.9% of Total
Executions Rows Processed Rows per Exec Elapsed Time (s) %CPU %IO SQL Id SQL Module SQL Text
10,279,442 10,276,526 1.00 2,671.78 97.1 0 190q1sz3ywrd7 PPPQQQ.EXE begin :con := "XXXXXXACL"."QUE..."
2,469,226 2,469,184 1.00 990.07 96.1 0 g7ytdh9mxt1s0 PPPQQQ.EXE select count ( :"SYS_B_0" ) fr...
2,003,509 2,003,261 1.00 69.14 99.8 0 f8733rs2f3bng PPPQQQ.EXE SELECT sysdate FROM Dual
--//第1条语句是所谓的防水墙产品。每秒有10279442/3600 = 2855.4次。
--//第2条语句判断是否连接数据库的语句。每秒2469226/3600 = 685.89
--//第3条语句取当前日期,每秒2003509/3600 = 556.53。
Report Summary
Load Profile
Per Second Per Transaction Per Exec Per Call
DB Time(s): 6.7 0.1 0.00 0.00
DB CPU(s): 6.1 0.1 0.00 0.00
Redo size (bytes): 259,680.1 2,047.8
Logical read (blocks): 539,587.6 4,255.0
Block changes: 1,322.0 10.4
Physical read (blocks): 47,972.4 378.3
Physical write (blocks): 548.1 4.3
Read IO requests: 565.7 4.5
Write IO requests: 58.8 0.5
Read IO (MB): 374.8 3.0
Write IO (MB): 4.3 0.0
Global Cache blocks received: 12.1 0.1
Global Cache blocks served: 0.8 0.0
User calls: 8,826.6 69.6
Parses (SQL): 7,458.3 58.8
Hard parses (SQL): 16.8 0.1
SQL Work Area (MB): 158.8 1.3
Logons: 7.6 0.1
Executes (SQL): 8,222.7 64.8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Rollbacks: 2.7 0.0
Transactions: 126.8
--//以上3条语句的执行次数占了 (2855+686+557)/8223 = 0.498,几乎占了1半。
2.测试:
$ seq 100 | xargs -IQ -P 100 bash -c "echo 2^1000000 | bc > /dev/null "
$ vmstat -w 1 100 | tw.awk
[2020-02-24 10:20:51] procs -------------------memory------------------ ---swap-- -----io---- --system-- -----cpu-------
[2020-02-24 10:20:51] r b swpd free buff cache si so bi bo in cs us sy id wa st
[2020-02-24 10:20:51] 0 0 0 118995152 417284 10254324 0 0 0 0 112 130 0 0 100 0 0
[2020-02-24 10:20:52] 100 0 0 118939296 417284 10254324 0 0 0 0 2664 1075 4 1 96 0 0
[2020-02-24 10:20:53] 100 0 0 118925288 417284 10254324 0 0 0 0 24176 3785 100 0 0 0 0
[2020-02-24 10:20:54] 100 0 0 118913328 417284 10254324 0 0 0 0 24114 3737 100 0 0 0 0
[2020-02-24 10:20:55] 100 0 0 118894976 417284 10254324 0 0 0 0 24118 3718 100 0 0 0 0
[2020-02-24 10:20:56] 100 0 0 118892728 417284 10254324 0 0 0 0 24111 3729 100 0 0 0 0
[2020-02-24 10:20:57] 100 0 0 118888264 417284 10254324 0 0 0 0 24133 3764 100 0 0 0 0
[2020-02-24 10:20:58] 100 0 0 118884768 417284 10254324 0 0 0 0 24109 3737 100 0 0 0 0
[2020-02-24 10:20:59] 100 0 0 118879528 417284 10254324 0 0 0 0 24096 3714 100 0 0 0 0
[2020-02-24 10:21:00] 100 0 0 118873224 417284 10254324 0 0 0 0 24112 3727 100 0 0 0 0
[2020-02-24 10:21:01] 100 0 0 118865984 417284 10254324 0 0 0 0 24133 3774 100 0 0 0 0
[2020-02-24 10:21:02] 100 0 0 118866032 417284 10254328 0 0 0 0 24109 3711 100 0 0 0 0
[2020-02-24 10:21:03] 100 0 0 118864464 417284 10254328 0 0 0 0 24121 3677 100 0 0 0 0
[2020-02-24 10:21:04] 100 0 0 118862608 417284 10254328 0 0 0 0 24116 3699 100 0 0 0 0
[2020-02-24 10:21:05] 100 0 0 118861008 417284 10254328 0 0 0 0 24158 3795 100 0 0 0 0
[2020-02-24 10:21:06] 100 0 0 118860608 417284 10254328 0 0 0 16 24120 3767 100 0 0 0 0
[2020-02-24 10:21:07] 100 0 0 118855024 417284 10254328 0 0 0 32 24104 3764 100 0 0 0 0
[2020-02-24 10:21:08] 100 0 0 118849600 417284 10254328 0 0 0 0 24121 3743 100 0 0 0 0
[2020-02-24 10:21:09] 100 0 0 118844696 417284 10254328 0 0 0 0 24139 3727 100 0 0 0 0
[2020-02-24 10:21:10] 100 0 0 118842544 417284 10254328 0 0 0 0 24128 3749 100 0 0 0 0
[2020-02-24 10:21:11] 100 0 0 118838200 417284 10254328 0 0 0 0 24093 3732 100 0 0 0 0
[2020-02-24 10:21:12] procs -------------------memory------------------ ---swap-- -----io---- --system-- -----cpu-------
[2020-02-24 10:21:12] r b swpd free buff cache si so bi bo in cs us sy id wa st
[2020-02-24 10:21:12] 101 0 0 118830832 417284 10254328 0 0 0 24 24129 3747 100 0 0 0 0
[2020-02-24 10:21:13] 100 0 0 118826608 417284 10254328 0 0 0 0 24159 3764 100 0 0 0 0
[2020-02-24 10:21:14] 100 0 0 118822136 417284 10254328 0 0 0 0 24098 3763 100 0 0 0 0
[2020-02-24 10:21:15] 100 0 0 118821040 417284 10254328 0 0 0 0 24112 3709 100 0 0 0 0
[2020-02-24 10:21:16] 94 0 0 118825536 417284 10254328 0 0 0 0 24165 3695 100 0 0 0 0
[2020-02-24 10:21:17] 67 0 0 118864688 417284 10254328 0 0 0 0 24209 3283 100 0 0 0 0
[2020-02-24 10:21:18] 0 0 0 118967936 417284 10254328 0 0 0 0 17636 1150 82 1 18 0 0
[2020-02-24 10:21:19] 0 0 0 118969400 417284 10254328 0 0 0 0 92 38 0 0 100 0 0
--//大约26秒上下完成。
--//实际上如果仅仅执行1次大约4秒多一点。我逻辑cpu数量(打开超线程)=24,而如果你看vmstat的输出。
$ time echo 2^1000000 | bc > /dev/null
real 0m4.058s
user 0m4.048s
sys 0m0.001s
$ man vmstat
..
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.
--//b的数量一直是0,也就是全部bc计算程序都在运行,没有任何阻塞,只不过cpu调度不过来,需要的执行时间变成6倍上下。
3.继续测试oracle应用程序的情况:
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------- ---------- ----------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SYS@book> @ hide _kgl_hot_object_copies
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
---------------------- ----------------------------------- ------------- ------------- ------------ ----- ---------
_kgl_hot_object_copies Number of copies for the hot object TRUE 0 0 FALSE FALSE
--//rename job_times to job_times_20200224;
create table job_times (sid number, sessionid number,time_ela number,method varchar2(20));
--//建立脚本bb.txt:
$ cat bb.txt
SELECT owner
,name
,hash_value
,full_hash_value
,namespace
,child_latch
,property hot_flag
,executions
,invalidations
FROM v$db_object_cache
WHERE name = 'DBMS_APPLICATION_INFO' AND owner = 'SYS'
order by executions desc ;
--//建立测试脚本m3.txt
set verify off
--//host sleep $(echo &&3/50 | bc -l )
insert into job_times values ( sys_context ('userenv', 'sid') ,sys_context ('userenv', 'sessionid'),dbms_utility.get_time ,'&&2') ;
commit ;
declare
v_id number;
v_d date;
begin
for i in 1 .. &&1 loop
execute immediate 'begin dbms_application_info.set_client_info(''mutex'');end;';
end loop;
end ;
/
update job_times set time_ela = dbms_utility.get_time - time_ela where sid=sys_context ('userenv', 'sid') and sessionid=sys_context ('userenv', 'sessionid') and method='&&2';
commit;
quit
$ seq 50 | xargs -I{} -P 50 sqlplus -s -l scott/book @m3.txt 1e5 p=50 {} >/dev/null
$ vmstat -w 1 100 | ts.awk
[2020-02-24 10:32:31] procs -------------------memory------------------ ---swap-- -----io---- --system-- -----cpu-------
[2020-02-24 10:32:31] r b swpd free buff cache si so bi bo in cs us sy id wa st
[2020-02-24 10:32:31] 1 0 0 118890760 417300 10255360 0 0 0 0 0 0 0 0 100 0 0
[2020-02-24 10:32:32] 0 0 0 118888768 417300 10255360 0 0 0 0 1254 2110 0 0 100 0 0
[2020-02-24 10:32:33] 0 0 0 118889032 417300 10255360 0 0 0 0 1111 2026 0 0 100 0 0
[2020-02-24 10:32:34] 0 0 0 118889032 417300 10255360 0 0 0 0 1054 2003 0 0 100 0 0
[2020-02-24 10:32:35] 17 0 0 118534208 417300 10255360 0 0 0 0 18130 14789 22 6 72 0 0
[2020-02-24 10:32:36] 15 0 0 118530112 417300 10255388 0 0 0 12 17428 12406 53 7 40 0 0
[2020-02-24 10:32:37] 18 0 0 118530112 417300 10255388 0 0 0 0 17481 12502 54 6 40 0 0
[2020-02-24 10:32:38] 16 0 0 118528264 417300 10255388 0 0 0 0 17684 12112 54 7 39 0 0
[2020-02-24 10:32:39] 17 0 0 118528448 417300 10255388 0 0 0 0 17777 12436 54 7 39 0 0
[2020-02-24 10:32:40] 15 0 0 118528576 417300 10255388 0 0 0 0 17650 11967 54 6 39 0 0
[2020-02-24 10:32:41] 21 0 0 118528584 417300 10255388 0 0 0 32 17776 12917 55 6 38 0 0
[2020-02-24 10:32:42] 21 0 0 118529824 417300 10255388 0 0 0 0 17640 13795 54 7 39 0 0
[2020-02-24 10:32:43] 15 0 0 118529920 417300 10255388 0 0 0 0 17631 11054 54 7 39 0 0
[2020-02-24 10:32:44] 16 0 0 118529936 417300 10255388 0 0 0 0 17705 12744 54 7 39 0 0
[2020-02-24 10:32:45] 19 0 0 118530448 417300 10255388 0 0 0 0 17915 13821 55 6 39 0 0
[2020-02-24 10:32:46] 18 0 0 118530464 417300 10255388 0 0 0 0 17670 11483 54 7 39 0 0
[2020-02-24 10:32:47] 23 0 0 118530464 417300 10255388 0 0 0 12 18050 13022 55 7 38 0 0
[2020-02-24 10:32:48] 20 0 0 118530760 417300 10255388 0 0 0 0 17829 12484 55 7 38 0 0
[2020-02-24 10:32:49] 16 0 0 118530760 417300 10255388 0 0 0 0 17682 13121 55 7 38 0 0
[2020-02-24 10:32:50] 18 0 0 118530792 417300 10255388 0 0 0 0 17866 12203 55 7 38 0 0
[2020-02-24 10:32:51] 16 0 0 118530992 417300 10255388 0 0 0 0 17410 11298 54 7 39 0 0
[2020-02-24 10:32:52] procs -------------------memory------------------ ---swap-- -----io---- --system-- -----cpu-------
[2020-02-24 10:32:52] r b swpd free buff cache si so bi bo in cs us sy id wa st
[2020-02-24 10:32:52] 15 0 0 118530992 417300 10255388 0 0 0 0 17880 11685 55 7 38 0 0
[2020-02-24 10:32:53] 22 0 0 118530992 417300 10255388 0 0 0 0 17547 11065 54 7 40 0 0
[2020-02-24 10:32:54] 16 0 0 118531072 417300 10255388 0 0 0 0 17727 11844 54 7 39 0 0
[2020-02-24 10:32:55] 11 0 0 118531072 417300 10255388 0 0 0 0 17781 11598 55 7 39 0 0
[2020-02-24 10:32:56] 17 0 0 118531072 417300 10255388 0 0 0 0 17756 11906 54 7 39 0 0
[2020-02-24 10:32:57] 21 0 0 118531072 417300 10255388 0 0 0 0 17685 13743 55 6 39 0 0
[2020-02-24 10:32:58] 23 0 0 118531104 417300 10255388 0 0 0 0 17969 12060 56 6 37 0 0
[2020-02-24 10:32:59] 5 0 0 118531104 417300 10255388 0 0 0 8 17948 11292 55 7 38 0 0
[2020-02-24 10:33:00] 17 0 0 118531104 417300 10255388 0 0 0 16 17791 12828 55 7 38 0 0
[2020-02-24 10:33:01] 17 0 0 118531088 417300 10255388 0 0 0 0 17634 12162 54 7 39 0 0
[2020-02-24 10:33:02] 16 0 0 118531088 417300 10255388 0 0 0 0 18026 13306 56 7 37 0 0
[2020-02-24 10:33:03] 17 0 0 118531088 417300 10255388 0 0 0 0 17766 11976 55 7 38 0 0
[2020-02-24 10:33:04] 7 0 0 118530968 417300 10255388 0 0 0 0 17951 11757 56 7 37 0 0
[2020-02-24 10:33:05] 18 0 0 118530952 417300 10255388 0 0 0 0 17921 11570 55 7 38 0 0
[2020-02-24 10:33:06] 21 0 0 118530976 417300 10255388 0 0 0 0 17241 12085 52 6 42 0 0
[2020-02-24 10:33:07] 11 0 0 118530976 417300 10255388 0 0 0 0 17623 11839 54 6 39 0 0
[2020-02-24 10:33:08] 23 0 0 118530976 417300 10255388 0 0 0 0 17609 11634 55 6 39 0 0
[2020-02-24 10:33:09] 17 0 0 118530976 417300 10255388 0 0 0 0 17609 11607 54 7 39 0 0
[2020-02-24 10:33:10] 16 0 0 118530992 417300 10255388 0 0 0 32 17803 12065 55 7 38 0 0
[2020-02-24 10:33:11] 6 0 0 118530976 417300 10255388 0 0 0 0 17912 11454 56 7 37 0 0
[2020-02-24 10:33:12] 17 0 0 118531112 417300 10255388 0 0 0 0 17869 11916 55 7 39 0 0
[2020-02-24 10:33:13] procs -------------------memory------------------ ---swap-- -----io---- --system-- -----cpu-------
[2020-02-24 10:33:13] r b swpd free buff cache si so bi bo in cs us sy id wa st
[2020-02-24 10:33:13] 19 0 0 118531112 417300 10255388 0 0 0 0 17746 11633 54 6 39 0 0
[2020-02-24 10:33:14] 18 0 0 118531112 417300 10255388 0 0 0 0 17887 11629 56 7 37 0 0
[2020-02-24 10:33:15] 18 0 0 118531112 417300 10255388 0 0 0 0 17715 12068 55 7 39 0 0
[2020-02-24 10:33:16] 17 0 0 118537576 417300 10255388 0 0 0 12 17589 11460 54 7 39 0 0
[2020-02-24 10:33:17] 16 0 0 118675928 417300 10255392 0 0 0 0 18894 9604 55 7 38 0 0
[2020-02-24 10:33:18] 1 0 0 118857304 417300 10255392 0 0 0 0 10522 3468 33 5 62 0 0
[2020-02-24 10:33:19] 0 0 0 118859728 417300 10255392 0 0 0 0 1092 1997 0 0 100 0 0
[2020-02-24 10:33:20] 0 0 0 118860720 417300 10255392 0 0 0 0 1121 2066 0 0 100 0 0
[2020-02-24 10:33:21] 0 0 0 118861048 417300 10255392 0 0 0 0 1173 2034 0 0 100 0 0
[2020-02-24 10:33:22] 1 0 0 118861712 417300 10255392 0 0 0 0 1082 2004 0 0 100 0 0
^C
--//你看到vmstat r数量并没有达到50,虽然b一直还是0.但是明显出现阻塞导致并发数量没有达到50.
4.继续测试:
--//使用dbms_shared_pool.markhot标识热对象后:
SYS@book> exec dbms_shared_pool.markhot('SYS','DBMS_APPLICATION_INFO',1);
PL/SQL procedure successfully completed.
SYS@book> exec dbms_shared_pool.markhot('SYS','DBMS_APPLICATION_INFO',2);
PL/SQL procedure successfully completed.
$ seq 50 | xargs -I{} -P 50 sqlplus -s -l scott/book @m3.txt 1e5 mp=50 {} >/dev/null
$ vmstat -w 1 100 | ts.awk
[2020-02-24 10:37:10] procs -------------------memory------------------ ---swap-- -----io---- --system-- -----cpu-------
[2020-02-24 10:37:10] r b swpd free buff cache si so bi bo in cs us sy id wa st
[2020-02-24 10:37:10] 1 0 0 118873072 417300 10255404 0 0 0 0 0 0 0 0 100 0 0
[2020-02-24 10:37:11] 0 0 0 118870936 417300 10255404 0 0 0 0 1233 2056 0 0 100 0 0
[2020-02-24 10:37:12] 47 0 0 118521648 417300 10255404 0 0 0 8 21133 8990 30 7 63 0 0
[2020-02-24 10:37:13] 50 0 0 118518544 417300 10255404 0 0 0 0 24557 4843 86 11 3 0 0
[2020-02-24 10:37:14] 48 0 0 118518424 417300 10255404 0 0 0 0 24649 4801 87 11 2 0 0
[2020-02-24 10:37:15] 50 0 0 118518672 417300 10255404 0 0 0 0 24765 4696 87 11 2 0 0
[2020-02-24 10:37:16] 47 0 0 118519896 417300 10255404 0 0 0 0 24773 4860 87 11 2 0 0
[2020-02-24 10:37:17] 22 0 0 118520016 417300 10255404 0 0 0 0 24476 5224 86 11 3 0 0
[2020-02-24 10:37:18] 50 0 0 118520408 417300 10255404 0 0 0 16 24638 4950 87 11 2 0 0
[2020-02-24 10:37:19] 49 0 0 118521280 417300 10255404 0 0 0 0 24770 4946 88 11 2 0 0
[2020-02-24 10:37:20] 45 0 0 118521376 417300 10255404 0 0 0 0 24936 4901 88 11 1 0 0
[2020-02-24 10:37:21] 46 0 0 118521552 417300 10255404 0 0 0 0 24884 4875 88 11 1 0 0
[2020-02-24 10:37:22] 48 0 0 118521992 417300 10255404 0 0 0 0 24634 5066 86 11 3 0 0
[2020-02-24 10:37:23] 42 0 0 118538432 417300 10255404 0 0 0 4 24639 4868 86 11 3 0 0
[2020-02-24 10:37:24] 0 0 0 118847888 417300 10255404 0 0 0 0 18070 3752 66 9 26 0 0
[2020-02-24 10:37:25] 0 0 0 118849808 417300 10255404 0 0 0 0 1142 2047 0 0 100 0 0
[2020-02-24 10:37:26] 0 0 0 118849808 417300 10255404 0 0 0 0 1098 1993 0 0 100 0 0
[2020-02-24 10:37:27] 0 0 0 118851008 417300 10255404 0 0 0 0 1127 2049 0 0 100 0 0
[2020-02-24 10:37:28] 0 0 0 118851312 417300 10255404 0 0 0 0 1085 1994 0 0 100 0 0
[2020-02-24 10:37:29] 0 0 0 118851632 417300 10255404 0 0 0 0 1214 2078 0 0 100 0 0
[2020-02-24 10:37:30] 0 0 0 118852688 417300 10255404 0 0 0 16 1216 2024 0 0 100 0 0
^C
--//你可以发现r数量接近并发50的数量。这样相同的工作量12秒就完成了。
SYS@book> Select method,count(*),round(avg(TIME_ELA),0),sum(TIME_ELA) from scott.job_times group by method order by 3 ;
METHOD COUNT(*) ROUND(AVG(TIME_ELA),0) SUM(TIME_ELA)
-------------------- ---------- ---------------------- -------------
mp=50 50 1197 59852
p=50 50 4270 213485
--//我仅仅通过这个建立的例子说明优化latch和mutex一样重要。许多开发甚至dba都没有这种意识其实很可怕的。
--//也就是这样的工作并非没有意思,你通过一个简单的例子学习到许多OS与oracle的许多相关知识。