adequação do servidor proxy/cache squid a redes de extrema carga
TRANSCRIPT
Adequação do servidor Proxy/Cache Squid a redes de
extrema carga.
Lucas Brasilino<[email protected]>
Procuradoria Geral da República MPF
Agenda● O Squid;● Tipos de otimizações;● Dissecando a lula;● Uso de descritores de arquivos;● Loop principal;● Modalidades de I/O para cache em disco;
Agenda● Substituição de objetos em cache;● Uso de memória.
O Squid
● É um servidor proxy/cache para HTTP/1.0;– Com extensões para HTTP/1.1:
● Headers:– Keepalive– Host– CacheControl
● Método CONNECT● etc
O Squid
● Projetado para ser um único processo– Porém algumas funcionalidades são realizadas por
processos externos. Exemplos:● dnsserver● ulinkd● redirectors● Externals ACL, etc.
● Pode utilizar threads
Tipos de otimizações
● Opções (tags) no arquivo de configuração squid.conf
● Opções definidas na configuração dos fontes para compilação (./configure)
● Otimização do kernel do Linux (sysctl)
Dissecando a lula
clientside serversideStorage Manager
Store API
memPools
replacement policy
replacement policy
storeclient
comm_loop
HTTP HTTPFTPGOPHER
Uso de descritores de arquivos● É um número inteiro com o qual é possível
acessar 'streams' de I/O. ● Arquivos, sockets (I/O em rede), pipes e FIFOs
(named pipes) são alguns tipos de 'stream'.
fdes = open(“arq.txt”,O_RDONLY,0600);
len = read(fdes, buffer, 1024);
Uso de descritores de arquivos
sd = socket (...);connect (sd, .....); write(sd,”GET http://www...”,...);
sd = socket(...);bind(sd, ...);listen(sd, 30);cl_sd = accept(sd,...);read(cl_sd, request,...);
Socket TCP/IP
Uso de descritores de arquivos● Normalmente cada processo pode alocar no
máximo 1024 descritores# ulimit n
● Este valor tende a ser insuficiente em redes de extrema carga
# squidclient mgr:info | grep “file desc”
Maximum number of file descriptors: 8192Largest file desc currently in use: 1430Number of file desc currently in use: 1377Available number of file descriptors: 6815Reserved number of file descriptors: 100
Parametrização: número de descritores disponíveis para o Squid● Aumente o número de descritores
– Configure os fontes:# ./configure withmaxfd=8192
– Configure o ambiente (shell) que o squid será executado:# ulimit HSn 8192 && squid DY
Parametrização: número global de descritores disponíveis
● Verifique o número de descritores disponíveis no sistema operacional:
# sysctl fs.filemax
fs.filemax = 498073
# sysctl fs.filenr
fs.filenr = 4224 0 498073
Parametrização: número global de descritores disponíveis
● Caso necessário aumente (e muito) o número disponível de descritores:
# sysctl w fs.filemax=819200
Obs: Este último comando equivale a:# echo “819200” > /proc/sys/fs/filemax
● Não se esqueça de adicionálo ao arquivo /etc/sysctl.conf
Parametrização: pilha TCP/IP● Aumente o número de portas locais disponíveis:
# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 61000
# sysctl w net.ipv4.ip_local_port_range="1024 65000"
net.ipv4.ip_local_port_range = 1024 65000
● Aumente o backlog# sysctl net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 1024
# sysctl w net.ipv4.tcp_max_syn_backlog=2048
net.ipv4.tcp_max_syn_backlog = 2048
Loop principal: comm_loop● Todos descritores possíveis são setados como
assíncronos (nonblocking)● É um loop chamando select(), ou similares:
– São passados todos os descritores, exceto os referentes a arquivos em disco;
– O kernel define quais descritores estão prontos para serem lidos ou escritos;
– Retorna tais descritores pro Squid;
Loop principal: comm_loop● continuando...
– Squid chama funções de leitura e escrita previamente registradas;
– Antes de novo loop, todas funções 'agendadas' são executadas, através da event API.
Loop principal: comm_loop
● select() é conhecidamente lento ao examinar um grande número de descritores.
● Uma alternativa plausível é utilizar poll()● Caso o kernel seja 2.6, utilizeutilize epoll.epoll.
Loop principal: comm_loop● Performance do epoll
Parametrização: comm_loop
● A chamada de sistema o loop irá utilizar é definida na configuração dos fontes: # ./configure enableepoll
Modalidades de I/O para cache em disco
● Implementado através da API storeclient● Tipos:
– UFS: Unix File System● Modalidade padrão● Utiliza as tradicionais chamadas de sistema open(), close(), read(), write(), etc
● Tais chamadas são síncronas (blocking)● Baixa performance: 30 – 50 req/seg
Modalidades de I/O para cache em disco
● continuando...– AUFS: Asynchronous Unix File System
● Similar ao UFS;● Utiliza threads para 'paralelizar' o acesso a disco;● Ideal em servidores SMP● A nova biblioteca threads do Linux, NPTL, melhorou
muito a performance nesta modalidade;● Boa performance: 150 – 200 req/seg;
Modalidades de I/O para cache em disco
● continuando...– Diskd:
● É um daemon externo ao Squid, apenas para 'enfileirar' e executar as chamadas de acesso a disco;
● Squid repassa via message queues as operações a serem realizadas;
● E através de shared memory são efetuadas a trocas de dados.
● Boa performance: ~160 req/seg
Modalidades de I/O para cache em disco
● continuando...– COSS: Cyclic Object Storage System
● É o primeiro esforço em se criar um sistema de arquivos dedicados ao Squid;
● Segundo estudos iniciais, é a modalidade de melhor performance ao cachear pequenos objetos;
● Armazena todos os objetos em um único arquivo;● Recentemente desenvolvido portanto não tão estável.
Parametrização: modalidades de I/O
● Recomendação: AUFS– Configure os fontes:
# ./configure enablestoreio='ufs,aufs'
– Configure o squid.conf:cache_dir aufs /var/cache 10240 32 256
Políticas de substituição de objetos em cache: replacement policy
● É o algorítmo que elege quais objetos deverão ser removidos do cache para que outros sejam armazenados;
● Tem relação direta com a performance total do servidor;
Políticas de substituição de objetos em cache: replacement policy
● Quanto mais objetos requisitados estiverem no cache:– menor será tempo de recebimento de uma página
Web;– menor será a utilização da largura de banda;– menor será a carga sobre o servidor Web de
origem;
Políticas de substituição de objetos em cache: replacement policy
● Razão de acertos:– Hit rate
● É a razão entre a quantidade de objetos servidos pelo cache pelo total de objetos requisitados;
– Byte hit rate● É a razão da quantidade de bytes servidos pelo cache
pelo total de bytes requisitados;
Políticas de substituição de objetos em cache: replacement policy
● Algorítmos:– LRU: Least Recently Used
● É a política padrão;● Os objetos mais antigos são eleitos para exclusão;● É implementado através de uma lista encadeada onde os
objetos mais recentes encabeçam a lista;● É ineficiente pois não leva em consideração o tamanho
do objeto nem tampouco a frequência ele foi requisitado.
Políticas de substituição de objetos em cache: replacement policy
● Algorítmos:– Heap
● Estrutura em árvore onde os objetos (nós) de maior chave é sempre 'pai' de um de menor chave;
● Os objetos no fim da árvore são eleitos para exclusão;
32
2330
1912
Políticas de substituição de objetos em cache: replacement policy
● Heap:– LFUDA: Least Frequently Used with Dynamic
Aging● A chave do objeto é calculada levando em conta a
frequência de requisição e um fator de idade;● Consegue alto byte hit rate
Políticas de substituição de objetos em cache: replacement policy
● Heap:– GDSF: Greedy Dual Size Frequency
● Similar ao LFUDA, porém levandose em conta um fator proporcional ao tamanho do objeto;
● Os objetos menos requisitados e de maior tamanho são eleitos para exclusão;
● Consegue alto hit rate.
Parametrização: replacement policy● Habilitando o heap:
– Configure os fontes:# ./configure enableremovalpolicies='heap'
– Configure o squid.conf:cache_replacement_policy heap LFUDA
oucache_replacement_policy heap GDSF
Uso de memória● Tem impacto decisivo na performance● O Squid aloca memória para armazenar:
– intransit objects;– hot objects;– metadados (incluindo tabela hash) do cache;– buffers de I/O de disco e rede;– cache de resoluções DNS, etc.
Uso de memória● O Squid aloca o somatório de:
– 10Mb de RAM a cada 1Gb em cache_dir;– Valor configurado em cache_mem;– Aproximadamente de 10 a 20Mb adicionais;
● Devemos evitar a todo custo que o sistema operacional utilize o swap:# free m
Parametrização: uso de memória● É realizada configurando a opção cache_mem
no arquivo squid.conf;● Recomendase alocar a metade da memória
RAM total do servidor para o Squid:
cachemem=RAM−Total Mb
2−cachedir Mb
102,4−20