Vedere quali job consumano più CPU

Rivista il

Accedi per salvare
SELECT JOB_NAME, AUTHORIZATION_NAME, SUBSYSTEM,
       ELAPSED_CPU_PERCENTAGE, CPU_TIME, FUNCTION
  FROM TABLE(QSYS2.ACTIVE_JOB_INFO())
 WHERE JOB_TYPE <> 'SYS'
 ORDER BY ELAPSED_CPU_PERCENTAGE DESC
 FETCH FIRST 15 ROWS ONLY

Si lancia due volte. ELAPSED_CPU_PERCENTAGE è la percentuale di CPU nell'intervallo di misura, e IBM dice che la prima chiamata di ACTIVE_JOB_INFO in una connessione azzera sempre le statistiche: la prima volta l'intervallo è appena cominciato e le percentuali non dicono niente. Si aspetta qualche secondo e si rilancia la stessa query, nella stessa sessione di Run SQL Scripts: la seconda dice chi ha consumato nel frattempo, cioè chi sta consumando adesso. CPU_TIME invece è il totale dall'inizio del job.

Per guardare un solo sottosistema:

SELECT JOB_NAME, ELAPSED_CPU_PERCENTAGE, FUNCTION
  FROM TABLE(QSYS2.ACTIVE_JOB_INFO(SUBSYSTEM_LIST_FILTER => 'QBATCH'))
 ORDER BY ELAPSED_CPU_PERCENTAGE DESC

Cambiare il filtro azzera di nuovo le statistiche: anche qui, la seconda esecuzione è quella che conta.

Esempio: «ieri alle tre era lentissimo»

WRKACTJOB mostra adesso; il problema era ieri. Un job schedulato ogni cinque minuti che scrive i primi cinque consumatori lascia la traccia. La tabella si crea dalla query stessa, così nomi e tipi delle colonne li decide il servizio:

CREATE TABLE MIALIB/STORCPU AS (
  SELECT CURRENT TIMESTAMP AS RILEVATO, JOB_NAME,
         AUTHORIZATION_NAME, ELAPSED_CPU_PERCENTAGE, FUNCTION
    FROM TABLE(QSYS2.ACTIVE_JOB_INFO())
) WITH NO DATA

Poi il CL da schedulare. Per la stessa ragione di sopra fa due letture nello stesso job: la prima fissa l'inizio dell'intervallo, la seconda, un minuto dopo, misura:

RUNSQL SQL('CREATE TABLE QTEMP/INIZIO AS                    +
            (SELECT JOB_NAME FROM TABLE(QSYS2.ACTIVE_JOB_INFO())) +
            WITH NO DATA') COMMIT(*NONE)
DLYJOB DLY(60)
RUNSQL SQL('INSERT INTO MIALIB/STORCPU                       +
            SELECT CURRENT TIMESTAMP AS RILEVATO, JOB_NAME,   +
                   AUTHORIZATION_NAME, ELAPSED_CPU_PERCENTAGE, FUNCTION +
              FROM TABLE(QSYS2.ACTIVE_JOB_INFO())            +
             WHERE JOB_TYPE <> ''SYS''                       +
             ORDER BY ELAPSED_CPU_PERCENTAGE DESC            +
             FETCH FIRST 5 ROWS ONLY') COMMIT(*NONE)

Il giorno dopo:

SELECT * FROM MIALIB/STORCPU
 WHERE RILEVATO BETWEEN '2026-08-25-14.30.00' AND '2026-08-25-15.30.00'
 ORDER BY RILEVATO, ELAPSED_CPU_PERCENTAGE DESC

Date e orari sono un esempio.

Suggerimento

la colonna FUNCTION dice a che punto è il job: quale programma o quale comando sta eseguendo. Su un job fermo è spesso l'informazione che serve.


Rilasci. I parametri con nome di QSYS2.ACTIVE_JOB_INFO sono arrivati nel tempo. Se la chiamata con SUBSYSTEM_LIST_FILTER viene rifiutata, si esegue la funzione senza parametri e si filtra su SUBSYSTEM nel WHERE.

Fonti

← Torna al blog

Commenti

Nessun commento ancora. Sii il primo a commentare!

Devi avere un account per commentare. Accedi · Registrati