☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta zBNA. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta zBNA. Mostrar todas as mensagens

quinta-feira, 10 de setembro de 2026

🎧 zBNA — A Conversação do Batch: Harry Caul e o Mistério do Critical Path

 

Bellacosa Mainframe apresenta o zBNA analise de processos batch

☕ Um Café no Bellacosa Mainframe

🎧 zBNA — A Conversação do Batch: Harry Caul e o Mistério do Critical Path

Sob a batuta de Harry Caul, de The Conversation: no mainframe, assim como numa gravação de vigilância, o problema raramente está simplesmente no sinal mais alto. Está naquilo que acontece entre os sinais — nas pausas, dependências, esperas e detalhes que ninguém percebeu.



Imagine uma sala silenciosa.

Na parede existem gráficos de CPU, relatórios de utilização, tempos de execução, estatísticas de I/O e algumas planilhas de capacity planning.

O batch deveria ter terminado às 03:00.

São 03:17.

Alguém olha para o gráfico e diz:

— Precisamos de um mainframe maior.

No fundo da sala, Harry Caul não responde.

Ele coloca os fones de ouvido.

Volta a fita.

Escuta novamente.

Porque Harry aprendeu uma coisa durante toda uma vida ouvindo conversas que outras pessoas não deveriam ouvir:

uma informação isolada pode dizer algo completamente diferente quando colocada no contexto correto.

E é exatamente esse o problema que encontramos quando tentamos fazer sizing de um ambiente IBM Z olhando somente para capacidade de processador.

Bem-vindo à investigação.



🎧 1. Harry Caul não começaria olhando o processador

Para quem nunca assistiu a The Conversation, Harry Caul é um especialista em vigilância e gravação de áudio.

Seu trabalho não consiste simplesmente em gravar sons.

Ele precisa separar ruído de informação.

Uma conversa aparentemente banal pode esconder algo importante.

Uma frase pode assumir outro significado quando escutada novamente.

No nosso datacenter acontece algo parecido.

Temos:

CPU utilization
MSU
MIPS
Elapsed Time
CPU Time
I/O
Wait
ENQ
Db2
VSAM
JES2
WLM
Scheduler

Tudo está falando ao mesmo tempo.

O erro seria escolher o gráfico mais chamativo e concluir:

CPU alta
   ↓
Falta capacidade
   ↓
Comprar processador

Pode ser verdade.

Mas ainda não sabemos.

Harry Caul provavelmente perguntaria:

“O que aconteceu antes disso?”


 

Essa pergunta nos leva ao IBM Z Batch Network Analyzer — zBNA.



🕸️ 2. O batch é uma conversa entre JOBs

Para um programador COBOL iniciante, uma sequência batch pode parecer algo relativamente simples.

Temos JOBs:

JOB001
JOB002
JOB003
JOB004
JOB005

Parece uma lista.

Mas operacionalmente eles podem estar relacionados:

             +--> JOB B --+
             |            |
JOB A -------+            +--> JOB D --> JOB E --> FIM
             |            |
             +--> JOB C --+

Agora a história mudou.

JOB B e JOB C dependem de A.

JOB D depende de alguma condição relacionada aos anteriores.

JOB E depende de D.

Portanto, não estamos mais observando apenas programas.

Estamos observando uma rede de dependências.

É quase uma conversação:

JOB A: terminei.

JOB B: agora posso começar.
JOB C: eu também.

JOB C: terminei.

JOB D: ainda não.

JOB B: terminei.

JOB D: agora sim.

JOB D: processando...
JOB D: processando...
JOB D: processando...

JOB E: esperando...

Harry Caul imediatamente prestaria atenção naquele silêncio.

Por que JOB E está esperando?


⏱️ 3. O silêncio também faz parte da gravação

Esse é um conceito fundamental para quem começa a estudar performance.

Um programa pode estar demorando sem estar usando CPU.

Considere:

Elapsed Time = 42 minutos
CPU Time     = 11 minutos

Onde estão os outros 31 minutos?

Essa é uma pergunta maravilhosa.

Porque começamos a procurar:

I/O WAIT
LOCK
ENQ
DATASET CONTENTION
DB2 LOCKING
QUEUE
SCHEDULING
RESOURCE WAIT
NETWORK
APPLICATION SERIALIZATION

Imagine nossa investigação encontrando:

Elapsed Time     42 min
├── CPU           11 min
├── I/O            17 min
├── Lock/ENQ        8 min
└── Outros waits    6 min

Agora tente resolver isso simplesmente colocando mais processador.

Talvez os 11 minutos de CPU melhorem.

Mas e os outros?

Essa é a primeira grande lição:

Elapsed Time não é simplesmente CPU Time usando outro relógio.


🐉 4. Encontramos JOB D

Voltemos à cadeia:

JOB A = 12 min

       +-- JOB B = 18 min --+
       |                    |
       +-- JOB C =  7 min --+
                            |
                         JOB D = 42 min
                            |
                         JOB E = 9 min

B e C podem executar simultaneamente.

Portanto não podemos simplesmente fazer:

12 + 18 + 7 + 42 + 9

Precisamos considerar a dependência.

Nesse exemplo simplificado:

12 + MAX(18,7) + 42 + 9

Temos:

12 + 18 + 42 + 9 = 81 minutos

E observe JOB D:

42 / 81 ≈ 52%

Ele ocupa mais da metade do caminho.

Harry Caul colocaria os fones novamente.

Por que exatamente são 42 minutos?

Essa pergunta vale potencialmente muito dinheiro.


🛣️ 5. Critical Path — quem realmente possui o relógio?

Chegamos ao conceito central:

Critical Path.

Imagine uma rede maior:

                 JOB B --------+
                /               \
JOB A ----------                 +---- JOB F ----+
                \               /                |
                 JOB C --> JOB D                 +--> JOB H
                                                /
                 JOB E -------------------------+

Podemos possuir diferentes caminhos:

A → B → F → H

A → C → D → F → H

E → H

Um deles determinará quando todo o processo poderá terminar.

Esse é nosso caminho crítico.

E aqui surge uma descoberta extremamente importante:

O JOB que mais consome CPU não precisa ser o JOB mais importante para reduzir a janela batch.

Suponha que JOB X consuma enorme quantidade de CPU.

Todo mundo olha para ele.

JOB X
CPU TIME = █████████████████████

Parece culpado.

Mas JOB X possui bastante folga e está fora do critical path.

Você consegue uma otimização fantástica:

JOB X
-30% elapsed

Resultado sobre o fechamento:

0 minutos

Nada.

O batch termina exatamente no mesmo horário.

Enquanto isso, um JOB pequeno pertencente ao critical path perde cinco minutos esperando determinado recurso.

Eliminar aquela espera poderia antecipar o fechamento em aproximadamente cinco minutos.

Harry Caul diria:

vocês estavam ouvindo a pessoa errada.


💻 6. Programador COBOL: não condene o programa imediatamente

Encontramos JOB D.

A primeira reação pode ser:

— COBOL velho!

Calma.

Talvez o programa esteja perfeitamente correto.

Imagine:

PERFORM PROCESSA-REGISTRO
   UNTIL EOF.

O programa está executando adequadamente.

Mas cada ciclo depende de acesso a um recurso.

Pode existir:

COBOL
  ↓
VSAM
  ↓
Dataset
  ↓
ENQ
  ↓
WAIT

Ou:

COBOL
  ↓
SQL
  ↓
Db2
  ↓
LOCK
  ↓
WAIT

Ou ainda:

JOB
 ↓
Scheduler
 ↓
Dependency
 ↓
WAIT

Nenhuma quantidade de indignação contra o COBOL resolverá automaticamente isso.

E talvez nenhuma quantidade adicional de CPU resolva.

Precisamos encontrar a causa.


⚙️ 7. Capacity não é a mesma coisa que velocidade

Aqui encontramos outra armadilha.

Imagine dois sistemas hipotéticos:

SYSTEM A
10 engines × velocidade X

SYSTEM B
6 engines × velocidade Y

Mesmo que determinada medida agregada de capacidade pareça semelhante, o comportamento do workload pode ser diferente.

Por quê?

Imagine trabalho altamente paralelo:

JOB1 ──┐
JOB2 ──┤
JOB3 ──┼──> resultado
JOB4 ──┤
JOB5 ──┘

Vários engines podem ser aproveitados.

Agora imagine:

JOB1
  ↓
JOB2
  ↓
JOB3
  ↓
JOB4

Colocar dezenas de engines disponíveis ao lado dessa sequência não faz os JOBs executarem simultaneamente por mágica.

Temos então que distinguir:

aggregate capacity

de

per-engine performance

e ambos de:

usable parallelism.


🧵 8. Usable parallelism — dez microfones não criam dez conversas

Harry Caul poderia instalar dez microfones.

Mas se existe apenas uma pessoa falando, continuamos tendo uma conversa.

No mainframe podemos possuir:

10 engines disponíveis

enquanto o workload oferece:

1 unidade relevante de trabalho executável

Visualmente:

CPU0 ████████████
CPU1 ░░░░░░░░░░░░
CPU2 ░░░░░░░░░░░░
CPU3 ░░░░░░░░░░░░
CPU4 ░░░░░░░░░░░░

Adicionar CPU5, CPU6 e CPU7 não necessariamente ajudará.

Talvez precisemos investigar:

  • dependências;

  • scheduler;

  • initiators;

  • particionamento;

  • desenho dos JOBs;

  • datasets;

  • banco;

  • I/O;

  • serialização da aplicação.

Esse é o significado prático de usable parallelism.

Não importa somente quanta capacidade existe.

Importa quanto daquele paralelismo o workload consegue realmente consumir.


🏭 9. JES2, WLM e scheduler entram na sala

Agora nossa investigação fica mais interessante.

Eu dividiria o problema em quatro níveis:

BUSINESS PROCESS
       ↓
BATCH NETWORK
       ↓
z/OS RESOURCE BEHAVIOR
       ↓
PROCESSOR

No terceiro andar dessa investigação encontramos:

JES2
WLM
Initiators
Scheduler
I/O
Db2
VSAM
ENQ
Storage
Memory
Network

Imagine comprarmos um IBM Z muito mais poderoso.

Temos:

PROCESSOR
████████████████████████

JOB
██████

WAIT
████████████████████████████████

O processador está disponível.

O JOB não está trabalhando.

Harry Caul aumenta o volume.

Nada.

Porque o problema não está onde todos estavam olhando.


🎧 10. CPU a 95%: culpada!

Não tão rápido.

Encontramos:

CPU = 95%

Parece assustador.

Mas existe trabalho útil sendo processado?

O SLA está sendo atendido?

Existe fila significativa esperando CPU?

A utilização é sustentada ou apenas um pico?

O comportamento está dentro do esperado?

Então 95% isoladamente não constitui diagnóstico.

Agora encontramos:

CPU = 40%

Maravilha!

Temos sobra.

Talvez.

Ou talvez metade do workload esteja esperando recursos.

Portanto:

CPU HIGH ≠ automaticamente ruim

CPU LOW ≠ automaticamente bom

Um gráfico é uma pista.

Não é uma sentença.


🕵️ 11. War Room Mainframe sob a batuta de Harry Caul

Agora apagamos as luzes.

Colocamos JOB D no centro da tela.

Pergunta número um:

Por que exatamente são 42 minutos?

Não:

Quanto CPU ele usa?

Ainda não.

Primeiro:

42 MINUTOS
    |
    +-- CPU?
    |
    +-- I/O?
    |
    +-- ENQ?
    |
    +-- Db2 lock?
    |
    +-- VSAM?
    |
    +-- Queue?
    |
    +-- Scheduler?
    |
    +-- Dependency?
    |
    +-- Application serialization?

Então começamos a correlacionar evidências.

Esse é o ponto em que capacity planning deixa de ser comparação de catálogo e começa a se aproximar de investigação.


🔄 12. Harry Caul volta a fita

Encontramos o gargalo.

PATH A:

81 minutos

PATH B:

75 minutos

Otimizamos PATH A:

81 → 70

Excelente!

Acabou?

Não.

Agora temos:

PATH A = 70
PATH B = 75

PATH B tornou-se o novo critical path.

O gargalo mudou de endereço.

Esse comportamento ensina uma das coisas mais importantes sobre performance:

MEASURE
   ↓
ANALYZE
   ↓
FIND CRITICAL PATH
   ↓
OPTIMIZE
   ↓
MEASURE AGAIN
   ↓
RECALCULATE
   ↺

Harry Caul volta a gravação porque uma segunda audição pode revelar algo que a primeira interpretação escondeu.

Nós fazemos a mesma coisa.

Depois de modificar o workload, medimos novamente.


💰 13. Performance também conversa com dinheiro

Existe outro microfone naquela sala.

Custo.

Sizing não deveria ser simplesmente:

Qual máquina é mais rápida?

Precisamos equilibrar:

PERFORMANCE
     +
CAPACITY
     +
SLA
     +
SOFTWARE COST
     +
OPERATIONAL RISK
     +
GROWTH

Porque uma solução tecnicamente elegante pode não ser economicamente interessante.

Da mesma maneira, economizar dinheiro sacrificando um SLA crítico pode custar muito mais ao negócio.

Sizing é um problema de engenharia.

Mas também é um problema de negócio.


🎯 14. Antes do zBNA existe uma pergunta zero

Eu acrescentaria uma etapa antes de qualquer análise:

Qual é o SLA?

Imagine que o fechamento termina às 04:30.

Caso A:

SLA = 06:00
Fim = 04:30

Temos determinada situação.

Caso B:

SLA = 03:00
Fim = 04:30

Agora temos um incidente.

Os mesmos JOBs.

A mesma CPU.

O mesmo hardware.

O mesmo elapsed.

Contextos de negócio completamente diferentes.

Performance sem objetivo é apenas uma coleção muito bonita de gráficos.


🧠 15. As seis perguntas de Harry Caul

Se eu estivesse ensinando isso para um programador COBOL iniciante, colocaria seis perguntas ao lado do terminal:

1. Quando o negócio precisa terminar?

SLA.

2. O que precisa acontecer para ele terminar?

Batch Network.

3. Qual sequência determina esse horário?

Critical Path.

4. Por que os componentes críticos estão demorando?

CPU, I/O, locks, ENQ, Db2, VSAM, scheduling, dependências.

5. O workload consegue utilizar capacidade adicional?

Usable Parallelism.

6. Qual alteração entrega maior benefício considerando custo e risco?

Sizing.

Somente então colocamos os candidatos a processador sobre a mesa.


☕ 16. A tradução para quem está começando no COBOL

Você escreveu:

PERFORM PROCESSO-A
PERFORM PROCESSO-B
PERFORM PROCESSO-C
PERFORM PROCESSO-D

Alguém aparece oferecendo um computador duas vezes mais rápido.

Parece razoável imaginar:

2 × PERFORMANCE
       =
1/2 ELAPSED TIME

Mas descobrimos:

PROCESSO-A → CPU

PROCESSO-B → espera arquivo

PROCESSO-C → espera outro JOB

PROCESSO-D → espera lock Db2

Ops.

Nosso computador duas vezes mais rápido não pode acelerar magicamente aquilo que não está usando processador.

Quando ampliamos isso para centenas ou milhares de JOBs, datasets, bancos, schedulers, dependências e recursos compartilhados, começamos a compreender por que precisamos enxergar o workload como sistema.

É aí que o zBNA se torna particularmente interessante.


🥚 Easter Egg — 03:17

O processamento deveria terminar às 03:00.

Harry está sentado no fundo da War Room.

03:00

Nada.

03:05

Nada.

03:11

Os gerentes começam a olhar para o dashboard.

03:16

Alguém diz:

— Precisamos de mais CPU.

Harry coloca os fones.

03:17

Ele volta alguns minutos da gravação operacional.

Na tela:

JOB D
STATUS: WAIT

CPU?

AVAILABLE

Ele continua seguindo a cadeia.

Predecessor.

Dataset.

ENQ.

Wait.

Silêncio.

Harry tira lentamente os fones.

Não faltava processador.

Faltava ouvir a conversa inteira.


🏁 Conclusão — o mainframe também deixa pistas

O ensinamento mais importante do zBNA não é simplesmente aprender a utilizar outra ferramenta.

É aprender a fazer uma pergunta melhor.

Um problema de performance não significa automaticamente:

NEED MORE CAPACITY

A janela batch é resultado de uma combinação muito mais interessante:

BATCH WINDOW
     =
CPU
+
DEPENDENCIES
+
SERIALIZATION
+
PARALLELISM
+
I/O
+
CONTENTION
+
SCHEDULING
+
RESOURCE AVAILABILITY
+
APPLICATION BEHAVIOR

O processador está dentro dessa equação.

Às vezes ele será justamente o gargalo e aumentar capacidade será a decisão correta.

Mas precisamos demonstrar isso.

Harry Caul não condenaria alguém porque uma palavra pareceu suspeita na primeira reprodução.

Ele limparia o ruído.

Voltaria a fita.

Compararia os sinais.

Procuraria o contexto.

No capacity planning deveríamos ter a mesma disciplina.

Antes de perguntar:

“Qual IBM Z devemos comprar?”

pergunte:

“Quem está segurando o batch?”

Depois encontre o critical path.

Descubra quanto do elapsed realmente depende de CPU.

Investigue I/O, locks, datasets, scheduler, JES2, WLM, Db2, VSAM, ENQ e dependências.

Descubra quanto paralelismo é realmente utilizável.

Meça.

Simule.

Altere.

Meça novamente.

E somente depois faça sizing.

Porque existe uma diferença enorme entre possuir uma gravação e compreender a conversa.

Da mesma maneira, existe uma diferença enorme entre possuir métricas e compreender o workload.

🎧 Não faça sizing do mainframe antes de fazer sizing do problema.

O processador pode fornecer a potência.

Mas é o critical path que possui o relógio.

E, às 03:17, quando todos estiverem olhando para a CPU, talvez o verdadeiro gargalo esteja silenciosamente esperando em algum lugar da conversação.

terça-feira, 10 de setembro de 2024

🕸️ zBNA — Antes de Comprar Mais Mainframe, Descubra Quem Está Segurando o Batch

 

Bellacosa Mainframa apresenta o zBNA

☕ Um Café no Bellacosa Mainframe

🕸️ zBNA — Antes de Comprar Mais Mainframe, Descubra Quem Está Segurando o Batch

Quando o processamento termina tarde, a primeira pergunta quase nunca deveria ser “quanto de CPU falta?”. A pergunta correta é: “o que, exatamente, está impedindo o batch de terminar antes?”

Existe uma cena clássica em qualquer ambiente corporativo grande.

O processamento noturno atrasou.

O fechamento avançou além da janela esperada.

Algum relatório não ficou pronto.

Uma cadeia de arquivos terminou tarde.

O usuário de negócio começa a reclamar.

Então alguém abre os gráficos.

CPU alta.

Picos.

Jobs longos.

E logo surge a frase inevitável:

“Talvez seja hora de aumentar a máquina.”

Às vezes é.

Mas às vezes essa frase é o equivalente mainframe de olhar para um carro preso no trânsito e concluir:

“Precisamos de um motor maior.”

O motor pode até ser excelente.

O problema é que o carro continua parado atrás dos outros.

É justamente nesse ponto que entra uma ferramenta muito interessante do ecossistema IBM Z:


zBNA — IBM Z Batch Network Analyzer

E o nome já entrega boa parte da filosofia.

Ele não fala apenas em CPU.

Não fala apenas em capacidade.

Não fala apenas em jobs.

Ele fala em:

Batch Network.

Ou seja:

uma rede de processamento.

E essa mudança de visão é profunda.



🧠 1. Para começar: o que é um batch?

Para quem está entrando agora no mundo COBOL, JCL e z/OS, vamos estabelecer uma base.

Um processamento batch é aquele executado normalmente sem interação contínua de um usuário.

Você prepara:

Entrada
   ↓
Processamento
   ↓
Saída

No mainframe, isso muitas vezes aparece na forma de JOBs submetidos ao JES.

Um exemplo extremamente simples:

//BELLJOB JOB ...
//STEP01   EXEC PGM=PROG001
//INFILE   DD DSN=EMPRESA.ENTRADA,DISP=SHR
//OUTFILE  DD DSN=EMPRESA.SAIDA,DISP=...

Esse JOB poderia:

  • ler um arquivo;

  • processar registros;

  • aplicar regras;

  • gravar resultados.

Agora imagine isso multiplicado por:

10 JOBs
100 JOBs
1.000 JOBs
10.000 JOBs

E, pior:

eles não são independentes.

Um depende do outro.

Outro precisa esperar um arquivo.

Outro só pode começar depois da conclusão do predecessor.

Outro executa em paralelo.

Outro trava acesso a um dataset.

Outro espera Db2.

Outro aguarda scheduler.

De repente o batch deixa de ser uma fila.

Ele vira uma rede.


🕸️ 2. A palavra mais importante do zBNA é NETWORK

Vamos imaginar:

              JOB B
             /     \
JOB A ------         ------ JOB D ------ JOB E
             \     /
              JOB C

Isso já nos diz muito mais do que uma lista:

JOB A
JOB B
JOB C
JOB D
JOB E

No desenho existe informação.

Sabemos que:

  • JOB A acontece antes;

  • JOB B e JOB C podem trabalhar em paralelo;

  • JOB D espera ambos;

  • JOB E vem depois.

É isso que transforma um batch em uma rede de dependências.

E aqui começa a mágica.

Porque, se B demora 18 minutos e C demora 7, o sistema não espera:

18 + 7

Ele espera o mais lento dos dois, assumindo que realmente correm em paralelo.

Então temos:

MAX(18,7)
=
18

E isso muda completamente como calculamos o tempo total.


⏱️ 3. O tal do critical path

Essa expressão aparece o tempo inteiro quando falamos de zBNA.

Critical path, ou caminho crítico, é a cadeia de atividades cuja duração determina o término de todo o processo.

Vamos usar o exemplo:

JOB A = 12 min

JOB B = 18 min
JOB C = 7 min

JOB D = 42 min

JOB E = 9 min

Rede:

                    JOB B (18)
                  /            \
JOB A (12) ------                ------ JOB D (42) ------ JOB E (9)
                  \            /
                    JOB C (7)

O caminho por B é:

12 + 18 + 42 + 9
=
81 minutos

O caminho por C é:

12 + 7 + 42 + 9
=
70 minutos

Portanto:

A → B → D → E

é o caminho crítico.

Agora observe uma coisa maravilhosa.

Se alguém otimizar JOB C:

7 → 2 minutos

o batch inteiro talvez continue terminando em:

81 minutos

Ou seja:

o programa ficou mais rápido.

O negócio não percebeu.


💡 4. Esse é um dos maiores erros em performance

Programadores e analistas gostam de procurar:

“Qual programa está mais lento?”

Mas esta nem sempre é a pergunta certa.

Pode existir um programa que demora 30 minutos e ainda assim não influencia o horário final.

Exemplo:

                        JOB X = 30 min
                       /
                 -----+
                /
JOB A ---------+
                \
                 ----- JOB Y = 40 min

Se Y for o ramo determinante:

30 → 20

no X não muda o fim.

Mas:

40 → 35

no Y pode economizar cinco minutos reais.

Logo:

O JOB mais lento não é necessariamente o JOB mais importante.

Isso é puro pensamento de sistema.


🚨 5. E então aparece o gargalo serial

No gráfico que analisamos antes havia um personagem perigosíssimo:

JOB D — SERIAL BOTTLENECK
42 min

Esse tipo de etapa merece suspeita imediata.

Porque tudo converge para ela.

JOB B ───┐
         ├── JOB D ─── JOB E
JOB C ───┘

Se D não consegue ganhar muito com paralelismo, adicionar engines pode trazer pouco benefício.

E aqui chegamos a uma ideia fundamental.

Mais capacidade agregada não é o mesmo que mais velocidade para uma etapa serial.


⚙️ 6. Aggregate capacity vs per-engine performance

Imagine duas configurações hipotéticas.

Sistema A

10 engines
cada um = velocidade 100

Capacidade agregada aproximada:

1.000 unidades

Sistema B

5 engines
cada um = velocidade 200

Capacidade agregada também:

1.000 unidades

À primeira vista:

“São equivalentes.”

Talvez.

Mas imagine um workload altamente serial.

Ele usa praticamente um engine por vez.

Nesse cenário, o Sistema B poderia se comportar de forma muito diferente porque cada engine individual é mais rápido.

Agora inverta.

Imagine uma carga altamente paralela:

JOB1
JOB2
JOB3
JOB4
JOB5
JOB6
JOB7
JOB8

Nesse caso, o número de engines pode ser importantíssimo.

Moral:

capacidade total não conta a história completa.

E é justamente por isso que o sizing precisa conhecer o workload.


🧵 7. Usable parallelism

Essa expressão merece ser guardada.

Você pode comprar:

8 engines

Mas o batch talvez só consiga utilizar de forma útil:

2

porque:

  • existem dependências;

  • datasets ficam serializados;

  • programas são monothread;

  • jobs aguardam predecessor;

  • há contenção;

  • existem restrições de scheduler;

  • faltam initiators;

  • algum recurso compartilhado vira gargalo.

Logo:

engines disponíveis
≠
engines aproveitáveis

O que importa é:

usable parallelism

Ou seja:

quanto paralelismo o workload consegue realmente explorar.


🚂 8. Pense como uma ferrovia

Vamos usar uma analogia perfeita para mainframe.

Temos uma ferrovia transportando toneladas de carga.

Você pode melhorar o sistema adicionando:

  • locomotivas;

  • vagões;

  • linhas paralelas;

  • sinalização melhor;

  • estações;

  • trilhos mais rápidos.

Mas imagine que existe este trecho:

======\ 
       ====================
======/

Tudo precisa passar numa única linha.

Agora você compra dez locomotivas novas.

Resultado:

🚂
🚂
🚂
🚂
🚂
   ↓
single track

Parabéns.

Você aumentou a capacidade potencial.

E criou uma fila mais bonita.

No batch, isso pode acontecer com:

dataset
lock
Db2
scheduler
ENQ
program serial

🔎 9. É aqui que o zBNA entra de verdade

O zBNA ajuda a transformar dados coletados do ambiente em uma visão analisável do batch.

Em termos conceituais:

z/OS
  ↓
SMF
  ↓
extração
  ↓
zBNA
  ↓
visualização
  ↓
análise
  ↓
what-if

Ou seja:

o ambiente já deixou rastros.

O sistema registrou acontecimentos.

A ferramenta ajuda a reorganizar isso de modo que o analista consiga enxergar:

  • tempo;

  • jobs;

  • steps;

  • relacionamento;

  • consumo;

  • concorrência;

  • dependências.

É uma espécie de arqueologia operacional.


🧬 10. SMF: a caixa-preta do z/OS

Para o iniciante, SMF pode parecer quase mágico.

SMF significa:

System Management Facilities

O z/OS registra grande quantidade de informações operacionais em registros SMF.

Dependendo do tipo de record, podemos encontrar dados ligados a:

  • jobs;

  • steps;

  • CPU;

  • datasets;

  • sort;

  • recursos;

  • subsistemas;

  • dispositivos;

  • desempenho.

Imagine o SMF como uma enorme caixa-preta.

O avião voou.

Depois analisamos:

altitude
velocidade
motor
temperatura
pressão
eventos

No mainframe:

job
step
CPU
elapsed
I/O
dataset
resource

E daí reconstruímos o que aconteceu.


🧰 11. CP3KEXTR — preparando os dados

O fluxo típico de análise inclui o utilitário de extração que prepara os dados usados pelo zBNA.

Conceitualmente:

SMF
 ↓
CP3KEXTR
 ↓
arquivos extraídos
 ↓
zBNA

Não é o zBNA simplesmente “entrando no mainframe e olhando tudo ao vivo”.

Existe uma etapa de coleta e preparação.

Isso também é importante porque transforma o trabalho numa análise reproduzível.

Podemos dizer:

“Vamos analisar esta janela.”

Por exemplo:

22:00 → 06:00

do fechamento de um dia representativo.


📅 12. Representatividade da janela

E aqui surge um detalhe perigosíssimo.

Imagine que coletamos uma terça-feira calma:

terça
02:00–03:00

Depois usamos aquilo para planejar:

Black Friday
fechamento mensal
fim de ano
pico fiscal

Podemos produzir gráficos maravilhosos.

E uma conclusão completamente errada.

É o velho:

GARBAGE IN
   ↓
GARBAGE OUT

Só que numa versão elegante:

GARBAGE IN
   ↓
beautiful charts
   ↓
PowerPoint
   ↓
expensive decision

😁

Portanto:

qual período estamos analisando?

é tão importante quanto:

qual ferramenta estamos usando?


📊 13. Gantt Chart: quando o tempo finalmente aparece

Um gráfico temporal costuma revelar padrões imediatamente.

Imagine:

TIME → 23:00   00:00   01:00   02:00   03:00

JOB A █████
JOB B      █████████
JOB C      ████
JOB D              ███████████████
JOB E                             █████

Uma tabela poderia ter:

JOB A  11 min
JOB B  22 min
JOB C   9 min
JOB D  47 min
JOB E  13 min

Mas o gráfico revela relações.

Você consegue enxergar:

  • concorrência;

  • buracos;

  • esperas;

  • sobreposição;

  • sequenciamento.

O cérebro humano é excelente em detectar padrão visual.

Por isso esse tipo de visualização é tão poderoso.


🔬 14. Top Programs

Agora trocamos a pergunta.

Antes:

quando?

Agora:

quem?

Quais programas aparecem como consumidores relevantes?

Imagine:

PROG     CPU

ACCT001  █████████████
SORT     ██████████
PAY021   ███████
REP311   ████

Isso pode direcionar uma segunda investigação.

zBNA aponta:

“Olhe aqui.”

Então entram outras ferramentas:

  • Application Performance Analyzer;

  • profiling;

  • análise COBOL;

  • Db2 EXPLAIN;

  • SMF;

  • RMF;

  • traces.

Ferramenta boa não precisa responder tudo.

Ela precisa responder muito bem à pergunta certa.


☕ 15. Um programador COBOL encontra o zBNA

Imagine que você escreveu:

       PERFORM PROCESSA-CLIENTE
          UNTIL WS-FIM = 'S'.

E alguém lhe diz:

“Seu programa é um dos grandes consumidores.”

Não entre em pânico.

A investigação ainda está começando.

Precisamos descobrir:

CPU?
I/O?
Db2?
VSAM?
SORT?
Loop?
Algoritmo?
Serialização?

Talvez seu código execute milhões de vezes uma busca ruim.

Talvez faça:

READ
READ
READ
READ
READ

quando poderia reorganizar acesso.

Talvez o SQL esteja caro.

Talvez esteja lendo volume enorme sem necessidade.

Talvez nem seja culpa do programa.

Pode estar esperando recurso externo.


⏳ 16. Elapsed time não é CPU time

Isso é obrigatório para qualquer iniciante.

Imagine:

ELAPSED = 40 min
CPU     =  8 min

Então existem aproximadamente:

32 min

em outras atividades e esperas.

Não significa necessariamente 32 minutos parados, porque há detalhes de medição, concorrência e subsistemas.

Mas a ideia continua válida:

tempo total não é simplesmente CPU.

Se você dobrasse magicamente a velocidade da CPU e reduzisse:

8 → 4

o total não cairia automaticamente:

40 → 20

Poderia ficar algo próximo de:

36

dependendo do restante.

Esse pequeno exemplo destrói muita análise simplista.


💾 17. O fantasma do I/O

COBOL nasceu num mundo intensamente orientado a dados.

Arquivos.

Registros.

Leitura.

Gravação.

Ordenação.

Até hoje isso permanece central.

Imagine:

       READ ARQ-CLIENTES
           AT END
              MOVE 'S' TO WS-FIM
       END-READ.

Se temos:

150 milhões de registros

o comportamento de I/O pode ser tão ou mais importante que CPU.

Portanto:

“CPU nova resolverá?”

depende.

Talvez o JOB passe boa parte do tempo aguardando operações de armazenamento.

Mais CPU não transforma magicamente o storage.


🔐 18. Locks e contenção

Agora imagine Db2.

Dois processos querem trabalhar com o mesmo recurso.

JOB A → LOCK
             ↓
JOB B → WAIT

JOB B pode aparecer demorando muito.

Mas ele não está “pensando lentamente”.

Está esperando.

Comprar CPU:

mais CPU

não remove automaticamente:

LOCK

Precisamos analisar:

  • transação;

  • concorrência;

  • commit;

  • acesso;

  • sequência;

  • design.

De novo:

workload behavior.


🚦 19. Scheduling

Outro suspeito.

Imagine:

JOB READY = 01:00

START     = 01:17

Depois:

RUN = 5 min

Ele termina:

01:22

Alguém vê:

22 min

e reclama.

Mas:

17 min

foram antes da execução.

Talvez scheduler.

Talvez initiator.

Talvez predecessor.

Talvez recursos.

Talvez classe.

Talvez política.

Se otimizarmos o programa em 50%:

5 → 2,5 min

o total vira:

19,5 min

Ainda ruim.

O grande problema estava fora do código.


🧱 20. Initiators

No JES, initiators desempenham papel importantíssimo na execução batch.

Simplificando:

um JOB elegível precisa encontrar condição para executar.

Imagine:

10 JOBs prontos
2 initiators

Nem todos começam juntos.

Agora:

10 JOBs prontos
10 initiators

Pode haver mais paralelismo.

Mas cuidado.

Mais initiators também podem produzir:

mais concorrência
        ↓
mais I/O
        ↓
mais locks
        ↓
mais CPU
        ↓
mais contenção

Então até a solução aparente cria outra pergunta.

Esse é o mainframe:

tudo está conectado.


🧠 21. WLM entra na história

O Workload Manager é outro componente essencial.

WLM trabalha com objetivos e importância dos workloads.

Ele ajuda o z/OS a decidir como distribuir recursos.

Se um workload crítico não está recebendo o tratamento esperado, precisamos investigar.

Não significa que zBNA substitui WLM.

Ao contrário.

Pense assim:

zBNA
  ↓
mostra comportamento batch

WLM
  ↓
gerencia recursos conforme políticas

RMF
  ↓
mostra comportamento do sistema

Cada um observa o elefante por um lado.


🔥 22. RMF + zBNA

Uma combinação forte.

Suponha que zBNA mostra:

02:15–02:45
critical path

Agora abrimos RMF e perguntamos:

“O que o sistema estava fazendo exatamente nesse período?”

Podemos correlacionar:

  • CPU;

  • DASD;

  • channels;

  • memory;

  • service classes;

  • LPAR behavior.

Então:

zBNA
“onde olhar”

e:

RMF
“o que acontecia no sistema”

Essa correlação é muito mais poderosa do que cada relatório isolado.


🧪 23. What-if — o laboratório sem quebrar produção

Uma das ideias mais fascinantes do zBNA é permitir estudos do tipo:

“E se?”

Exemplo:

CURRENT PROCESSOR
      ↓
workload atual

Agora:

Scenario A
Scenario B
Scenario C

Podemos investigar configurações alternativas.

Isso é ouro.

Porque o erro clássico é pensar:

machine B = 20% faster

portanto:

batch = 20% faster

Não necessariamente.

Porque:

  • CPU não é tudo;

  • serialização existe;

  • I/O existe;

  • wait existe;

  • paralelismo é limitado;

  • dependências existem.


🧮 24. Lei de Amdahl sem matemática assustadora

A ideia é simples.

Imagine um JOB:

50% paralelizável
50% serial

Você melhora infinitamente a parte paralela.

O máximo teórico fica limitado pelo pedaço serial.

Porque ele nunca desaparece.

Traduzindo para café:

Imagine preparar o café da manhã.

Você pode simultaneamente:

fritar ovo
passar café
cortar pão

Mas só pode servir depois que:

CAFÉ TERMINAR

Se o café demora 10 minutos, não adianta contratar dez pessoas para cortar pão.

O gargalo continua sendo o café.


📈 25. Quando CPU realmente é o gargalo

Importante: não vamos cair no extremo oposto.

Às vezes falta CPU.

E ponto.

Imagine:

CPs saturados
queues
WLM pressure
CPU-bound workloads
critical jobs disputando resource

Nesse caso, mais capacidade pode ser exatamente o necessário.

O valor do zBNA não está em provar que hardware é inútil.

Está em responder:

quando o hardware realmente resolverá.

Essa distinção vale milhões.


💰 26. Porque sizing é decisão econômica

Comprar mainframe não é escolher um videogame.

Existe:

  • hardware;

  • software;

  • licenciamento;

  • capacidade;

  • crescimento;

  • suporte;

  • energia;

  • risco;

  • implementação.

E software no IBM Z pode estar relacionado ao consumo e à configuração de formas complexas.

Então capacity planning também é economia.

Imagine:

Opção A
hardware menor
mais otimização

Opção B
hardware maior
menos alteração

Opção C
hardware intermediário
+ scheduling
+ tuning

Talvez C seja melhor.

Não porque seja tecnicamente mais poderosa.

Mas porque equilibra:

performance
cost
risk
SLA

🔐 27. Criptografia também pode entrar na conversa

Hoje segurança adiciona outra dimensão.

Imagine habilitar encryption de datasets.

Excelente para segurança.

Mas também precisamos entender impacto operacional.

Perguntas:

quanto CPU?
qual workload?
qual janela?
qual dataset?
qual impacto no batch?

Essa abordagem é madura.

Não:

“Encryption é cara.”

Nem:

“Encryption não custa nada.”

Mas:

“Vamos medir e modelar este workload.”


🗜️ 28. Compressão

Mesma coisa.

Compressão pode reduzir:

I/O
storage
transfer

mas pode exigir processamento.

É um balanço.

Se temos um workload I/O-bound, compressão pode ser extremamente interessante.

Se temos CPU pressure enorme, precisamos analisar.

Again:

workload decides.


🧹 29. Sort: o gigante escondido

Em muitos ambientes batch, SORT aparece por toda parte.

Exemplo:

//SORTSTEP EXEC PGM=SORT

Parece banal.

Mas ordenações gigantes podem consumir recursos importantes.

Imagine:

500 milhões registros

Sort pode envolver:

  • CPU;

  • memória;

  • work datasets;

  • I/O;

  • temporary storage.

Tecnologias e implementações mais modernas podem mudar bastante o comportamento.

Por isso identificação de candidatos importa.


🔍 30. Top Program não significa Guilty Program

Esse é outro princípio Bellacosa War Room.

Imagine lista:

1. PROG001
2. SORT
3. DB2
4. PROG999

O primeiro não é automaticamente culpado.

Pode ser:

  • um grande consumidor legítimo;

  • volume necessário;

  • trabalho útil;

  • parte não crítica;

  • workload bem otimizado.

Sempre pergunte:

consume muito por quê?

A diferença entre engenharia e caça às bruxas está nessa pergunta.


🧩 31. Critical path pode mudar

Agora entra uma curiosidade deliciosa.

Hoje:

PATH A = 90 min
PATH B = 82 min

A é crítico.

Otimizamos:

PATH A = 75 min
PATH B = 82 min

Agora B é crítico.

Ou seja:

o gargalo mudou de endereço.

Performance é assim.

Você remove uma pedra.

Descobre outra embaixo.

Por isso:

measure
analyze
optimize
measure again

Nunca:

optimize
declare victory
go home

🕵️ 32. War Room às 03:17

Agora nosso easter egg.

São:

03:17

O processamento deveria ter terminado às:

03:00

Telefone toca.

Operações entra na ponte.

Aplicação entra na ponte.

Banco entra na ponte.

Storage entra na ponte.

Infra entra na ponte.

Começa:

“CPU está alta.”

Outro diz:

“Db2 está normal.”

Outro:

“Storage não vê nada.”

Outro:

“O job está rodando.”

Bellacosa olha para a cadeia:

JOB A
 ↓
JOB B
 ↓
JOB C
 ↓
JOB D

Pergunta:

“Quando D começou?”

Resposta:

03:09

Pergunta:

“Quando deveria?”

Resposta:

02:41

Aí vem a pergunta importante:

“Por que começou 28 minutos tarde?”

Silêncio.

Agora a investigação mudou.

Não estamos mais perguntando:

“Por que D está lento?”

Estamos perguntando:

“Por que D começou tarde?”

Esse detalhe pode economizar horas de War Room.


🔎 33. Performance é detetive, não adivinhação

Um bom analista não chega dizendo:

“É CPU.”

Ele chega perguntando.

Pergunta 1

Qual é o SLA?

Pergunta 2

Qual é o caminho crítico?

Pergunta 3

Onde o atraso nasceu?

Pergunta 4

É CPU ou elapsed?

Pergunta 5

Existe wait?

Pergunta 6

Existe contenção?

Pergunta 7

Existe predecessor?

Pergunta 8

Existe paralelismo utilizável?

Pergunta 9

Uma máquina diferente mudaria aquilo?

Isso é engenharia.


🎯 34. SLA vem antes da tecnologia

Antes de zBNA, CPU, engine, WLM ou SMF, existe uma coisa:

o negócio.

Exemplo:

Batch termina 04:00
SLA = 06:00

Talvez tudo esteja maravilhoso.

Outro:

Batch termina 04:00
SLA = 03:30

Temos um problema.

Mesma máquina.

Mesmo tempo.

Situação completamente diferente.

Então capacity planning começa perguntando:

“Precisamos terminar quando?”

Não:

“Quanto CPU temos?”


📐 35. Right-sizing

Essa expressão é muito melhor do que:

bigger machine

Right-sizing significa:

configuração adequada.

Talvez seja maior.

Talvez tenha engines mais rápidos.

Talvez mais engines.

Talvez mudança de software.

Talvez combinação.

Talvez nenhum hardware novo.

É encontrar equilíbrio.

Performance
   +
Cost
   +
Growth
   +
Risk
   +
SLA

🧠 36. O programador COBOL deveria aprender isso?

Sim.

Mesmo se nunca operar zBNA.

Porque isso muda a forma de programar.

Você começa a pensar:

meu programa existe numa rede.

Ele não está sozinho.

Seu programa pode:

  • produzir arquivo;

  • alimentar outro job;

  • travar dataset;

  • consumir Db2;

  • segurar predecessor;

  • estar no critical path.

Esse entendimento transforma o programador.

Ele deixa de pensar:

“Meu programa terminou.”

E começa a pensar:

“Qual impacto meu programa tem no fluxo inteiro?”

Isso é sair de developer para system thinker.


🏛️ 37. Mainframe é uma cidade

Uma analogia final.

Imagine o mainframe como uma cidade.

CPU são as avenidas.

DASD são depósitos.

Db2 são bibliotecas.

JES é estação de transporte.

Scheduler é controle de tráfego.

WLM é prefeitura.

Jobs são caminhões.

Datasets são carga.

Agora imagine milhares de caminhões.

Você olha congestionamento e diz:

“Vamos construir uma avenida maior.”

Pode resolver.

Mas talvez o problema seja:

ponte interditada
alfândega lenta
semáforo quebrado
depósito fechado

O zBNA ajuda justamente a enxergar o mapa do tráfego.

Não apenas o tamanho da avenida.


🧩 38. O que eu considero mais poderoso no zBNA

Não são os gráficos.

Não é nem o what-if.

É a mudança de pergunta.

Antes:

“Precisamos de mais capacidade?”

Depois:

“Que característica deste workload está determinando nosso tempo?”

Essa é uma pergunta muito mais rica.

Dela podem nascer respostas diferentes:

CPU
I/O
parallelism
scheduling
contention
application
hardware

E cada resposta pede tratamento diferente.


🚀 39. Um método Bellacosa Mainframe para zBNA

Eu resumiria numa sequência prática.

1. Defina o SLA

Qual processo precisa terminar quando?

2. Escolha uma janela representativa

Não escolha terça tranquila para modelar fechamento mensal.

3. Colete evidência

Use SMF adequado.

4. Monte a rede

Observe jobs, steps e dependências.

5. Encontre o critical path

Quem segura o relógio?

6. Classifique o atraso

CPU?

I/O?

Wait?

Schedule?

Contention?

7. Verifique paralelismo

Quanto a aplicação realmente consegue usar?

8. Faça what-if

O que muda com processor/configuration diferente?

9. Considere custo

Hardware e software.

10. Valide

Nenhum modelo substitui produção.


🥚 40. Easter egg para quem chegou até aqui

Olhe novamente:

03:17

Se você viu esse horário e lembrou da War Room, parabéns.

Você encontrou o easter egg.

Mas a mensagem escondida é outra.

Na maioria dos incidentes longos, existe um momento em que alguém finalmente faz a pergunta correta.

Até aquele momento:

everyone has data

Depois:

someone has context

E essa talvez seja a verdadeira função de ferramentas como zBNA:

transformar dado em contexto.


🏁 Conclusão

zBNA — IBM Z Batch Network Analyzer — é muito mais interessante quando deixamos de enxergá-lo como “uma ferramenta de sizing”.

Ele é uma ferramenta para compreender comportamento.

E compreender comportamento vem antes de dimensionar infraestrutura.

O raciocínio completo é:

business process
      ↓
batch window
      ↓
job network
      ↓
critical path
      ↓
resource behavior
      ↓
parallelism
      ↓
what-if
      ↓
processor sizing
      ↓
business decision

Isso muda a ordem da conversa.

A discussão deixa de começar por:

“Qual máquina comprar?”

e passa a começar por:

“O que realmente está determinando o tempo do nosso processamento?”

Às vezes a resposta será:

CPU.

Às vezes:

I/O.

Às vezes:

scheduler.

Às vezes:

dataset.

Às vezes:

Db2.

Às vezes:

um programa COBOL escrito há vinte anos que está fazendo exatamente aquilo que mandaram ele fazer.

E essa é a beleza.

O mainframe não é uma caixa preta.

Ele deixa rastros.

O bom analista aprende a lê-los.

Então, da próxima vez que alguém disser:

“Precisamos de um mainframe maior.”

talvez valha responder:

“Antes de aumentar o mainframe, vamos descobrir quem está segurando o relógio.”

Porque performance não começa no catálogo do processador.

Começa no workload.

E o workload sempre tem uma história para contar.

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...