Pergunta

Tornadoweb e Nginx são servidores populares da Web no momento e muitos benchmarkings mostram que eles têm um desempenho melhor do que o Apache em determinadas circunstâncias. Então, minha pergunta é:

'Epoll' é a razão mais essencial que os torna tão rápidos? E o que posso aprender com isso se quiser escrever um bom servidor de soquete?

Foi útil?

Solução

Se você deseja escrever um servidor de soquete, um bom ponto de partida é o artigo C10K de Dan Kegel de alguns anos atrás:

http://www.kegel.com/c10k.html

Eu também achei o Guia de Beej para a programação da rede ser bastante útil:

http://beej.us/guide/bgnet/

Finalmente, se você precisar de uma ótima referência, há programação de rede Unix por W. Richard Stevens et. Al.:

http://www.amazon.com/unix-network-programming-sockets-networking/dp/0131411551/ref=dp_ob_title_bk

De qualquer forma, para responder à sua pergunta, a principal diferença entre o Apache e o Nginx é que o Apache usa um thread por cliente com E/S de bloqueio, enquanto o Nginx é um thread único com E/S não bloqueadora. O pool de trabalhadores da Apache reduz a sobrecarga dos processos de partida e destaque, mas ainda faz com que o interruptor da CPU entre vários threads ao atender a vários clientes. O nginx, por outro lado, lida com todas as solicitações em um thread. Quando uma solicitação precisa fazer uma solicitação de rede (digamos, para um back -end), o NGINX anexa um retorno de chamada à solicitação de back -end e depois funciona em outra solicitação ativa do cliente. Na prática, isso significa que ele retorna ao loop do evento (epoll, kqueue, ou select) e pede descritores de arquivos que têm algo a relatar. Observe que a chamada do sistema no loop de eventos principal é na verdade uma operação de bloqueio, porque não há nada a fazer até que um dos descritores de arquivos esteja pronto para ler ou escrever.

Portanto, essa é a principal razão pela qual Nginx e Tornado são eficientes em atender a muitos clientes simultâneos: há apenas um processo (salvando RAM) e apenas um thread (salvando assim a CPU dos interruptores de contexto). Quanto ao Epoll, é apenas uma versão mais eficiente do Select. Se houver n descritores de arquivos abertos (soquetes), ele permite escolher os prontos para a leitura em O (1) em vez do tempo O (n). De fato, o nginx pode usar selecionar em vez de epoll se você compilá -lo com o --with-select_module opção, e aposto que ainda será mais eficiente que o Apache. Não estou tão familiarizado com os internos do Apache, mas um grep rápido mostra que usa o Select e o Epoll - provavelmente quando o servidor está ouvindo várias portas/interfaces ou se for solicitações de back -end simultâneas para um único cliente.

Aliás, comecei com essas coisas tentando escrever um servidor de soquete básico e queria descobrir como o Nginx era tão eficiente. Depois de passar pelo código -fonte do NGINX e ler esses guias/livros aos quais vinculei acima, descobri que seria mais fácil escrever módulos Nginx em vez do meu próprio servidor. Assim nasceu o guia do Emiller agora sem-sem-homem do desenvolvimento do módulo Nginx:

http://www.evanmiller.org/nginx-modules-guide.html

(Aviso: o guia foi escrito contra o Nginx 0.5-0.6 e as APIs podem ter mudado.) Se você está fazendo alguma coisa com o HTTP, eu diria que dar uma chance ao Nginx, porque funcionou com todos os detalhes peludos de lidar com clientes estúpidos. Por exemplo, o pequeno servidor de soquete que escrevi para se divertir funcionou muito bem com todos os clientes - exceto o Safari, e nunca descobri o porquê. Mesmo para outros protocolos, o Nginx pode ser o caminho certo; O evento é muito bem abstraído dos protocolos, e é por isso que pode proxy HTTP e IMAP. A base do código NGINX é extremamente bem organizada e muito bem escrita, com uma exceção que leva mencionando. Eu não seguiria sua liderança quando se trata de rolar manualmente um analisador de protocolo; Em vez disso, use um gerador de pastores. Eu escrevi algumas coisas sobre o uso de um gerador de pastores (ragel) com o nginx aqui:

http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing

Tudo isso provavelmente foi mais informações do que você queria, mas espero que você ache algumas delas úteis.

Outras dicas

Sim e não. Enquanto ambos usam o Epoll, é tecnicamente que ambos usam um loop de eventos para lidar com as solicitações. Você pode encontrar mais informações sobre o que são loops de eventos e como eles são usados Wikipedia.

Verificação de saída Libevent (usado por Gevent, geralmente mais rápido e mais estável que o tornado) ou Libev para implementações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top