Contents

Introdução

Início rápido

Informações de Apoio

APIC como um servidor Web - NGINX

Registros relevantes

Metologia

Isolar disparador inicial

Verificar o uso e a integridade do NGINX

Formato de Entrada Access.log

Comportamentos do Access.log

Verificar uso de recurso NGINX

Verificar núcleos

Verificar Latência de Cliente para Servidor

Guia Rede de Ferramentas de Desenvolvimento de Navegador

Aprimoramentos para Páginas de IU Específicas

Recomendações gerais para cliente > Latência do servidor

Verificar Solicitações Longas da Web

Tempo de Resposta do Sistema - Habilitar Cálculo para Tempo de Resposta do Servidor

Tempo de resposta do sistema - Monitoramento

Opção 1. Método de subscrição

Opção 2. Script Sob Demanda

Considerações sobre o uso da API do APIC

Ponteiros gerais para garantir que um script não prejudique o Nginx

Ineficiências do script de endereço

Acelerador de Solicitação NGINX

Introdução

Este documento descreve a metodologia geral para solucionar problemas de uma experiência de GUI do APIC lenta.

Início rápido

É comum perceber que problemas lentos de GUI do APIC são o resultado de uma alta taxa de solicitações de API originadas de um script, integração ou aplicativo. O access.log de um APIC registra cada solicitação de API processada. O access.log de um APIC pode ser rapidamente analisado com o script Access Log Analyzer no projeto do grupo Github Datacenter aci-tac-scripts.

Informações de Apoio

APIC como um servidor Web - NGINX

O NGINX é o DME responsável pelos endpoints de API disponíveis em cada APIC. Se NGINX estiver inoperante, as solicitações de API não poderão ser tratadas. Se NGINX estiver congestionado, a API está congestionada. Cada APIC executa seu próprio processo NGINX, portanto, é possível que apenas um único APIC possa ter problemas de NGINX se apenas esse APIC for direcionado por qualquer consultante agressivo.

A IU do APIC executa várias solicitações de API para preencher cada página. Da mesma forma, todos os comandos 'show' do APIC (CLI de estilo NXOS) são empacotadores para scripts python que executam várias solicitações de API, manipulam a resposta e a enviam ao usuário.

Registros relevantes

Nome do arquivo de log

Local

Em qual suporte técnico ele está

Comentários

access.log

/var/log/dme/log

APIC 3de3

Independentemente da ACI, oferece 1 linha por solicitação de API

error.log

/var/log/dme/log

APIC 3de3

Independente da ACI, mostra erros nginx (limitação incluída)

nginx.bin.log

/var/log/dme/log

APIC 3de3

Específico da ACI, registra transações DME

nginx.bin.warnplus.log

/var/log/dme/log

APIC 3de3

Específico da ACI contém logs que são de aviso+ gravidade

Metologia

Isolar disparador inicial

O que é afetado?

- Quais APIC são afetados; um, muitos ou todos os APICs?

- Onde se observa lentidão; via interface do usuário, comandos CLI ou ambos?

- Quais páginas ou comandos específicos da interface do usuário são lentos?

Como ocorre a lentidão?

- Isso é visto em vários navegadores para um único usuário?

- Vários usuários relatam lentidão ou apenas um único/subconjunto de usuários?

- Os usuários afetados compartilham uma localização geográfica ou um caminho de rede semelhante do navegador para o APIC?

Quando a lentidão foi notada pela primeira vez?

- Foi adicionada recentemente uma integração ou script da ACI?

- Uma extensão do navegador foi habilitada recentemente?

- Houve uma alteração recente na configuração da ACI?

Verificar o uso e a integridade do NGINX

Formato de Entrada Access.log

O access.log é um recurso do NGINX e, portanto, não depende do APIC. Cada linha representa 1 solicitação HTTP recebida pelo APIC. Consulte esse registro para entender o uso do NGINX de um APIC.

O formato access.log padrão na versão 5.2+ do ACI:

log_format proxy_ip '$remote_addr ($http_x_real_ip) - $remote_user [$time_local]'

'"$request" $status $body_bytes_sent '

'"$http_referer" "$http_user_agent"';

Esta linha representa uma entrada access.log quando um moquery -c fvTenant é executado:

127.0.0.1 (-) - - [07/Apr/2022:20:10:59 +0000]"GET /api/class/fvTenant.xml HTTP/1.1" 200 15863 "-" "Python-urllib"

Mapa da entrada access.log de exemplo para log_format:

campo log_format

Conteúdo do exemplo

Comentários

$remote_addr

127.0.0.1

IP do host que enviou esta solicitação

$http_x_real_ip

-

IP do último solicitante se proxies estiverem em uso

$remote_user

-

Não é geralmente usado. Marque nginx.bin.log para rastrear qual usuário efetuou login para executar solicitações

$time_local

07/abr/2022:20:10:59 +0000

Quando a solicitação foi processada

$request

OBTENHA /api/class/fvTenant.xml HTTP/1.1

Método Http (GET, POST, DELETE) e URI

$status

200

Código de Status da Resposta HTTP

$body_bytes_sent

1586

tamanho de payload de resposta

$http_referer

-

-

$http_user_agent

Python- urllib

Que tipo de cliente enviou a solicitação

Comportamentos do Access.log

Intermitências de solicitação de alta taxa durante um grande período de tempo:

- As intermitências contínuas de mais de 40 solicitações por segundo podem causar lentidão na interface do usuário

- Identificar quais hosts são responsáveis pelas consultas

- Reduza ou desative a origem de consultas para ver se isso melhora o tempo de resposta do APIC.

Respostas 4xx ou 5xx consistentes:

- Se encontrado, identifique a mensagem de erro de nginx.bin.log

Verificar uso de recurso NGINX

A utilização da CPU e da memória do NGINX pode ser verificada com o comando top do APIC:

top - 13:19:47 up 29 days, 2:08, 11 users, load average: 12.24, 11.79, 12.72

Tasks: 785 total, 1 running, 383 sleeping, 0 stopped, 0 zombie

%Cpu(s): 3.5 us, 2.0 sy, 0.0 ni, 94.2 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st

KiB Mem : 13141363+total, 50360320 free, 31109680 used, 49943636 buff/cache

KiB Swap: 0 total, 0 free, 0 used. 98279904 avail Mem

PID   USER PR NI VIRT    RES   SHR   S %CPU %MEM TIME+     COMMAND

21495 root 20 0  4393916 3.5g 217624 S 2.6  2.8  759:05.78 nginx.bin

O alto uso de recursos NGINX pode se correlacionar diretamente a uma alta taxa de solicitações processadas.

Verificar núcleos

Um travamento de NGINX não é típico para problemas de GUI do Slow APIC. No entanto, se houver núcleos NGINX, anexe-os a um TAC SR para análise. Consulte o guia de suporte técnico da ACI para obter as etapas para verificar os núcleos.

Verificar Latência de Cliente para Servidor

Se solicitações rápidas não forem encontradas, mas um usuário continuar a exibir lentidão da interface do usuário, o problema pode ser a latência de Cliente (navegador) para Servidor (APIC).

Nesses cenários, valide o caminho de dados do navegador para o APIC (distância geográfica, VPN etc.). Se possível, implante e teste o acesso de um servidor de salto localizado na mesma região geográfica ou no mesmo data center que os APICs para isolar. Valide se outros usuários exibem uma quantidade similar de latência.

Guia Rede de Ferramentas de Desenvolvimento de Navegador

Todos os navegadores têm a capacidade de validar solicitações e respostas HTTP por meio do kit de ferramentas Desenvolvimento de navegador, normalmente em uma guia Rede.

Essa ferramenta pode ser usada para validar o tempo necessário para cada estágio de solicitações originadas no navegador, conforme mostrado na imagem.

Exemplo do navegador aguardando 1,1 minuto para que o APIC responda

Aprimoramentos para Páginas de IU Específicas

Página Grupo de Políticas:

ID de bug Cisco CSCvx14621 - GUI do APIC carrega lentamente nas políticas de IPG na guia Estrutura.

Interface na página Inventário:

ID de bug Cisco CSCvx90048 - A carga inicial da guia operacional "Configuração de interface física da camada 1" é longa/induz 'congelamento'.

Recomendações gerais para cliente > Latência do servidor

Certos navegadores, como o Firefox, permitem mais conexões da Web por host por padrão.

- Verifique se essa configuração pode ser definida na versão do navegador usada

- Isso é mais importante para páginas de várias consultas, como a página Grupo de Políticas

A VPN e a distância para o APIC aumentam a lentidão geral da interface do usuário, considerando as solicitações do navegador do cliente e o tempo de viagem de resposta do APIC. Uma caixa de salto geograficamente local para os APICs reduz significativamente o tempo de viagem do navegador para o APIC.

Verificar Solicitações Longas da Web

Se um servidor da Web (NGINX no APIC) lidar com um grande volume de solicitações da Web longas, isso pode afetar o desempenho de outras solicitações recebidas em paralelo.

Isso é especialmente verdadeiro para sistemas que têm bancos de dados distribuídos, como APICs. Uma única solicitação de API pode exigir solicitações e pesquisas adicionais enviadas a outros nós na malha, o que pode resultar em tempos de resposta esperadamente mais longos. Um pico dessas Solicitações da Web Longa em um pequeno intervalo de tempo pode compor a quantidade de recursos necessários e levar a tempos de resposta inesperadamente mais longos. Além disso, as solicitações recebidas podem expirar (90 segundos), o que resulta em um comportamento inesperado do sistema da perspectiva do usuário.

Tempo de Resposta do Sistema - Habilitar Cálculo para Tempo de Resposta do Servidor

No 4.2(1)+, um usuário pode habilitar o "Cálculo de desempenho do sistema", que rastreia e destaca solicitações de API que levaram tempo para serem tratadas.

O cálculo pode ser ativado em Sistema - Configurações do sistema - Desempenho do sistema

Quando o "Cálculo" estiver habilitado, um usuário poderá navegar para APICs específicos em Controladores para visualizar as Solicitações de API mais lentas nos últimos 300 segundos.

Sistema - Controladores - Pasta Controladores - APIC x - Tempo de resposta do servidor

Tempo de resposta do sistema - Monitoramento

Se você tiver um cenário em que a resposta da interface do usuário seja desacelerada aleatoriamente, mas não houver monitoramento ativo para saber com que frequência isso está acontecendo, você poderá usar uma das duas abordagens

Opção 1:  Uma abordagem de assinatura para obter o tempo de resposta da malha constantemente. Esta etapa requer um servidor externo para executar o script que enviará a solicitação de assinatura e as atualizações.

Opção 2:  Um script sob demanda executado no próprio APIC e as saídas massageadas no LV. Essa pode ser uma opção mais fácil devido a menos dependências

Opção 1. Método de subscrição

Passo 1:  (também mencionado acima) Uma única mudança global no APIC. Não invasivo, mas bom sempre seguir as práticas de mudança padrão.

Vá para Sistema—>Configurações do sistema—>Desempenho do sistema

Habilitar cálculos

Definir limite de resposta como 50000ms

Não alterar os outros parâmetros

Quando o "Cálculo" estiver habilitado, um usuário poderá navegar para APICs específicos em Controladores para visualizar as Solicitações de API mais lentas nos últimos 300 segundos.

Passo 2:

- Precisa de um host externo com um ambiente python3 que tenha acessibilidade ao APIC. Você precisa instalar os módulos python request e websocket-client.

- O script se inscreverá em uma classe de objeto específica que controla os tempos de resposta.

Local do Git para apic_query_subscription_slow_ui.py —> https://wwwin-github.cisco.com/CX-ACI/lv_accloganalyzer

- A sessão do terminal no servidor externo precisa ser registrada e alguém terá que verificar o terminal para garantir que esteja recebendo os dados constantemente.

python_apic_query_subscription_lowui.py -a <anyapicip> -u <username>

carregar o registro da sessão do terminal uma vez a cada 24 horas no caso do TAC

Passo 3: Colete as saídas do TAC e os registros de acesso para registros de eventos e conclua as consultas da api nas últimas 24 horas todos os dias em um determinado horário.

Para Estruturas ACI que executam versões anteriores à 5.3/6.0(3d), há um Script Collect TacOutput disponível no repositório aci-tac-scripts que serve uma interface semelhante ao comando trigger tacoutput:

apic# /tmp/collectTacOutputs.sh

Select corresponding numbers of objects to collect. Separate numbers with commas. *Note, topSystem, fabricNode, and firmwareARunning are automatically included.

Ex: 1,2,3,4,5

1. faultInfo *collected unfiltered

2. faultRecord

3. eventRecord

4. aaaModLR

5. polDeploymentRecord

6. epRecord

7. healthRecord

8. healthInst *collected unfiltered

Enter selections: 3

Enter record start date (format: 2019-12-15T00:00:00) *default is one month prior to current date: 2019-12-25T00:00:00

Enter record end date (format: 2019-12-15T00:00:00) *default is current date: 2020-01-05T00:00:00

...script collection runs...

Extraia o arquivo tacoutputxx.tgz e carregue-o no gabinete

Observação: para estruturas da ACI executando a versão 5.3/6.0(3d) e versões posteriores, a saída de acionador fornece uma interface de coleta simplificada para eventos, falhas, auditoria e outras saídas de solução de problemas). Você não precisa usar o script.

## De qualquer APIC, .

mkdir /data/techsupport/apicname_srnumber

cd /var/log/dme/log

cp  access* /data/techsupport/apicname_srnumber

cd /data/techsupport/

tar -zcvfapicname_srnumber.tgz /data/techsupport/apicname_srnumber

uploadapicname_srnumber.tgz para o caso

Exemplo de laboratório para execução de script a partir de um host externo:

(my-virtual-env-3.7.13) root@aci-fab1-esxi2-oob:~# python apic_query_subscription_slowui.py -a 10.122.141.98 -u rgatti

Logging into APIC 10.122.141.98

rgatti password:

********** WebSocket Subscription URIS and IDs **********

WebSocket Subscription Status Code: 101

https://10.122.141.98/api/class/commRequestData.json?subscription=yes

- Subscription ID: 72059449487065089

********** WebSocket Subscription Messages **********

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.122.141.126","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-1","method":"GET","modTs":"2024-08-06T13:15:07.857-04:00","responseSize":"2313","responseTime":"1017","rn":"","startTime":"2024-08-06T13:12:38.334-04:00","status":"modified","url":"/api/node/class/firmwareOSource.json"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.26.164.186","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-2","method":"GET","modTs":"2024-08-06T13:15:07.857-04:00","responseSize":"252","responseTime":"1007","rn":"","startTime":"2024-08-06T13:13:39.145-04:00","status":"modified","url":"/api/node/mo/uni/infra/nodecfgcont/node-103.json"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.26.161.138","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-3","modTs":"2024-08-06T13:15:07.857-04:00","responseTime":"788","rn":"","startTime":"2024-08-06T13:14:24.351-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.24.131.101","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-4","modTs":"2024-08-06T13:15:07.857-04:00","responseTime":"784","rn":"","startTime":"2024-08-06T13:14:41.169-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.25.130.136","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-5","modTs":"2024-08-06T13:15:07.857-04:00","responseTime":"783","rn":"","startTime":"2024-08-06T13:12:29.028-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-1/node-2/web/apiAvgResp/reqData-1","modTs":"2024-08-06T13:15:51.533-04:00","responseSize":"3926","responseTime":"1013","rn":"","startTime":"2024-08-06T13:12:22.387-04:00","status":"modified","url":"/api/node/class/topSystem.json"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-1/node-2/web/apiAvgResp/reqData-2","modTs":"2024-08-06T13:15:51.533-04:00","responseSize":"905","responseTime":"208","rn":"","startTime":"2024-08-06T13:12:59.783-04:00","status":"modified","url":"/api/node/class/dnsProv.json"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-1/node-2/web/apiAvgResp/reqData-3","modTs":"2024-08-06T13:15:51.533-04:00","responseSize":"905","responseTime":"114","rn":"","startTime":"2024-08-06T13:10:59.781-04:00","status":"modified","url":"/api/node/class/dnsProv.json"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-1/node-2/web/apiAvgResp/reqData-4","modTs":"2024-08-06T13:15:51.533-04:00","responseSize":"905","responseTime":"98","rn":"","startTime":"2024-08-06T13:14:59.782-04:00","status":"modified","url":"/api/node/class/dnsProv.json"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-1/node-2/web/apiAvgResp/reqData-5","modTs":"2024-08-06T13:15:51.533-04:00","responseSize":"1075","responseTime":"46","rn":"","startTime":"2024-08-06T13:14:26.565-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-2/node-3/web/apiAvgResp/reqData-1","modTs":"2024-08-06T13:16:19.490-04:00","responseTime":"2392","rn":"","startTime":"2024-08-06T13:11:44.143-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-2/node-3/web/apiAvgResp/reqData-2","modTs":"2024-08-06T13:16:19.490-04:00","responseTime":"2389","rn":"","startTime":"2024-08-06T13:15:24.604-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-2/node-3/web/apiAvgResp/reqData-3","modTs":"2024-08-06T13:16:19.490-04:00","responseTime":"2384","rn":"","startTime":"2024-08-06T13:13:38.231-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-2/node-3/web/apiAvgResp/reqData-4","modTs":"2024-08-06T13:16:19.490-04:00","responseTime":"2384","rn":"","startTime":"2024-08-06T13:13:14.402-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-2/node-3/web/apiAvgResp/reqData-5","modTs":"2024-08-06T13:16:19.490-04:00","responseTime":"2383","rn":"","startTime":"2024-08-06T13:14:24.584-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.26.161.138","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-1","method":"POST","modTs":"2024-08-06T13:20:07.951-04:00","responseSize":"0","responseTime":"784","rn":"","startTime":"2024-08-06T13:19:24.361-04:00","status":"modified","url":"/uitelemetry/clicks"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.25.130.136","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-2","method":"POST","modTs":"2024-08-06T13:20:07.951-04:00","responseSize":"0","responseTime":"783","rn":"","startTime":"2024-08-06T13:18:34.821-04:00","status":"modified","url":"/uitelemetry/clicks"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.25.130.136","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-3","modTs":"2024-08-06T13:20:07.951-04:00","responseTime":"781","rn":"","startTime":"2024-08-06T13:17:03.705-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.25.130.136","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-4","modTs":"2024-08-06T13:20:07.951-04:00","responseTime":"781","rn":"","startTime":"2024-08-06T13:18:04.530-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"10.26.161.138","dn":"topology/pod-1/node-1/web/apiAvgResp/reqData-5","modTs":"2024-08-06T13:20:07.951-04:00","responseTime":"781","rn":"","startTime":"2024-08-06T13:18:24.354-04:00","status":"modified"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-1/node-2/web/apiAvgResp/reqData-1","modTs":"2024-08-06T13:20:51.568-04:00","responseSize":"905","responseTime":"1018","rn":"","startTime":"2024-08-06T13:16:59.784-04:00","status":"modified","url":"/api/node/class/dnsProv.json"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","dn":"topology/pod-1/node-2/web/apiAvgResp/reqData-2","modTs":"2024-08-06T13:20:51.568-04:00","responseSize":"405","responseTime":"148","rn":"","startTime":"2024-08-06T13:18:01.471-04:00","status":"modified","url":"/api/node/class/proxyServer.json"}}}]}

{"subscriptionId":["72059449487065089"],"imdata":[{"commRequestData":{"attributes":{"childAction":"","clientHostname":"192.168.1.1","dn":"topology/pod-1/node-2/web/apiAvgResp/reqData-3","modTs":"2024-08-06T13:20:51.568-04:00","responseSize":"3390","responseTime":"112","rn":"","startTime":"2024-08-06T13:17:29.488-04:00","status":"modified","url":"/api/node/class/pkiFabricSelfCAEp.json"}}}]}

Opção 2. Script Sob Demanda

Na CLI do APIC

bash

<paste the below directly on the APIC cli - modify the filename. The script will run for 1 hr>

let i=1

while [ $i -lt 60 ]

do

date

date >> /data/techsupport/commRequestData.txt

moquery -c commRequestData >> /data/techsupport/commRequestData_<date_time>.txt

sleep 60

let i=i+1

done

A saída não é fácil de ler, que pode ser massageada usando o script abaixo em LV.

Local do Git para commrequests_processing.py —> https://wwwin-github.cisco.com/CX-ACI/lv_accloganalyzer

Copie o script para a pasta de scripts local (exemplo /users/rgatti/scripts).

Como executar:

users/rgatti/dnld_695998256/cv1/jul14_2025/commrequestdata --> This is where we saved the commRequestData_<date_time>.txt file

python3 /users/rgatti/scripts/commrequests_processing.py -f commRequestData_jul14_4pm.txt > commRequestData_jul14_4pm.txt.formatted

Exemplo abaixo: responseTime é usado para classificação com o maior tempo de resposta exibido na parte superior

rgatti@aci-logviewer2:~/dnld_695998256/cv1/jul14_2025/commrequestdata$ less commRequestData_jul14_4pm.txt.formatted

Processing file: commRequestData_jul14_4pm.txt

clientHostname | dn                                              | method | responseCode | responseSize | responseTime | startTime                     | url

---------------+-------------------------------------------------+--------+--------------+--------------+--------------+-------------------------------+------------------------------------------------------------------------------------

127.0.0.1      | topology/pod-2/node-5/web/apiAvgResp/reqData-1  | GET    | 200          | 14255310     | 31123        | 2025-07-14T15:08:38.598-05:00 | /api/class/fvRInfoHolder.json

127.0.0.1      | topology/pod-2/node-5/web/apiAvgResp/reqData-1  | GET    | 200          | 14255310     | 31123        | 2025-07-14T15:08:38.598-05:00 | /api/class/fvRInfoHolder.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-1  | GET    | 200          | 17050        | 29660        | 2025-07-14T15:08:39.262-05:00 | /api/node/class/fabricPathEp.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-2  | GET    | 200          | 111529       | 29658        | 2025-07-14T15:08:39.261-05:00 | /api/class/mgmtRsInBStNode.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-3  | GET    | 200          | 474          | 29631        | 2025-07-14T15:08:39.258-05:00 | /api/class/mgmtInstP.json

127.0.0.1      | topology/pod-2/node-4/web/apiAvgResp/reqData-1  | GET    | 200          | 13637        | 28933        | 2025-07-14T15:08:38.597-05:00 | /api/class/faultDelegate.json

127.0.0.1      | topology/pod-2/node-2/web/apiAvgResp/reqData-2  | GET    | 200          | 530          | 28243        | 2025-07-14T15:08:39.274-05:00 | /api/class/vzRsDenyRule.json

127.0.0.1      | topology/pod-2/node-2/web/apiAvgResp/reqData-1  | GET    | 200          | 30           | 28243        | 2025-07-14T15:08:39.273-05:00 | /api/class/fvRsProtBy.json

127.0.0.1      | topology/pod-2/node-2/web/apiAvgResp/reqData-2  | GET    | 200          | 530          | 28243        | 2025-07-14T15:08:39.274-05:00 | /api/class/vzRsDenyRule.json

127.0.0.1      | topology/pod-2/node-2/web/apiAvgResp/reqData-1  | GET    | 200          | 30           | 28243        | 2025-07-14T15:08:39.273-05:00 | /api/class/fvRsProtBy.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-1  | GET    | 200          | 18426168     | 27107        | 2025-07-14T15:40:33.874-05:00 | /api/mo/uni.xml

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-1  | GET    | 200          | 18426168     | 27107        | 2025-07-14T15:40:33.874-05:00 | /api/mo/uni.xml

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-4  | GET    | 200          | 18429959     | 25516        | 2025-07-14T15:08:46.841-05:00 | /api/mo/uni.xml

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-2  | GET    | 200          | 719780       | 24794        | 2025-07-14T15:40:35.346-05:00 | /api/class/fabricPathEp.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-2  | GET    | 200          | 719780       | 24794        | 2025-07-14T15:40:35.346-05:00 | /api/class/fabricPathEp.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-5  | GET    | 200          | 18431710     | 24604        | 2025-07-14T15:08:56.167-05:00 | /api/mo/uni.xml

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-3  | GET    | 200          | 452          | 23720        | 2025-07-14T15:40:36.395-05:00 | /api/class/mgmtOoB.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-3  | GET    | 200          | 452          | 23720        | 2025-07-14T15:40:36.395-05:00 | /api/class/mgmtOoB.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-6  | GET    | 200          | 18430138     | 23578        | 2025-07-14T15:08:49.945-05:00 | /api/mo/uni.xml

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-1  | GET    | 200          | 14255310     | 21159        | 2025-07-14T15:38:59.233-05:00 | /api/class/fvRInfoHolder.json

127.0.0.1      | topology/pod-2/node-1/web/apiAvgResp/reqData-1  | GET    | 200          | 14255310     | 21159        | 2025-07-14T15:38:59.233-05:00 | /api/class/fvRInfoHolder.json

Considerações sobre o uso da API do APIC

Ponteiros gerais para garantir que um script não prejudique o Nginx

- Cada APIC executa seu próprio NGINX DME.

- Somente o NGINX do APIC 1 processa solicitações para o APIC 1. O NGINX do APIC 2 e do APIC 3 não processa essas solicitações.

- Em geral, mais de 40 solicitações de API por segundo durante um longo período debilita o NGINX.

- Se encontrados, reduza a agressividade das solicitações.

- Se o host Requests não puder ser modificado, considere NGINX Rate Limits no APIC.

Ineficiências do script de endereço

- Não faça logon/logoff antes de cada solicitação de API.

- O tempo limite padrão para uma sessão de logon é de 10 minutos. Essa mesma sessão pode ser usada para várias solicitações e pode ser atualizada para estender o tempo de validade.

- Consulte o Guia de configuração da API REST do Cisco APIC - Acesso à API REST - Autenticação e manutenção de uma sessão de API.

- Se o seu script consultar muitos DNs que compartilham um pai, em vez de recolher as consultas em uma única consulta pai lógica com Filtros de Consulta.

- Consulte o Guia de configuração da API REST do Cisco APIC - Redigindo consultas da API REST - Aplicando filtros de escopo de consulta.

- Se precisar de atualizações de um objeto ou classe de objeto, considere assinaturas de websocket em vez de solicitações rápidas de API.

Acelerador de Solicitação NGINX

Disponível no 4.2(1)+, um usuário pode habilitar o acelerador de solicitações em HTTP e HTTPS independentemente.

Observação: a partir da versão 6.1(2) da ACI, a taxa máxima suportada para esse recurso foi reduzida para 40 solicitações por segundo (r/s) ou 2.400 solicitações por minuto (r/m) de 10.000 r/m.

Malha - Políticas de malha - Pastas de políticas - Pasta de acesso de gerenciamento - padrão

Quando habilitado:

- O NGINX é reiniciado para aplicar as alterações do arquivo de configuração

- Uma nova região, httpsClientTagZone, é gravada na configuração nginx

- A taxa de aceleração pode ser definida em Solicitações por minuto (r/m) ou Solicitações por segundo (r/s).

- O Acelerador de Solicitação depende da Implementação de Limite de Taxa incluída no NGINX

- As Solicitações de API em relação ao /api/ URI usam a Taxa de Aceleração definida pelo usuário + intermitência= (Taxa de Aceleração x 2) + nodelay

- Há um acelerador não configurável (zone aaaApiHttps) para /api/aaaLogin e /api/aaaRefresh que limita a taxa em 2r/s + burst=4 + nodelay

- O Acelerador de Solicitação é rastreado por cliente-endereço-IP

- As solicitações de API originadas do autoip (UI + CLI) do APIC ignoram o acelerador

- Qualquer endereço IP do cliente que cruze a taxa de aceleração definida pelo usuário + limite de intermitência recebe uma resposta 503 do APIC

- Esses 503s podem ser correlacionados nos registros de acesso

- error.log terá entradas que indicam quando a limitação foi ativada (zona httpsClientTagZone) e em quais hosts do cliente

apic# less /var/log/dme/log/error.log

...

2023/04/17 20:19:14 [error] ... limiting requests, excess: 40.292 by zone "httpsClientTagZone", client: h.o.s.t, ... request: "GET /api/class/...", host: "a.p.i.c"

2023/04/17 20:19:14 [error] ... limiting requests, excess: 40.292 by zone "httpsClientTagZone", client: h.o.s.t, ... request: "GET /api/node/...", host: "a.p.i.c"

Como regra geral, o Request Throttle serve apenas para proteger o servidor (APIC) de sintomas do tipo DDOS induzidos por clientes agressivos à consulta. Entender e isolar o cliente agressivo de solicitação para soluções finais na lógica de aplicativo/script.