Operação e Concorrência de Crons¶
Esta norma documenta a operação do orquestrador de coletas infra/cron_fetch.sh na estação fedora (Linux local, 32 GB RAM, 8 vCPUs), os pools de recursos concorrentes, proteção contra exaustão de disco e emissão de telemetria.
1. Topologia e Arquitetura¶
O subsistema de coleta do ecossistema Quantilica opera na estação de coleta fedora, mantendo os dados brutos temporários em $DATA_DIR (~/data) antes da replicação para o Data Lake e custódia fria.
flowchart TD
subgraph CRON ["Orquestrador cron_fetch.sh"]
SCHED["Grade 24h Descentralizada"] --> POOL["Semáforo por Pool (/tmp/quantilica_locks/)"]
POOL --> BP["Backpressure de Disco"]
BP --> EXEC["Execução do Fetcher"]
EXEC --> TEL["Telemetria Estruturada (workers telemetry)"]
end
subgraph POOLS ["Pools de Recursos"]
H["heavy-io (3 slots)"]
C["cpu-analysis (2 slots)"]
L["network-light (6 slots)"]
end
POOL -.-> H & C & L
2. Catálogo de Pools de Concorrência¶
Em substituição à antiga fila serial única (quantilica_cron_heavy.lock), os 25 fetchers do ecossistema são categorizados em três pools de concorrência baseados em semáforos no sistema de arquivos (/tmp/quantilica_locks/<pool>/slot_<N>.lock via flock):
| Pool | Slots | Teto Teórico de RAM | Perfil de Consumo | Fontes Alocadas |
|---|---|---|---|---|
heavy-io |
3 slots | 12,0 GB | Microdados e acervos volumosos, downloads > 100 MB | comex, anac, tse, rfb-cnpj, pdet, datasus, td, tesouro-direto, inmet, anp, b3, pgfn, ons, capes, transparencia-sp, antt |
cpu-analysis |
2 slots | 12,0 GB | Parsing complexo, decompress in-stream, centenas de sub-arquivos | cvm, inep, bcb-microdados |
network-light |
6 slots | 3,0 GB | APIs REST, JSON leve, séries curtas | rtn, bcb-sgs, sidra, loterias, ipeadata, infosiga, sigtap |
A margem permanente de 5,0 GB é estritamente preservada para o sistema operacional Linux, page cache e o PostgreSQL de ingestão.
3. Variáveis de Ambiente¶
As seguintes variáveis configuram o comportamento do script infra/cron_fetch.sh:
| Variável | Padrão | Descrição |
|---|---|---|
CRON_USE_POOLS |
false |
Ativa os pools de semáforos concorrentes (true/1). Se false, opera no modo de compatibilidade serial. |
CRON_POOL_HEAVY_IO_SLOTS |
3 |
Quantidade de slots paralelos no pool heavy-io. |
CRON_POOL_CPU_ANALYSIS_SLOTS |
2 |
Quantidade de slots paralelos no pool cpu-analysis. |
CRON_POOL_NETWORK_LIGHT_SLOTS |
6 |
Quantidade de slots paralelos no pool network-light. |
CRON_POOL_HEAVY_IO_TIMEOUT |
21600 |
Timeout em segundos (6h) aguardando liberação de slot heavy-io. |
CRON_DISK_WARN_GB |
25 |
Limite de espaço livre em GB para aviso de backpressure. |
CRON_DISK_PAUSE_GB |
10 |
Limite crítico em GB que suspende novos downloads até liberação de espaço. |
CRON_DISK_RESUME_GB |
35 |
Nível mínimo de espaço livre em GB para retomar tarefas pausadas. |
QUANTILICA_TELEMETRY_SPOOL |
~/.quantilica/telemetry_spool.db |
Caminho do banco SQLite de spool offline para telemetria. |
4. Backpressure de Disco¶
Durante downloads maciços em redes Gigabit, a velocidade de entrada pode superar a velocidade de upload e descarte efêmero. O cron_fetch.sh monitora o disco local:
- Espaço < 25 GB: emite log de advertência e cria a flag .backpressure em $DATA_DIR.
- Espaço < 10 GB: suspende ativamente a inicialização do fetcher em laço de espera de 15 segundos (até 1 hora), aguardando que o daemon ingest stream realize upload, valide integridade SHA-256 e remova arquivos locais para restaurar \(\ge 35\text{ GB}\) livres.
5. Telemetria e Observabilidade¶
O ciclo de vida de cada execução emite eventos estruturados via workers.cli telemetry emit:
- start: registra o início da execução com metadados do comando;
- heartbeat: atualiza o timestamp de atividade para tarefas longas;
- finish: registra encerramento com status (completed ou failed), código de saída e duração em segundos.
Spool Offline SQLite¶
Se o PostgreSQL estiver temporariamente inacessível, o módulo de telemetria enfileira os eventos no banco SQLite local (telemetry_spool.db, com fallback defensivo para /tmp/quantilica_telemetry_spool.db). Na execução seguinte com banco disponível ou com o argumento --flush, os registros são transferidos deterministicamente para core.task_run e core.task_run_log.
6. Solução de Problemas e Contingência¶
Como verificar slots em uso¶
ls -l /tmp/quantilica_locks/*/*.lock
fuser /tmp/quantilica_locks/heavy-io/slot_*.lock
Recuperação de lock órfão¶
O cron_fetch.sh verifica o estado do processo detentor (/proc/<PID>/status). Se o processo estiver ausente, em estado Z (zumbi) ou T (parado), o lock é recuperado automaticamente.
Para forçar a liberação manual de um slot preso:
# Identifica o processo travado
fuser /tmp/quantilica_locks/heavy-io/slot_0.lock
# Mata o processo e remove o arquivo de lock
kill -9 <PID>
rm -f /tmp/quantilica_locks/heavy-io/slot_0.lock