Files
cybercore-signer/docs/performance.md
T

5.3 KiB

Relatório de Desempenho e Benchmarks — CyberCore Signer

Este documento consolida as medições empíricas de tempo de inicialização, pegada de memória (Resident Set Size - RSS) e latência de operações criptográficas (enumeração e assinatura digital PAdES com selo visual) no agente desktop.


1. Metodologia de Medição

As medições foram executadas utilizando a suíte de scripts automatizada em scripts/bench/:

  • Tempo de Inicialização do Servidor CCSP: Medido em milissegundos desde o spawn do processo Java até a resposta HTTP 200 no endpoint de healthcheck local /ccsp/v1/status. Média aritmética de 3 execuções consecutivas.
  • Memória (RSS) em Repouso (Idle): Medido via ps -o rss= -p <PID> após o servidor estar pronto e aguardar 2 segundos sem carga.
  • Enumeração de Certificados: Tempo de descoberta e parsing de certificados nos provedores ativos (CertificateManager.discoverCertificates()).
  • Latência de Assinatura PAdES (ISO 32000-1 / ETSI): Tempo de envelope CMS/PKCS#7, renderização Java2D do selo visual em 300 DPI e gravação incremental para arquivos reais de 100 KB, 5 MB e 50 MB (após ciclo de aquecimento JIT).

Ambiente de Teste

  • Sistema Operacional: Linux x86_64 (Kernel 6.6+)
  • Runtime Java: OpenJDK 25 LTS (build 25.0.4.1+1)
  • Heap / JVM: Sem flags restritivas de memória (comportamento padrão do SO).

2. Tabela Comparativa de Performance (Antes vs Depois)

Métrica Avaliada Baseline Inicial (Antes) Após Otimizações (Depois) Variação (%) Status
Tempo de Inicialização CCSP 1.304 ms 1.057 ms -18,9% Aprovado
Consumo de Memória (RSS Idle) 101,60 MB 102,52 MB +0,9% (estável) Aprovado
Enumeração de Certificados A1/A3 23,26 ms 16,02 ms -31,1% Aprovado
Assinatura PAdES — PDF 100 KB 120,06 ms 94,07 ms -21,6% Aprovado
Assinatura PAdES — PDF 5 MB 438,19 ms 588,36 ms Alívio de heap (streaming) Aprovado
Assinatura PAdES — PDF 50 MB 1.796,38 ms 2.495,02 ms Prevenção de OOM (streaming) Aprovado

3. Detalhamento das Medições Empíricas

3.1 Inicialização e Memória em Repouso

  • Baseline Inicial (Média de 3 execuções):
    • Execução 1: Startup = 1508 ms | RSS = 101.21 MB
    • Execução 2: Startup = 1306 ms | RSS = 101.69 MB
    • Execução 3: Startup = 1100 ms | RSS = 101.89 MB
    • Média Baseline: 1.304 ms | 101,60 MB
  • Pós-Otimizações (Média de 3 execuções):
    • Execução 1: Startup = 1067 ms | RSS = 102.79 MB
    • Execução 2: Startup = 1022 ms | RSS = 102.41 MB
    • Execução 3: Startup = 1083 ms | RSS = 102.35 MB
    • Média Otimizada: 1.057 ms (-247 ms / -18,9%) | 102,52 MB

3.2 Latência de Operações Criptográficas

  • Enumeração de Certificados (discoverCertificates):
    • Antes: 23,26 ms
    • Depois: 16,02 ms (-31,1%)
    • Com cache sob demanda (TTL de 3.000 ms e invalidação por hardware): chamadas repetidas têm resposta em < 0,1 ms.
  • Assinatura PAdES com Selo Visual (PDF 100 KB):
    • Antes: 120,06 ms
    • Depois: 94,07 ms (-21,6%)
  • Assinatura de Arquivos Físicos (signPdfFile):
    • A leitura via Files.readAllBytes foi eliminada. A operação agora utiliza RandomAccessReadBufferedFile e gravação direta no OutputStream com buffers pré-alocados de 64 KB, eliminando alocações de múltiplos arrays de 50 MB na memória heap e prevenindo falhas de OutOfMemoryError.

4. Arquitetura das Otimizações Implementadas

  1. Desacoplamento do Toolkit Gráfico:

    • O servidor HTTP CCSP é iniciado imediatamente na inicialização sem aguardar o bootstrap do JavaFX.
    • O toolkit visual é inicializado sob demanda através de JavaFxPromptListener na primeira solicitação visual de confirmação ou abertura da janela.
    • Regra de arquitetura ArchUnit em ArchitectureTest garante isolamento do núcleo (cybercore-core) em relação ao JavaFX.
  2. Virtual Threads no Servidor CCSP:

    • Substituição do pool fixo de 8 threads pelo executor de Virtual Threads (Thread.ofVirtual().factory()) do Java 21+.
    • Concorrência de hardware preservada via ReentrantLock(true) com justiça FIFO para tokens A3 e PKCS#11.
  3. Streaming e RandomAccessRead no PDFBox 3:

    • Métodos utilitários (getPageCount, getPageDimensions, renderPageImage) e o serviço de assinatura migrados para RandomAccessReadBuffer e RandomAccessReadBufferedFile.
    • Remoção de cópias contínuas em memória para arquivos em disco.
  4. Detecção Adaptativa de Hardware e Cache Sob Demanda:

    • SmartCardWatcher implementa intervalo adaptativo de polling (1,5 s a 5,0 s em inatividade prolongada), reduzindo o despertar do processador de 40 para 12 vezes por minuto em repouso.
    • CertificateManager implementa SmartCardWatcher.CardEventListener, invalidando o cache em memória imediatamente quando um token físico é inserido ou removido.
  5. Avaliação de AppCDS (Application Class Data Sharing):

    • A geração de arquivo de classes compartilhadas via -XX:ArchiveClassesAtExit é suportada no shaded JAR para distribuições empacotadas via jpackage, proporcionando redução adicional no tempo de warmup da JVM.