# Linter de desempenho de iRules

> Cole um iRule; ele sinaliza anti-padrões de desempenho documentados pela F5 linha por linha, com severidade, causa e correção. O principal: variáveis globais demovem o CMP. Local, sem rede.

- Tool: https://ronutz.com/pt-BR/tools/f5-irules-performance-linter
- Family: Redes

---

## O que faz

Cole um iRule; o linter sinaliza um pequeno conjunto de anti-padrões de desempenho e correção de alta confiança, documentados pela F5, linha por linha, cada um com uma severidade, o token problemático, por que importa e a correção. É um analisador estático (sem parser Tcl, sem execução), então cobre deliberadamente apenas padrões que uma varredura de linha consegue detectar de forma confiável e com poucos falsos positivos. Não é um substituto para a medição: combine-o com a Calculadora de Runtime de iRules, que lê estatísticas reais de timing, para o custo real de uma regra. Tudo roda localmente.

## O que sinaliza

**Variáveis do namespace global** (`$::x`, `set ::x`, a palavra-chave `global`) são sinalizadas como ALTA. O validador da F5 captura a palavra-chave `global` a partir da v10 e demove o servidor virtual para uma única instância de TMM (demoção de CMP), então um processador lida com todas as conexões daquele virtual; variáveis globais estão descontinuadas desde a v10. A forma obsoleta `$::datagroup` é ainda pior: na versão 11 e posteriores, acessar um data group dessa forma levanta um erro de execução TCL e envia um reset para o cliente. A correção é o namespace `static::` seguro para CMP para constantes compartilhadas, variáveis locais comuns para dados por conexão, ou o comando `class` para data groups.

**`expr` sem chaves** é um AVISO. O Tcl substitui e re-analisa a forma sem chaves, e pode fazer dupla substituição; colocar a expressão entre chaves permite que o compilador de bytecode a otimize. A correção é `expr { ... }`.

**`matchclass` / `findclass`** são INFO. Ambos foram descontinuados na v10 em favor do comando `class`, que a F5 descreve como oferecendo melhor funcionalidade e desempenho. A correção é `class match` / `class search`.

**`regexp` / `regsub`** são INFO. Expressões regulares custam materialmente mais que trabalho fixo de string; quando o casamento é um prefixo, sufixo, valor exato ou glob simples, `string`, `scan`, `switch -glob` ou `class` são mais baratos.

## O que deliberadamente não sinaliza

Variáveis `static::` (seguras para CMP), `class match` / `class search` e `expr` com chaves estão corretas e passam limpas. Persistência, tabelas e o comando `session` são compatíveis com CMP em versões modernas, então não são tratados como problemas de CMP. Comentários de linha inteira são ignorados.

## Standards and references

- [F5 clouddocs — iRules CMP Compatibility](https://clouddocs.f5.com/api/irules/CMPCompatibility.html) - the global keyword is caught by the validator as of v10 and demotes the virtual server; static:: variables were added for CMP-safe shared values; persistence and tables are CMP-compatible on modern versions
- [F5 clouddocs — RULE_INIT](https://clouddocs.f5.com/api/irules/RULE_INIT.html) - global variables modified by an iRule demote the virtual to a single processor core; see CMP Compatibility
- [F5 clouddocs — class (and matchclass)](https://clouddocs.f5.com/api/irules/class.html) - the class command deprecates findclass and matchclass (better functionality and performance); the obsolete $::datagroup access demotes CMP on 9.4.4-10 and raises a TCL runtime error, resetting the client, on v11+
- [F5 clouddocs — How To Write Fast Rules](https://clouddocs.f5.com/api/irules/HowToWriteFastRules.html) - brace expr expressions so the bytecode compiler can optimize them, rather than paying for string re-substitution; general iRule performance guidance

## Related reading

- [iRules, CMP e o namespace static::](https://ronutz.com/pt-BR/learn/irules-cmp-and-static-namespace.md): O Clustered Multiprocessing espalha o tráfego de um servidor virtual por todos os TMMs, mas um construto desfaz isso silenciosamente: uma variável global demove o virtual para um único núcleo. É por isso que globais estão descontinuadas, o que o namespace static:: e os data groups fazem no lugar, e como o RULE_INIT amarra tudo.
- [iRules: escolhendo entre if, switch, class match e arrays static](https://ronutz.com/pt-BR/learn/irules-branching-and-lookups.md): Quando um iRule precisa comparar um valor com muitos e agir, há quatro ferramentas comuns: if encadeado, switch, um data group com class match, e um array static:: indexado diretamente. A F5 de fato ordenou essas opções por velocidade. Aqui está essa ordem, e as duas perguntas que decidem qual usar.
- [Laços e listas em iRules, e por que eles bloqueiam](https://ronutz.com/pt-BR/learn/irules-loops-and-lists.md): iRules suportam foreach, for e while, e a maioria dos comandos de lista do Tcl. Mas laços rodam em linha em um TMM de thread única, então um laço grande por requisição trava aquela conexão. Aqui está qual laço usar, quais comandos de lista você realmente tem, e por que o foreach é o primeiro a buscar.
- [Procedimentos em iRules: código reutilizável com proc e call](https://ronutz.com/pt-BR/learn/irules-procedures-proc-and-call.md): Desde o BIG-IP 11.4, um iRule pode definir um bloco de código uma vez como um procedimento e chamá-lo de qualquer lugar, inclusive de outros iRules que não estão anexados a nenhum servidor virtual. Aqui está como proc e call funcionam, como argumentos e padrões são declarados, e a única regra de namespace que confunde todo mundo.
