83 lines
5.3 KiB
Markdown
83 lines
5.3 KiB
Markdown
# 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.
|