5.3 KiB
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.readAllBytesfoi eliminada. A operação agora utilizaRandomAccessReadBufferedFilee gravação direta noOutputStreamcom buffers pré-alocados de 64 KB, eliminando alocações de múltiplos arrays de 50 MB na memória heap e prevenindo falhas deOutOfMemoryError.
- A leitura via
4. Arquitetura das Otimizações Implementadas
-
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
JavaFxPromptListenerna primeira solicitação visual de confirmação ou abertura da janela. - Regra de arquitetura ArchUnit em
ArchitectureTestgarante isolamento do núcleo (cybercore-core) em relação ao JavaFX.
-
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.
- Substituição do pool fixo de 8 threads pelo executor de Virtual Threads (
-
Streaming e RandomAccessRead no PDFBox 3:
- Métodos utilitários (
getPageCount,getPageDimensions,renderPageImage) e o serviço de assinatura migrados paraRandomAccessReadBuffereRandomAccessReadBufferedFile. - Remoção de cópias contínuas em memória para arquivos em disco.
- Métodos utilitários (
-
Detecção Adaptativa de Hardware e Cache Sob Demanda:
SmartCardWatcherimplementa 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.CertificateManagerimplementaSmartCardWatcher.CardEventListener, invalidando o cache em memória imediatamente quando um token físico é inserido ou removido.
-
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 viajpackage, proporcionando redução adicional no tempo de warmup da JVM.
- A geração de arquivo de classes compartilhadas via