Cara menggunakan metode kuadrat terkecil untuk mengevaluasi sumber daya dan memonitor database Oracle

Dalam operasi sehari-hari, administrator database Oracle perlu melacak sejumlah besar metrik dalam hal throughput, memuat, pertumbuhan DBMS, host DBMS, subsistem disk, dll. Semua data ini dikumpulkan dan disimpan dengan cermat oleh sistem pemantauan. Agar informasi tersebut tidak berbobot mati, dapat digunakan untuk peramalan dalam hal masalah ukuran dan bahkan pemantauan proaktif. Dalam posting ini kami akan menunjukkan cara melakukannya.



Ambil Oracle Cloud Control. Dalam skema SYSMAN dalam tampilan MGMT_METRICS_1DAY , kami menyimpan nilai metrik β€œRuang TARGET_GUID = '6B1E3AFA92B3EA29AD73BB87432C084C' Tersedia (MB)” untuk host dengan TARGET_GUID = '6B1E3AFA92B3EA29AD73BB87432C084C' .

 SELECT TO_CHAR (CAST (ROLLUP_TIMESTAMP AS DATE), 'YYYY-MM-DD"T"HH24:MI:SS'),        ROUND (VALUE_AVERAGE, 2) AVG_FREE_SPACE_INM   FROM SYSMAN.MGMT_METRICS_1DAY  WHERE TARGET_GUID = '6B1E3AFA92B3EA29AD73BB87432C084C'        AND METRIC_GUID = HEXTORAW ('E8838C71E687BF0A9E02FFACC0C9AC80')        AND KEY_VALUE = '/u10' ORDER BY ROLLUP_TIMESTAMP; 

Grafik di bawah ini menunjukkan bahwa selama tiga bulan, dari 14 Agustus 2018 hingga 15 November 2018, ruang kosong di sistem file / u01 menurun 1,5TB - dari 4,1 TB menjadi 2,6 TB



Untuk menentukan waktu yang tersisa untuk 2,6 TB sudah cukup bagi kami, kami beralih ke fungsi regresi linier.

Oracle menggunakan fungsi REGR_SLOPE(x,y) untuk menghitung kemiringan garis regresi. Fungsi kemiringan garis regresi REGR_SLOPE ditentukan oleh rasio kovarians dari himpunan x dan y terhadap varians himpunan y:

 REGR_SLOPE(x,y) = COVAR_POP(x,y) / VAR_POP(y) 

Untuk menghitung penangkapan sumbu Y, gunakan fungsi REGR_INTERCEPT(x,y) . Fungsi intersepsi Y-axis REGR_INTERCEPT ditentukan oleh perbedaan antara nilai rata-rata himpunan x dan produk dari kemiringan garis regresi dan nilai rata-rata himpunan y:

 REGR_INTERCEPT(x,y) = AVG(x) – REGR_SLOPE(x, y) * AVG(y) 

Untuk menghitung R-square atau koefisien determinasi, fungsi REGR_R2 (x, y) digunakan, yang tidak didefinisikan pada varians nol y, dan sama dengan kesatuan pada dispersi nol x dan varians nol bukan y. Dan dalam kasus varian positif x dan varian non-nol dari y sama dengan kuadrat korelasi x dan y:

 NULL if VAR_POP(y)  = 0 1 if VAR_POP(x)  = 0 and VAR_POP(y) != 0 POWER(CORR(expr1,expr),2) if VAR_POP(x)  > 0 and VAR_POP(y)  != 0 

Kami akan menggambarkan koefisien determinasi sebagai kuantitas yang mencirikan persentase variasi yang dijelaskan oleh model. Jika koefisien determinasi adalah 1, maka model kami menjelaskan 100% variasi dan perkiraan kami akan seakurat mungkin.

Kami mengusulkan untuk mengambil selisih x saat metrik diterima dan waktu saat ini - ROLLUP_TIMESTAMP-SYSDATE. Seperti yang kita ambil nilai rata-rata ruang disk yang tersisa bebas / u01 di MB - "Filesystem Space Available (MB)". Dalam hal ini, menggunakan fungsi REGR_INTERCEPT (ROLLUP_TIMESTAMP-SYSDATE, VALUE_AVERAGE) sebagai fungsi grup, kita dapat memperkirakan berapa hari ruang disk / u01 akan habis.

Dalam bentuk diperluas, nilai fungsi kemiringan garis regresi, intersepsi sumbu dan koefisien determinasi diperoleh dengan kueri

 SELECT   COVAR_POP (ROLLUP_TIMESTAMP - SYSDATE, NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) / VAR_POP (NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) REGR_SLOPE,        AVG (ROLLUP_TIMESTAMP)- (COVAR_POP (SYSDATE - ROLLUP_TIMESTAMP, NULLIF (ROUND (VALUE_AVERAGE, 2), 0))/VAR_POP(NULLIF(ROUND(VALUE_AVERAGE, 2), 0)))*AVG (NULLIF (ROUND(VALUE_AVERAGE, 2), 0))           REGR_INTERCEPT,        AVG (SYSDATE - ROLLUP_TIMESTAMP)-(COVAR_POP(SYSDATE - ROLLUP_TIMESTAMP,NULLIF(ROUND(VALUE_AVERAGE,2),0))/VAR_POP(NULLIF(ROUND(VALUE_AVERAGE,2),0)))*AVG(NULLIF(ROUND(VALUE_AVERAGE,2),0)))      REGR_INTERCEPT_ABS,        CASE           WHEN VAR_POP (NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) = 0           THEN              NULL           WHEN     VAR_POP (SYSDATE - ROLLUP_TIMESTAMP) = 0                AND VAR_POP (NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) != 0           THEN              1           WHEN     VAR_POP (SYSDATE - ROLLUP_TIMESTAMP) > 0                AND VAR_POP (NULLIF (ROUND (VALUE_AVERAGE, 2), 0)) != 0           THEN              POWER (CORR (SYSDATE - ROLLUP_TIMESTAMP, NULLIF (ROUND (VALUE_AVERAGE, 2), 0)),2)        END           REGR_R2   FROM MGMT_METRICS_1DAY  WHERE TARGET_GUID = '6B1E3AFA92B3EA29AD73BB87432C084C'        AND METRIC_GUID = HEXTORAW ('E8838C71E687BF0A9E02FFACC0C9AC80')        AND KEY_VALUE = '/u10' ORDER BY ROLLUP_TIMESTAMP; 

Atau sudah menggunakan fungsi REGR_SLOPE , REGR_INTERCEPT dan REGR_R2 :

 SELECT REGR_SLOPE(SYSDATE-ROLLUP_TIMESTAMP, NULLIF(ROUND(VALUE_AVERAGE,2),0)) RSLP,      REGR_INTERCEPT(SYSDATE-ROLLUP_TIMESTAMP, NULLIF(ROUND(VALUE_AVERAGE,2),0)) RINSP,       REGR_R2(SYSDATE-ROLLUP_TIMESTAMP, NULLIF(ROUND(VALUE_AVERAGE,2),0)) RSQR      FROM MGMT_METRICS_1DAY      WHERE TARGET_GUID='6B1E3AFA92B3EA29AD73BB87432C084C'      AND METRIC_GUID=HEXTORAW('E8838C71E687BF0A9E02FFACC0C9AC80') AND KEY_VALUE='/u10'      ORDER BY ROLLUP_TIMESTAMP; 

 REGR_SLOPE = -0.00005 REGR_INTERCEPT = 149.46 REGR_R2 = 0.97 

Dalam kasus kami, koefisien determinasi mendekati 1, dan kami melihat bahwa setelah sekitar 149 hari tempat pada sistem file / u10 akan berakhir.

Kita dapat menggunakan metode ini untuk memperkirakan waktu di mana kita memiliki ruang disk yang cukup untuk host dari database produktif. Dalam kasus kami, host dari database produktif dimasukkan dalam grup dengan METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80' .

Kami membuat User Definded Type T_TYPE dengan bidang yang kami butuhkan untuk output: nama host, nama sistem file, kemiringan garis regresi, jumlah hari setelah ruang ruang pada sistem file berakhir dan koefisien determinasi.

 CREATE OR REPLACE TYPE T_TYPE AS OBJECT(TARGET_NAME VARCHAR2(256), KEY_VALUE VARCHAR2(256), RSLP NUMBER,RINSP NUMBER,RSQR NUMBER); 

Buat Tabel Bersarang Jenis R_TYPE berdasarkan T_TYPE:

 CREATE OR REPLACE TYPE R_TYPE AS TABLE OF T_TYPE; 

Kami membuat paket yang menyertakan fungsi GET_VALUES untuk mengekstraksi data dari MGMT_METRICS_1DAY dan prosedur untuk mengirim data yang diterima melalui surat SEND_VALUES .

 CREATE OR REPLACE PACKAGE EST_FS_EXHAUST IS 

Untuk fungsi GET_VALUES parameter input akan menjadi variabel V_GN dengan nama grup host dan nilai koefisien determinasi V_RSQ .

 FUNCTION GET_VALUES(V_GN VARCHAR2, V_RSQ NUMBER) RETURN R_TYPE; 

Untuk prosedur SEND_VALUES parameter input akan menjadi variabel V_GN dan V_RSQ , mirip dengan variabel fungsi GET_VALUES , ditambah email yang akan kami kirimi mini-report kami.

 PROCEDURE SEND_VALUES(V_GN VARCHAR2, V_RSQ NUMBER, V_MAIL VARCHAR2); END EST_FS_EXHAUST; 

Dalam tubuh paket, kami mendefinisikan fungsi GET_VALUES dan prosedur SEND_VALUES

 CREATE OR REPLACE PACKAGE BODY EST_FS_EXHAUST IS FUNCTION GET_VALUES(V_GN VARCHAR2, V_RSQ NUMBER) RETURN R_TYPE AS  V_REC R_TYPE; BEGIN SELECT T_TYPE( M.TARGET_NAME, D.KEY_VALUE, ROUND(REGR_SLOPE(D.ROLLUP_TIMESTAMP-SYSDATE, NULLIF(ROUND(D.VALUE_AVERAGE,2),0)),0), ROUND((ABS(REGR_INTERCEPT(D.ROLLUP_TIMESTAMP-SYSDATE, NULLIF(ROUND(D.VALUE_AVERAGE,2),0)))),0), ROUND(REGR_R2(D.ROLLUP_TIMESTAMP-SYSDATE, NULLIF(ROUND(D.VALUE_AVERAGE,2),0)),0)) BULK COLLECT INTO V_REC FROM MGMT_METRICS_1DAY D, MGMT_TARGETS M, MGMT_TARGET_MEMBERSHIPS G WHERE M.TARGET_GUID=G.MEMBER_TARGET_GUID AND M.TARGET_GUID=D.TARGET_GUID AND G.COMPOSITE_TARGET_NAME=V_GN AND METRIC_GUID=HEXTORAW('E8838C71E687BF0A9E02FFACC0C9AC80') GROUP BY M.TARGET_NAME, D.KEY_VALUE HAVING REGR_R2(D.ROLLUP_TIMESTAMP-SYSDATE, NULLIF(ROUND(D.VALUE_AVERAGE,2),0)) > V_RSQ      ; RETURN V_REC; END GET_VALUES; PROCEDURE SEND_VALUES(V_GN VARCHAR2, V_RSQ NUMBER, V_MAIL VARCHAR2) IS V_REC R_TYPE; MSG VARCHAR2(2048):=''; BEGIN V_REC:= GET_VALUES(V_GN,V_RSQ); FOR I IN V_REC.FIRST..V_REC.LAST LOOP MSG:=CHR(10)||MSG||' Host '||V_REC(I).TARGET_NAME||' filesystem '||V_REC(I).KEY_VALUE||' will be exhausted in '||V_REC(I).RINSP||' days'|| CHR(9)||CHR(10); END LOOP; EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''mail_server'''; UTL_MAIL.SEND(SENDER => 'monitoring@yourmail.com',       RECIPIENTS => V_MAIL,          SUBJECT => 'Test Mail',          MESSAGE => MSG,        MIME_TYPE => 'text; charset=us-ascii'); END; END EST_FS_EXHAUST; / 

Misalkan kita ingin mendapatkan waktu setelah itu tempat di sistem file 'host_hosts' grup produktif berakhir dengan koefisien determinasi lebih besar dari 0,5:

 begin EST_FS_EXHAUST.SEND_VALUES('prod_hosts',0.5,'operator@yourdomain.com'); end; / PL/SQL procedure successfully completed. 

Akibatnya, sebuah pesan tiba di surat:

Host filesystem1 / u51 akan habis dalam 342 hari
Sistem file host2 host / u40 akan habis dalam 236 hari
Host filesystem3 / u20 / redo01 akan habis dalam 1100310 hari
Sistem file host host4 / u10 akan habis dalam 150 hari
Host filesystem4 host / u01 / integrasi akan habis dalam 75080 hari
Host filesystem4 host / u01 / app akan habis dalam 135 hari
Host filesystem5 host / u30 / redo01 akan habis dalam 62252596 hari
Host filesystem6 / u01 akan habis dalam 260 hari
Sistem file host host7 / u99 akan habis dalam 1038 hari

Perhatikan sistem file / u20 / redo01 dan / u30 / redo01 - ini adalah REDO LOGS dan tempatnya tidak sia-sia. Model kami memperkirakan bahwa tempat di / u20 / redo01 pada host3 akan berakhir dalam 2990 tahun, dan di / u30 / redo01 pada host5 dalam 169164 tahun. Dalam kedua kasus, kemiringan garis regresi kurang dari -1.

Penggunaan metode ini dapat diperluas - misalnya, untuk memperkirakan waktu sebelum kehabisan ruang di FAST RECOVERY AREA, dalam ruang tabel database dan area lainnya.

Source: https://habr.com/ru/post/id431112/


All Articles