Abdelbar SAJI

Ingénieur Systèmes Mainframe

Ingénieur en Cybersécurité

Ingénieur Systèmes & Réseaux

Développeur Full Stack

Cryptanalyst

Abdelbar SAJI

Ingénieur Systèmes Mainframe

Ingénieur en Cybersécurité

Ingénieur Systèmes & Réseaux

Développeur Full Stack

Cryptanalyst

Articles

Optimisation JES2 et gestion des files d’attente

septembre 15, 2025 JES2

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.

Écrire un commentaire

For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.