従来の知識は、それほど一般的ではない、または一般的ではない場合があります。事例として、DBAは、STREAMSプールがストリームプロセス専用に予約されていると信じている場合があります。 Data PumpやGoldenGateなどの他のOracleユーティリティがそのプールを使用するため、これは当てはまりません。もちろん、動的管理の使用を選択すると、要求があったときに必要なメモリが自動的に割り当てられますが、そのメモリはどこかから取得する必要があります。 Oracleは、バッファキャッシュから必要なものを「盗み」、すぐに置き換えられることはありません。 DataPumpを使用してこれを証明する例を見てみましょう。
'victim'は、streams_pool_sizeが0に設定されたOracle 12.1.0.2データベース(Streamsが構成されていないため、プールは使用されないことが期待されます)および自動共有メモリ管理が構成されます(sga_targetおよびsga_max_sizeパラメーターはゼロ以外の値に設定):
SQL> -- SQL> -- The streams pool is NOT just for SQL> -- Streams SQL> -- SQL> -- Data pump and GoldenGate both use SQL> -- it SQL> -- SQL> -- Not setting a size for the streams SQL> -- pool can cause problems when it is SQL> -- first used SQL> -- SQL> -- SQL> -- Looking at the database parameters SQL> -- check the sga parameters SQL> -- for sizing SQL> -- SQL> show parameter sga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean TRUE sga_max_size big integer 600M sga_target big integer 600M unified_audit_sga_queue_size integer 1048576
現在のサイズがゼロ以外のコンポーネントのV$SGA_DYNAMIC_COMPONENTSビューを確認すると、次の結果が返されます。
SQL> SQL> column component format a29 SQL> set linesize 300 numwidth 12 SQL> SQL> select component, current_size, min_size, max_size, user_specified_size user_spec_sz, 2 oper_count, last_oper_type, last_oper_mode, last_oper_time, granule_size 3 from v$sga_dynamic_components 4 where current_size > 0; COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE USER_SPEC_SZ OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE ----------------------------- ------------ ------------ ------------ ------------ ------------ ------------- --------- --------- ------------ shared pool 176160768 146800640 176160768 0 6 GROW DEFERRED 15-OCT-19 4194304 large pool 8388608 8388608 125829120 0 1 SHRINK DEFERRED 15-OCT-19 4194304 java pool 4194304 4194304 4194304 0 0 STATIC 4194304 DEFAULT buffer cache 411041792 301989888 419430400 0 8 SHRINK DEFERRED 15-OCT-19 4194304 Shared IO Pool 20971520 0 20971520 0 1 GROW IMMEDIATE 15-OCT-19 4194304 SQL>
streams_pool_sizeが0に設定されていることを確認します:
SQL> SQL> -- SQL> -- Verify the streams pool is set to SQL> -- 0 SQL> -- SQL> show parameter streams NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ streams_pool_size big integer 0 SQL>
データポンプのエクスポートが実行され、その後、動的メモリコンポーネントのサイズがチェックされます。
SQL> SQL> -- SQL> -- Run an Data Pump export task SQL> -- and see what happens to the streams SQL> -- pool size SQL> -- SQL> !expdp parfile=expdp_test.par SQL> SQL> column component format a29 SQL> set linesize 300 numwidth 12 SQL> SQL> select component, current_size, min_size, max_size, user_specified_size user_spec_sz, 2 oper_count, last_oper_type, last_oper_mode, last_oper_time, granule_size 3 from v$sga_dynamic_components 4 where current_size > 0; COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE USER_SPEC_SZ OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE ----------------------------- ------------ ------------ ------------ ------------ ------------ ------------- --------- --------- ------------ shared pool 197132288 146800640 197132288 0 11 GROW IMMEDIATE 15-OCT-19 4194304 large pool 8388608 8388608 125829120 0 1 SHRINK DEFERRED 15-OCT-19 4194304 java pool 4194304 4194304 4194304 0 0 STATIC 4194304 streams pool 8388608 0 8388608 0 2 GROW IMMEDIATE 15-OCT-19 4194304 DEFAULT buffer cache 381681664 301989888 419430400 0 15 SHRINK IMMEDIATE 15-OCT-19 4194304 Shared IO Pool 20971520 0 20971520 0 1 GROW IMMEDIATE 15-OCT-19 4194304 6 rows selected. SQL>
DEFAULTバッファキャッシュサイズが初期設定の411041792から381681664に減少したことに注意してください。これは、一部はStreamsプールの「資金調達」に役立ちます。そのアイデアをテストするには、streams_pool_sizeを8M(Oracleが動的に設定した値)に設定し、テストを可能な限り等しくするために、データベースをシャットダウンして開始します。
SQL> SQL> -- SQL> -- Set the streams_pool_size to the current SQL> -- value SQL> -- SQL> -- Shutdown and startup the database SQL> -- SQL> alter system set streams_pool_size=8M scope=spfile; System altered. SQL> SQL> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 629145600 bytes Fixed Size 2927528 bytes Variable Size 289408088 bytes Database Buffers 331350016 bytes Redo Buffers 5459968 bytes Database mounted. Database opened.
開始値をチェックする動的メモリパラメータ:
SQL> SQL> -- SQL> -- Check dynamic sizing of SGA components SQL> -- SQL> column component format a29 SQL> set linesize 300 numwidth 12 SQL> SQL> select component, current_size, min_size, max_size, user_specified_size user_spec_sz, 2 oper_count, last_oper_type, last_oper_mode, last_oper_time, granule_size 3 from v$sga_dynamic_components 4 where current_size > 0; COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE USER_SPEC_SZ OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE ----------------------------- ------------ ------------ ------------ ------------ ------------ ------------- --------- --------- ------------ shared pool 155189248 146800640 155189248 0 2 GROW IMMEDIATE 15-OCT-19 4194304 large pool 125829120 125829120 125829120 0 0 STATIC 4194304 java pool 4194304 4194304 4194304 0 0 STATIC 4194304 streams pool 8388608 8388608 8388608 8388608 0 STATIC 4194304 DEFAULT buffer cache 327155712 327155712 335544320 0 2 SHRINK IMMEDIATE 15-OCT-19 4194304 SQL> SQL> -- SQL> -- Remove the previous dump file SQL> -- SQL> !/bin/rm /u01/app/oracle/admin/orcl/dpdump/scott.*
調整したメモリプール設定を使用して、データポンプジョブを再度実行します。
SQL> SQL> -- SQL> -- Run an Data Pump export task SQL> -- and see what happens to the streams SQL> -- pool size SQL> -- SQL> !expdp parfile=expdp_test.par SQL> SQL> column component format a29 SQL> set linesize 300 numwidth 12 SQL> SQL> select component, current_size, min_size, max_size, user_specified_size user_spec_sz, 2 oper_count, last_oper_type, last_oper_mode, last_oper_time, granule_size 3 from v$sga_dynamic_components 4 where current_size > 0; COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE USER_SPEC_SZ OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE ----------------------------- ------------ ------------ ------------ ------------ ------------ ------------- --------- --------- ------------ shared pool 197132288 146800640 197132288 0 12 GROW IMMEDIATE 15-OCT-19 4194304 large pool 8388608 8388608 125829120 0 1 SHRINK DEFERRED 15-OCT-19 4194304 java pool 4194304 4194304 4194304 0 0 STATIC 4194304 streams pool 8388608 8388608 8388608 8388608 0 STATIC 4194304 DEFAULT buffer cache 381681664 264241152 381681664 0 14 GROW DEFERRED 15-OCT-19 4194304 Shared IO Pool 20971520 0 20971520 0 1 GROW IMMEDIATE 15-OCT-19 4194304 6 rows selected. SQL>
前の例のように減少するのではなく、DEFAULTバッファキャッシュが増加したことに注意してください。バッファキャッシュからメモリが「盗まれる」ことはなかったため、リソースの動的なシフトによってパフォーマンスが低下することはありませんでした。 streams_pool_sizeを0に設定する際に発生する可能性のある問題は、ストリームプールの拡張と同時にバッファキャッシュが縮小したため、ストリームプールが割り当てられた時点でのパフォーマンスの低下である可能性があります。これは、最初からユーザーの負荷がかなり重いシステムで特に顕著になる可能性があります。
前述のように、GoldenGateはストリームプールも使用し、抽出プロセスの開始時にコミットアクティビティが多いため、抽出プロセスが起動アクティビティを終了するまで続く、サービスの重大な低下を示す可能性があります。 [GoldenGateによって生成された他のプロセスは、コミットされたデータをREDOログにフラッシュするグローバルログファイルの同期などの速度低下の原因になります。]抽出プロセスが開始されたときに1つのシステムがひどく苦しみ、割り当てられたオペレーティングシステムのログインを完了できませんでした。そのサーバーで実行されているデータベースが使用できなくなったことをサードパーティの監視ソフトウェアが報告するようになります。 streams_pool_sizeをゼロ以外の値に設定すると、抽出プロセスが開始されたときの全体的なパフォーマンスの向上に大きく貢献しました。
一般的な知識は両刃の剣である可能性があります。常識が当てはまるすべての場合について、当てはまらない場合が1つ以上ある可能性があります。唯一の本当の解決策は、そのような「知恵」をテストして、その正確さを検証することです。 「知恵」が誤っていたという仮定を発見するためだけに「福音」のような「知識」をとるよりも、そのような調査でテスト、開発、または「サンドボックス」システムに影響を与える方がはるかに優れています。知ることは推測することよりも優れています。調査に少し時間を費やすと、Oracleが関与する新しいプロセスを実装するときに大きなメリットを得ることができます。
###
DavidFitzjarrellの記事を見る