Optimisation JES2 et gestion des files d’attente
Introduction à JES2 (Job Entry Subsystem)
JES2 est le pilier central de la gestion des travaux batch sur z/OS. En tant qu'ingénieur système avec 25 années d'expérience, j'ai optimisé de nombreux environnements JES2 traitant plus de 100,000 jobs par jour. L'optimisation de JES2 impacte directement la productivité de l'entreprise et la satisfaction des utilisateurs finaux.
Architecture JES2 et composants critiques
Comprendre l'architecture JES2 est essentiel pour optimiser efficacement les performances. JES2 gère tout le cycle de vie des jobs : soumission, planification, exécution et sortie.
┌─────────────────────────────────────────────────────────────────┐
│ ARCHITECTURE JES2 COMPLÈTE │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ INPUT │ │ JOB │ │ OUTPUT │ │
│ │ QUEUE │───▶│ EXECUTION │───▶│ QUEUE │ │
│ │ │ │ │ │ │ │
│ │ • INTRDR │ │ ┌─────────┐ │ │ • SYSOUT Classes │ │
│ │ • Internal │ │ │Init A01 │ │ │ • HELD Output │ │
│ │ Reader │ │ │Init A02 │ │ │ • Purge Queue │ │
│ │ • Card │ │ │Init B01 │ │ │ │ │
│ │ Reader │ │ │Init C01 │ │ │ │ │
│ └─────────────┘ │ └─────────┘ │ └─────────────────────┘ │
│ └─────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ CHECKPOINT │ │ SPOOL │ │ JES2 PROC │ │
│ │ QUEUE │ │ DATASETS │ │ PARAMETERS │ │
│ │ │ │ │ │ │ │
│ │ • Recovery │ │ • SPOOL001 │ │ • JES2PARM │ │
│ │ • Restart │ │ • SPOOL002 │ │ • Initialization │ │
│ │ • Backup │ │ • SPOOL003 │ │ • Exit Routines │ │
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Configuration des classes de jobs et priorités
La stratégie de classification des jobs détermine l'efficacité globale du système. Une approche méthodique basée sur les SLA métier est cruciale :
/*==============================================================*/
/* CONFIGURATION CLASSES JES2 - Stratégie optimisée */
/* Basée sur 25 ans d'expérience en environnements critiques */
/*==============================================================*/
&JOBCLASS
/*
* CLASSE A : Jobs critiques temps réel (SLA < 5 min)
* Usage : Interfaces bancaires, transactions urgentes
*/
A(IEFUJV=CHKJCL,MSGCLASS=H,MSGLEVEL=(1,1),SCHENV=PROD,MAXJOBS=50,
PRTY=15)
/*
* CLASSE B : Jobs de production standard (SLA < 30 min)
* Usage : Batch nocturnes, extractions comptables
*/
B(IEFUJV=CHKJCL,MSGCLASS=A,MSGLEVEL=(1,1),SCHENV=PROD,MAXJOBS=200,
PRTY=10)
/*
* CLASSE C : Jobs de développement et test (SLA < 2h)
* Usage : Compilations, tests unitaires
*/
C(IEFUJV=CHKJCL,MSGCLASS=T,MSGLEVEL=(2,2),SCHENV=TEST,MAXJOBS=100,
PRTY=5)
/*
* CLASSE D : Jobs de reporting et analytique (SLA < 4h)
* Usage : Rapports mensuels, data mining
*/
D(IEFUJV=CHKJCL,MSGCLASS=R,MSGLEVEL=(1,1),SCHENV=PROD,MAXJOBS=75,
PRTY=3)
/*
* CLASSE X : Jobs système et maintenance (priorité absolue)
* Usage : Backup, maintenance, recovery
*/
X(IEFUJV=CHKJCL,MSGCLASS=S,MSGLEVEL=(1,1),SCHENV=SYST,MAXJOBS=25,
PRTY=20)
&MSGCLASS
/*
* Configuration messages par niveau critique
*/
H(DEST=RMT001,HOLD=YES) /* Messages critiques - review manuel */
A(DEST=LOCAL,FORMS=STD) /* Messages production standard */
T(DEST=TSO001,HOLD=NO) /* Messages développement - TSO */
R(DEST=REPORT,FORMS=A4) /* Rapports - imprimante dédiée */
S(DEST=CONSOLE,HOLD=YES) /* Messages système - console operator */
Optimisation des initiateurs par classe
Le dimensionnement des initiateurs nécessite une analyse fine des patterns de charge. Voici ma méthodologie éprouvée :
/*==============================================================*/
/* DIMENSIONNEMENT INITIATEURS - Méthodologie éprouvée */
/* Calcul basé sur analyse workload et SLA métier */
/*==============================================================*/
&INITPARM
/*
* INITIATEURS CLASSE A - Jobs critiques
* Formule : (Peak_jobs_simultanés × 1.2) + buffer_urgence
* Analyse : pic 35 jobs à 09:00, buffer 20% = 42 + 8 = 50
*/
START=(A,10), /* 10 initiateurs dédiés classe A */
PRTRANS=YES, /* Transparence priorité */
CLASS=A, /* Classe exclusive */
PERFGRP=CRITICAL /* Groupe performance WLM */
&INITPARM
/*
* INITIATEURS CLASSE B - Production standard
* Formule basée sur débit moyen et temps exécution
* Débit cible : 200 jobs/heure, temps moyen : 15 min
* Initiateurs = (200 × 0.25) × 1.3 = 65
*/
START=(B,15), /* 15 initiateurs classe B */
CLASS=B,
PERFGRP=PROD_BATCH
&INITPARM
/*
* INITIATEURS MIXTES - Optimisation ressources
* Configuration adaptative pour gérer les pics
*/
START=(C,8), /* Base développement */
START=(D,5), /* Base reporting */
START=(ABCD,12), /* Initiateurs flexibles */
CLASS=(A,B,C,D),
PERFGRP=MIXED_WORKLOAD
/*==============================================================*/
/* MONITORING AUTOMATIQUE CHARGE INITIATEURS */
/*==============================================================*/
* Job de monitoring exécuté toutes les 15 minutes
//JESMON JOB CLASS=X,MSGCLASS=S,NOTIFY=&SYSUID
//STEP01 EXEC PGM=IKJEFT01
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
/* Collecte statistiques JES2 */
CALL 'SYS1.LINKLIB(JESMON)' '&SYSDATE &SYSTIME'
/* Script REXX intégré */
%JESMON_STATS
/*
//
/* Programme REXX JESMON_STATS */
/*==============================================================*/
/* Analyse charge initiateurs et recommandations automatiques */
/*==============================================================*/
JESMON_STATS:
parse arg date time
/* Collecte des métriques JES2 */
call get_jes2_stats
call analyze_queue_depth
call calculate_recommendations
if queue_depth_A > 20 then do
say "ALERT: Classe A saturée - " queue_depth_A " jobs en attente"
say "RECOMMANDATION: Augmenter initiateurs A de" current_init_A "à" ,
current_init_A + 3
end
if avg_wait_time_B > 30 then do
say "WARNING: Temps attente classe B = " avg_wait_time_B " minutes"
say "RECOMMANDATION: Réviser répartition initiateurs B/C"
end
return
get_jes2_stats:
/* Interface avec JES2 pour récupérer statistiques temps réel */
ADDRESS MVS "CONSOLE '$DJ'" /* Display Jobs */
ADDRESS MVS "CONSOLE '$DI'" /* Display Initiators */
return
Tuning des paramètres SPOOL et performance
L'optimisation du SPOOL impacte directement les performances I/O et la capacité du système. Ma configuration type pour environnement haute charge :
/*==============================================================*/
/* CONFIGURATION SPOOL OPTIMISÉE - Haute performance */
/* Dimensionnement pour > 100,000 jobs/jour */
/*==============================================================*/
&SPOOLDEF
/*
* Configuration volumes SPOOL
* Stratégie : Répartition charge I/O sur volumes multiples
*/
VOLUME=(SPOOL1,SPOOL2,SPOOL3,SPOOL4,SPOOL5,SPOOL6),
SPACE=(TRK,(500000,50000)), /* 500,000 tracks primaires */
TRKGRPS=255, /* Groupes de tracks max */
PERCENT=90 /* Seuil alerte 90% */
&SPOOL
/*
* Paramètres performance SPOOL
*/
BUFSIZE=32760, /* Buffer size optimal */
JOBNUM=(1,99999), /* Range numéros jobs */
OUTDISP=(WRITE,KEEP), /* Sortie optimisée */
SPIN=UNALLOC /* Libération immédiate */
/*==============================================================*/
/* MONITORING SPOOL - Surveillance proactive */
/*==============================================================*/
&EXIT(005) ROUTINE=SPOOLMON,TRACE=NO,STATUS=ACTIVE
/*
* Exit 005 : Monitoring utilisation SPOOL
* Déclenche alertes préventives et cleanup automatique
*/
* Programme exit SPOOLMON (Assembleur)
SPOOLMON CSECT
SAVE (14,12)
LR R12,R15
USING SPOOLMON,R12
* Vérification utilisation volumes SPOOL
L R2,CURRENT_USAGE
L R3,MAXIMUM_SPACE
MR R0,=F'100'
DR R0,R3
C R1,=F'85' * Seuil 85%
BL NORMAL_USAGE
* Alerte utilisation élevée
WTO 'JES2SPOOL - WARNING: Utilisation > 85%'
BAL R14,CLEANUP_OLD_OUTPUT
NORMAL_USAGE DS 0H
RETURN (14,12),RC=0
CLEANUP_OLD_OUTPUT DS 0H
* Purge automatique outputs > 7 jours
TIME DEC
S R0,=F'70000' * 7 jours en 1/100 sec
* Logic de purge des anciens jobs
CALL PURGE_OLD_JOBS,(R0)
BR R14
END SPOOLMON
Optimisation des files d'attente et WLM
L'intégration JES2/WLM (Workload Manager) permet une gestion sophistiquée des priorités basée sur les objectifs métier :
/*==============================================================*/
/* INTÉGRATION JES2/WLM - Gestion avancée priorités */
/* Configuration pour SLA différenciés par type métier */
/*==============================================================*/
/* Définition Service Classes WLM pour JES2 */
SERVICE_CLASS NAME=CRITICAL_BATCH
WORKLOAD=BANKING_PROD
SERVICE_GOALS=(
RESPONSE_TIME=300, /* 5 minutes max */
IMPORTANCE=1, /* Priorité maximale */
DURATION=(0,600,90),(600,1800,80),(1800,*,70)
)
SERVICE_CLASS NAME=STANDARD_BATCH
WORKLOAD=PROD_STANDARD
SERVICE_GOALS=(
RESPONSE_TIME=1800, /* 30 minutes max */
IMPORTANCE=2,
DURATION=(0,300,80),(300,900,70),(900,*,60)
)
SERVICE_CLASS NAME=DEV_TEST
WORKLOAD=DEVELOPMENT
SERVICE_GOALS=(
RESPONSE_TIME=7200, /* 2 heures max */
IMPORTANCE=3,
DISCRETIONARY_GOAL=YES
)
/*==============================================================*/
/* CONFIGURATION EXITS JES2 - Routage intelligent */
/*==============================================================*/
&EXIT(006) ROUTINE=JOBCLASS,TRACE=NO,STATUS=ACTIVE
/*
* Exit 006 : Classification automatique jobs
* Analyse nom job, utilisateur, ressources pour routage optimal
*/
* Programme exit JOBCLASS (Assembleur/COBOL interface)
//JOBCLASS JOB CLASS=X,MSGCLASS=S
//COMPILE EXEC ASMHCL
//ASM.SYSIN DD *
JOBCLASS CSECT
SAVE (14,12)
LR R12,R15
USING JOBCLASS,R12
* Analyse caractéristiques du job
L R2,JOB_NAME_ADDR
CLC 0(4,R2),=C'BANK' * Jobs bancaires
BE SET_CRITICAL
CLC 0(3,R2),=C'PAY' * Jobs paiement
BE SET_CRITICAL
CLC 0(4,R2),=C'TEST' * Jobs test
BE SET_DEVELOPMENT
CLC 0(3,R2),=C'RPT' * Rapports
BE SET_REPORTING
* Classification par défaut
B SET_STANDARD
SET_CRITICAL DS 0H
MVI NEW_CLASS,C'A' * Classe critique
MVI PRIORITY,X'0F' * Priorité 15
B EXIT_ROUTINE
SET_DEVELOPMENT DS 0H
MVI NEW_CLASS,C'C' * Classe développement
MVI PRIORITY,X'05' * Priorité 5
B EXIT_ROUTINE
SET_REPORTING DS 0H
MVI NEW_CLASS,C'D' * Classe reporting
MVI PRIORITY,X'03' * Priorité 3
B EXIT_ROUTINE
SET_STANDARD DS 0H
MVI NEW_CLASS,C'B' * Classe standard
MVI PRIORITY,X'0A' * Priorité 10
EXIT_ROUTINE DS 0H
RETURN (14,12),RC=0
END JOBCLASS
/*
//LKED.SYSLIB DD DSN=SYS1.LINKLIB,DISP=SHR
// DD DSN=USER.EXIT.LOAD,DISP=SHR
Monitoring avancé et métriques de performance
Un système de monitoring sophistiqué est essentiel pour maintenir des performances optimales. Voici mes outils et tableaux de bord éprouvés :
/*==============================================================*/
/* DASHBOARD JES2 - Métriques temps réel */
/* Interface ISPF personnalisée pour opérateurs */
/*==============================================================*/
)ATTR DEFAULT(%+_)
+ TYPE(TEXT) INTENS(HIGH) COLOR(WHITE)
% TYPE(TEXT) INTENS(HIGH) COLOR(GREEN)
_ TYPE(INPUT) INTENS(HIGH) CAPS(ON) JUST(LEFT)
@ TYPE(OUTPUT) INTENS(HIGH) COLOR(YELLOW)
$ TYPE(OUTPUT) INTENS(HIGH) COLOR(RED)
)BODY EXPAND(\)
%------------------------ JES2 PERFORMANCE DASHBOARD ------------------------
%Command ===>_ZCMD %&ZDATE &ZTIME
%
+JES2 System Status: @JESSTAT +Active Initiators: @INITACT
+Jobs in Input Queue: @INPUTQ +Jobs Executing: @EXECJOBS
+Jobs in Output Queue: @OUTPUTQ +Average Wait Time: @AVGWAIT mins
+
+Class Distribution: +Initiator Utilization:
+ A (Critical): @CLASSA jobs + Class A: @INITA % [@INITACNT/10]
+ B (Standard): @CLASSB jobs + Class B: @INITB % [@INITBCNT/15]
+ C (Development): @CLASSC jobs + Class C: @INITC % [@INITCCNT/8 ]
+ D (Reporting): @CLASSD jobs + Class D: @INITD % [@INITDCNT/5 ]
+
+SPOOL Utilization: +Performance Alerts:
+ Volume SPOOL1: @SPL1 % [@SPL1BAR ] $ALERT1
+ Volume SPOOL2: @SPL2 % [@SPL2BAR ] $ALERT2
+ Volume SPOOL3: @SPL3 % [@SPL3BAR ] $ALERT3
+
+Hourly Throughput (Jobs/Hour):
+ Current: @CURHOUR + Peak Today: @PEAKHOUR
+ Average: @AVGHOUR + Yesterday: @YESTHOUR
+
%PF1=Help PF3=Exit PF5=Refresh PF7=Up PF8=Down PF9=Commands PF12=Cancel
/*==============================================================*/
/* PROGRAMME COLLECTE MÉTRIQUES - REXX */
/*==============================================================*/
/* JES2PERF - Collecteur de métriques performance */
JES2PERF:
parse arg refresh_interval .
if refresh_interval = '' then refresh_interval = 60
do forever
call collect_jes2_metrics
call update_dashboard
call check_thresholds
call sleep refresh_interval
end
return
collect_jes2_metrics:
/* Interface avec JES2 pour métriques temps réel */
/* Commandes JES2 pour statistiques */
ADDRESS MVS "CONSOLE '$D JES2'"
ADDRESS MVS "CONSOLE '$DJ'"
ADDRESS MVS "CONSOLE '$DI'"
ADDRESS MVS "CONSOLE '$DS'"
/* Parsing des réponses console */
call parse_jes2_responses
/* Calculs dérivés */
current_throughput = jobs_completed_hour
utilization_A = (active_init_A / total_init_A) * 100
avg_wait_A = total_wait_time_A / jobs_class_A
return
check_thresholds:
/* Système d'alertes intelligent */
alert_count = 0
/* Vérification seuils critiques */
if jobs_waiting_A > 15 then do
alert.1 = "CRITICAL: " jobs_waiting_A " jobs classe A en attente"
priority.1 = "HIGH"
alert_count = alert_count + 1
end
if spool_utilization > 85 then do
alert_count = alert_count + 1
alert.alert_count = "WARNING: SPOOL " spool_utilization "% utilisé"
priority.alert_count = "MEDIUM"
end
if avg_wait_time > sla_target * 1.2 then do
alert_count = alert_count + 1
alert.alert_count = "SLA BREACH: Temps attente " avg_wait_time " min"
priority.alert_count = "HIGH"
end
/* Notification automatique si alertes critiques */
if alert_count > 0 then
call send_alerts
return
Procédures de recovery et haute disponibilité
La robustesse de JES2 repose sur des procédures de recovery bien définies et testées régulièrement :
/*==============================================================*/
/* PROCÉDURES RECOVERY JES2 - Haute disponibilité */
/* Procédures testées et validées en environnement critique */
/*==============================================================*/
/* Checkpoint automatique et recovery */
&CKPTSPACE SPACE=(TRK,(1000,100)),DSNAME=JES2.CKPT.DATASET
/*
* Stratégie checkpoint JES2 :
* - Checkpoint automatique toutes les 5 minutes
* - Backup checkpoint toutes les heures
* - Recovery point objective (RPO) : 5 minutes max
*/
&CKPTDEF NEWCKPT1=15,NEWCKPT2=60,STORE=YES
//JES2BCAK JOB CLASS=X,MSGCLASS=S
/*
* Job de backup automatique checkpoint JES2
* Exécution : toutes les heures via scheduling système
*/
//BACKUP EXEC PGM=IEFBR14
//CKPTBKUP DD DSN=JES2.CKPT.BACKUP.G&GENNUM,
// DISP=(NEW,CATLG,DELETE),
// LIKE=JES2.CKPT.DATASET
//SYSIN DD DUMMY
/*==============================================================*/
/* PROCÉDURE RECOVERY COLD START */
/*==============================================================*/
/* Procédure manuelle en cas de corruption majeure */
//COLDREC PROC
//JES2 EXEC PGM=HASJES20,
// PARM='COLD,NOREQ' /* Cold start, no req queue */
//HASPPARM DD DSN=SYS1.PARMLIB(JES2PARM),DISP=SHR
//HASPLIST DD SYSOUT=A
/*
* Étapes recovery Cold Start :
* 1. Arrêt JES2 contrôlé : $P JES2
* 2. Vérification intégrité SPOOL : IDCAMS VERIFY
* 3. Restart Cold avec perte queues actives
* 4. Resoumission jobs critiques depuis backup
*/
// PEND
/*==============================================================*/
/* PROCÉDURE RECOVERY WARM START */
/*==============================================================*/
//WARMREC PROC
//JES2 EXEC PGM=HASJES20,
// PARM='WARM,FORMAT' /* Warm start avec format */
//HASPPARM DD DSN=SYS1.PARMLIB(JES2PARM),DISP=SHR
//HASPLIST DD SYSOUT=A
/*
* Étapes recovery Warm Start :
* 1. Arrêt JES2 : $P JES2
* 2. Vérification checkpoint : HASJES20 PARM='CKPT'
* 3. Recovery automatique des queues
* 4. Validation jobs en cours d'exécution
*/
// PEND
/*==============================================================*/
/* MONITORING RECOVERY - Surveillance automatique */
/*==============================================================*/
//RECOMON JOB CLASS=X,MSGCLASS=S,COND=(0,NE)
//STEP1 EXEC PGM=IKJEFT01
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
/* REXX - Monitoring recovery JES2 */
%RECOVERY_MONITOR
RECOVERY_MONITOR:
parse source . . exec_name .
/* Vérification santé JES2 toutes les 2 minutes */
do forever
/* Test connectivité JES2 */
ADDRESS MVS "CONSOLE '$D JES2'"
if rc ¬= 0 then do
say "CRITICAL: JES2 non-responsive"
call initiate_recovery_procedure
end
/* Vérification checkpoint */
call check_checkpoint_integrity
/* Test SPOOL accessibility */
call verify_spool_access
call sleep 120 /* 2 minutes */
end
return
initiate_recovery_procedure:
say "INITIATING AUTOMATIC RECOVERY SEQUENCE"
/* Notification équipes */
call send_critical_alert "JES2 FAILURE DETECTED - AUTO RECOVERY STARTED"
/* Tentative recovery Warm d'abord */
say "Attempting WARM recovery..."
ADDRESS MVS "START JES2,PARM='WARM'"
call sleep 60
call test_jes2_operational
if jes2_status ¬= "ACTIVE" then do
say "WARM recovery failed - attempting COLD recovery"
ADDRESS MVS "START JES2,PARM='COLD'"
call restore_critical_jobs
end
return
Stratégies d'optimisation JES2 avancées
• Classification intelligente : Utiliser des exits pour router automatiquement les jobs selon leur criticité métier.
• Dimensionnement dynamique : Ajuster le nombre d'initiateurs selon les patterns de charge horaires.
• SPOOL distribué : Répartir les volumes SPOOL sur différents sous-systèmes de stockage pour optimiser les I/O.
• Intégration WLM : Exploiter Workload Manager pour une gestion fine des priorités selon les SLA.
• Monitoring proactif : Mettre en place des alertes préventives avant saturation des ressources.
• Recovery automatisé : Implémenter des procédures de recovery automatiques avec escalation manuelle.
• Archivage intelligent : Automatiser la purge des outputs anciens selon leur classe et criticité.
• Optimisation réseau : Configurer la transmission remote pour distribuer la charge de sortie.