Verwendung der Methode der kleinsten Quadrate zum Bewerten von Ressourcen und Überwachen von Oracle-Datenbanken

Im täglichen Betrieb müssen Oracle-Datenbankadministratoren eine erhebliche Anzahl von Metriken in Bezug auf Durchsatz, Auslastung, Wachstum des DBMS, DBMS-Hosts, Festplattensubsysteme usw. verfolgen. Alle diese Daten werden sorgfältig von Überwachungssystemen gesammelt und gespeichert. Damit die Informationen kein Eigengewicht haben, können sie für Prognosen in Bezug auf Größenprobleme und sogar für eine proaktive Überwachung verwendet werden. In diesem Beitrag werden wir zeigen, wie es geht.



Nehmen Sie Oracle Cloud Control. Im SYSMAN-Schema in der MGMT_METRICS_1DAY speichern wir den Wert der Metrik "Dateisystemspeicher verfügbar (MB)" für einen Host mit 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; 

Die folgende Grafik zeigt, dass der freie Speicherplatz im Dateisystem / u01 für drei Monate vom 14. August 2018 bis zum 15. November 2018 um 1,5 TB von 4,1 TB auf 2,6 TB abnahm



Um die Zeit zu bestimmen, für die die verbleibenden 2,6 TB für uns ausreichen, wenden wir uns den linearen Regressionsfunktionen zu.

Oracle verwendet die Funktion REGR_SLOPE(x,y) , um die Steigung der Regressionslinie zu berechnen. Die Steigungsfunktion der Regressionsgeraden REGR_SLOPE wird durch das Verhältnis der Kovarianz der Mengen x und y zur Varianz der Menge y bestimmt:

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

Verwenden Sie die Funktion REGR_INTERCEPT(x,y) um die Erfassung der Y-Achse zu berechnen. Die Y-Achsen- REGR_INTERCEPT wird durch die Differenz zwischen dem Durchschnittswert der Menge x und dem Produkt der Steigung der Regressionslinie und dem Durchschnittswert der Menge y bestimmt:

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

Zur Berechnung des R-Quadrats oder des Bestimmungskoeffizienten wird die Funktion REGR_R2 (x, y) verwendet, die bei Nullvarianz y nicht definiert ist, bei Nulldispersion x gleich Eins und bei Nullvarianz y gleich Eins ist. Und im Fall einer positiven Varianz von x und einer Varianz ungleich Null von y ist gleich dem Quadrat der Korrelation von x und 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 

Wir würden den Bestimmungskoeffizienten als eine Größe beschreiben, die den Prozentsatz der beschriebenen Variationen durch das Modell charakterisiert. Wenn der Bestimmungskoeffizient 1 ist, beschreibt unser Modell 100% der Variationen und unsere Prognose ist so genau wie möglich.

Wir schlagen vor, die Zeitdifferenz, in der die Metrik empfangen wird, und die aktuelle Zeit als x zu nehmen - ROLLUP_TIMESTAMP-SYSDATE. Als y nehmen wir den Durchschnittswert des freien verbleibenden Speicherplatzes / u01 in MB - "Dateisystemspeicher verfügbar (MB)". In diesem Fall können wir mithilfe der Funktion REGR_INTERCEPT (ROLLUP_TIMESTAMP-SYSDATE, VALUE_AVERAGE) als Gruppenfunktion schätzen, wie viele Tage der Speicherplatz / u01 ausgehen wird.

In erweiterter Form werden der Wert der Funktion der Steigung der Regressionslinie, das Abfangen der Achse und der Bestimmungskoeffizient durch die Abfrage erhalten:

 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; 

Oder verwenden Sie bereits die Funktionen REGR_SLOPE , REGR_INTERCEPT und 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 

In unserem Fall liegt der Bestimmungskoeffizient nahe bei 1, und wir sehen, dass nach ungefähr 149 Tagen der Platz im / u10-Dateisystem endet.

Mit dieser Methode können wir die Zeit abschätzen, für die genügend Speicherplatz für die Hosts produktiver Datenbanken verfügbar ist. In unserem Fall sind die Hosts produktiver Datenbanken mit METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80' in der Gruppe METRIC_GUID='E8838C71E687BF0A9E02FFACC0C9AC80' .

Wir erstellen einen User Definded Type T_TYPE mit den Feldern, die wir für die Ausgabe benötigen: Hostname, Dateisystemname, Steigung der Regressionslinie, Anzahl der Tage, nach denen der Speicherplatz im Dateisystem endet, und Bestimmungskoeffizient.

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

Erstellen Sie einen verschachtelten Tabellentyp R_TYPE basierend auf T_TYPE:

 CREATE OR REPLACE TYPE R_TYPE AS TABLE OF T_TYPE; 

Wir erstellen ein Paket, das die Funktion GET_VALUES zum Extrahieren von Daten aus MGMT_METRICS_1DAY und die Prozedur zum Senden der empfangenen Daten per E-Mail SEND_VALUES .

 CREATE OR REPLACE PACKAGE EST_FS_EXHAUST IS 

Für die Funktion GET_VALUES Eingabeparameter die Variable V_GN mit dem Namen der V_GN und dem Wert des Bestimmungskoeffizienten V_RSQ .

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

Für die Prozedur SEND_VALUES Eingabeparameter die Variablen V_GN und V_RSQ , ähnlich den Variablen der Funktion GET_VALUES , sowie die E-Mail, an die wir unseren Mini-Bericht senden GET_VALUES .

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

Im GET_VALUES definieren wir die Funktion GET_VALUES und die Prozedur 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; / 

Angenommen, wir möchten die Zeit ermitteln, nach der der Platz in den Dateisystemen der produktiven Hostgruppe 'prod_hosts' mit einem Bestimmungskoeffizienten von mehr als 0,5 abläuft:

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

Als Ergebnis kommt eine Nachricht in der Mail an:

Das Host-Host1-Dateisystem / u51 ist in 342 Tagen erschöpft
Host host2 filesystem / u40 wird in 236 Tagen erschöpft sein
Das Host-Host3-Dateisystem / u20 / redo01 ist in 1100310 Tagen erschöpft
Das Host-Host4-Dateisystem / u10 ist in 150 Tagen erschöpft
Host Host4-Dateisystem / u01 / Integration wird in 75080 Tagen erschöpft sein
Das Host-Host4-Dateisystem / u01 / app ist in 135 Tagen erschöpft
Das Host-Host5-Dateisystem / u30 / redo01 ist in 62252596 Tagen erschöpft
Das Host-Host6-Dateisystem / u01 ist in 260 Tagen erschöpft
Host host7 Dateisystem / u99 wird in 1038 Tagen erschöpft sein

Achten Sie auf die Dateisysteme / u20 / redo01 und / u30 / redo01 - hier sind die REDO-LOGS und der Platz wird nicht verschwendet. Unser Modell sagte voraus, dass der Platz in / u20 / redo01 auf Host3 in 2990 Jahren und in / u30 / redo01 auf Host5 in 169164 Jahren enden würde. In beiden Fällen beträgt die Steigung der Regressionslinie weniger als –1.

Die Verwendung dieser Methode kann erweitert werden, um beispielsweise die Zeit zu schätzen, bevor der Speicherplatz in FAST RECOVERY AREA, in Tabellenbereichen der Datenbank und in anderen Bereichen knapp wird.

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


All Articles