[SP-pm] downloader survey
Thiago Rondon
thiago at aware.com.br
Thu Oct 20 18:37:56 PDT 2011
On Thu, Oct 20, 2011 at 05:25:20PM -0200, Stanislaw Pusep wrote:
> OK, aqui vai o spoiler: estou fazendo benchmark (de overhead) de todos os
> HTTP agents que conheAS:o. E oA LWP estA! *MUITO* feio na fita:
> https://metacpan.org/module/AnyEvent::Net::Curl::Queued#OVERHEAD
> ABS()
Stan,
Eu vou apontar para outro lado, já que me parece que teu objetivo é
perfomance para efetuar download de arquivos via http (tcp), e você
já esta testando as alternativas que há como módulo para realizar
tua tarefa. :)
Me parece que teu caso é:
- Uso do protocolo HTTP para baixar arquivos ;
- Encontrar o melhor algoritimo para trabalhar em paralelo no seu
aplicativo;
- Verificar se você tem "banda" necessária para este trabalho.
Primeiramente, é interessante saber, quanto de banda você tem
disponível ? Qual o tamanho dos arquivos que você vai efetuar download ?
Ou seja, qual sua capacidade para buscar os arquivos, e qual
'concorrencia' ?
Como é um caso para conectividade em paralelo, é interessante levantar
alguns pontos da tua rede e do teu sistema operacional para saber se ele
suporta e esta preparado para esta demanda. Isto pode afetar o comportamento
de alguns módulos.
Apesar do kernel 2.6 já ter muita coisa para o "autotuning" na pilha
TCP, é interessante olhar para alguns parametros, tais como:
- net/core/[r,w]mem_max e net/ipv4/tcp_[r,w]mem pode ser muito interessante em
casos onde há conexões em paralelo, com excesso uso de conexões e
dados.
- net/ipv4/tcp_available_congestion_control - Este é um assunto que vale
ler, dependendo do local, da 'qualidade do link' você pode optar por
um algoritimo, se tiver banda em excesso e etc, pode ser outra. Há
muita atualização destes algoritimos ao longo do desenvolvimento do
kernel 2.6, vale verificar e atualizar o kernel se você for alterar
este parametro.
- txqueuelen é um bom parametro também para ser trabalhado, pois pode te
oferecer uma boa perfomance neste cenário também, este parametro é
efetuado no device, por exemplo 'ifconfig eth0 txqueuelen 100000'
Em relação ao algoritimo de concorrencia, dependendo da quantidade que
você quer, e se você esta de olho em perfomance, é interessante olhar
para o epoll no Linux. Eu ainda não usei os módulos que trabalham
diretamente com ele, como o IO::Epool, mas há muita coisa surgindo
baseado nesta caracteristica "nova" que esta disponível no kernel,
tais como nginx e etc. Fica uma pergunta.. Será que isto vai fazer
realmente diferença ? Eu não sei, mas gostaria de ver seus resultados
aqui. :)
Agora, o HTTP você pode utilizar o keep alive, dependendo também das
suas requisições, são para o mesmo host ? Se você tiver uma lista, é
uma boa ordenar por host, e dividir elas entre os processos que você
vai separar, ou seja, se você tiver 30 arquivos no host X, e 30 no
arquivo Y, organize eles para se aproveitar do keep alive, ou se for
tudo diferente desative ele.
Se os arquivos não foram compactados, e dependendo do tipo, e se
banda for um 'problema', talvez vale apena ativar a compactação para
buscar os arquivos, onde os servidores suportarem.
Se a lista for 'grande' e 'diversificada', use o dns cache, e vá
resolvando os nomes antes, para economizar uma etapa na hora que
for para 'buscar'.
Tome cuidado com roteadores bizarros que 'zoem' o MTU, isto pode
afetar bastante, um MTU alto pode te ajudar com transferir pacotes
com dados grandes.
Enfim, foram ideias que tive agora sobre o problema. :)
Acredito que o restante da discussão, é o que você já tá procurando,
que é como os módulos trabalham, e efetuam a tarefa que você quer,
mas poste os resultados aqui, pois também estou curioso. :-)
Ps.: Lembre-se que todos os valores no /proc são volateis, então use o sysctl
para manter ele persistente no teu sistema. :)
Abs!
-Thiago Rondon
More information about the SaoPaulo-pm
mailing list