Skip to content

Análise de Performance#

Ciclo de Crash#

O site entra num ciclo vicioso de crashes que se repete a cada 1-2 dias. O diagrama seguinte ilustra este ciclo:

flowchart TD
    A["Site sem trafego durante ~20 min"] -->|Always On desativado| B["Azure descarrega a aplicacao"]
    B --> C["Utilizador acede ao site"]
    C --> D["Cold Start: Umbraco reinicia"]
    D --> E["Umbraco reconstroi XML cache a partir da BD"]
    E --> F["BD tem ~1.2M linhas em cmsPropertyData\n+ ~8M registos em icUrlTracker"]
    F --> G["Reconstrucao da cache demora muitos minutos"]
    G --> H["Site parece bloqueado/em baixo"]
    H --> I["Administrador reinicia o App Service"]
    I --> J["Site funciona normalmente"]
    J --> K["1-2 dias depois, memoria esgota-se"]
    K --> A

    style A fill:#ff6b6b,color:#fff
    style B fill:#ff6b6b,color:#fff
    style G fill:#ff6b6b,color:#fff
    style H fill:#ff6b6b,color:#fff
    style K fill:#ff6b6b,color:#fff

Pressão de Memória#

O Umbraco precisa de manter em memória a cache XML de todos os conteúdos publicados, o que cria pressão significativa sobre a memória disponível.

pie title "Distribuicao Estimada de Memoria"
    "Umbraco XML Cache" : 45
    "Property Data (~1.2M linhas)" : 25
    "Runtime .NET + IIS" : 15
    "Donut Cache + Sessoes" : 10
    "Outros (Hangfire, APIs)" : 5

Detalhes da Pressão de Memória#

Componente Impacto na Memória Notas
Umbraco XML Cache Elevado Cache completa de 11.503 nós de conteúdo
cmsPropertyData Elevado 1.220.959 linhas (~358 MB na BD, mais em memória)
Donut Caching Médio Camada adicional de cache sobre a cache do Umbraco
ContentApiController Médio Chamado em CADA navegação de página

Fluxo de um Pedido de Página#

sequenceDiagram
    participant U as Utilizador
    participant IIS as IIS/App Service
    participant DC as Donut Cache
    participant API as ContentApiController
    participant UC as Umbraco Cache
    participant DB as SQL Database

    U->>IIS: GET /pagina
    IIS->>DC: Verificar Donut Cache

    alt Cache hit
        DC-->>U: Resposta imediata
    else Cache miss
        DC->>API: ContentApiController
        API->>UC: Pedir conteudo da cache Umbraco

        alt Cache XML pronta
            UC-->>API: Dados do conteudo
        else Cache em reconstrucao (cold start)
            UC->>DB: SELECT * FROM cmsPropertyData...
            Note over DB: ~1.2M linhas para processar
            UC->>DB: Verificar icUrlTracker
            Note over DB: ~8M registos para carregar
            DB-->>UC: Dados (demora minutos)
            UC-->>API: Dados do conteudo
        end

        API-->>DC: Resposta
        DC-->>U: Resposta (apos espera longa)
    end

Problema do ContentApiController#

O ContentApiController é invocado em cada navegação de página pelo frontend AngularJS. Este controller depende da cache do Umbraco estar disponível. Quando a cache não está pronta (durante um cold start), cada pedido de página fica bloqueado à espera que a cache seja reconstruída.


Hangfire Desativado#

O Hangfire (sistema de tarefas em background) foi desativado propositadamente devido a problemas de memória. Isto confirma que a equipa já tinha conhecimento de que a memória era um problema, mas a causa raiz (excesso de dados na BD) não foi resolvida.

flowchart LR
    A["Hangfire ativo"] --> B["Consumo adicional de memoria"]
    B --> C["Crashes mais frequentes"]
    C --> D["Hangfire desativado como workaround"]
    D --> E["Problema de memoria persiste"]
    E --> F["Causa raiz: BD sobrecarregada"]

    style D fill:#ffa500,color:#fff
    style F fill:#ff6b6b,color:#fff

Métricas-Chave#

Métrica Valor Atual Valor Normal
Nós de conteúdo 11.503 -
Linhas em cmsPropertyData 1.220.959 ~30.000-50.000
Registos em icUrlTracker 7.996.535 < 10.000
Versões de conteúdo 77.923 < 10.000
Application Insights Desativado Ativo com alertas
Always On Desativado Ativado
Frequência de crashes A cada 1-2 dias Nunca