Com o kernel SO_REUSEPORT atribui conexão ao processo não em accept ()

2

Eu tenho um servidor que é executado como vários processos, usando SO_REUSEPORT para fornecer paralelismo. Um processo do servidor pode ser atribuído a uma conexão, no entanto, mesmo quando está ocupado no processamento, o que efetivamente encadeava as solicitações individuais. Este não parece ser o comportamento documentado de SO_REUSEPORT.

Para descartar meu código, fiz o download de um servidor TCP simples de link e modificou da seguinte forma:

/ * adicionado SO_REUSEPORT * /    setsockopt (parentfd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,              (const void ) & optval, sizeof (int)); . . . / dormir antes de fechar * /     sono (10);     perto (childfd);

Eu executo 2 instâncias disso (na mesma porta) sob strace e acesse-as por meio de vários segundos de intervalo. Eu vejo a segunda conexão curl pode acabar esperando o primeiro servidor, mesmo que esse servidor está dormindo e o outro servidor está esperando em um accept ().

Isso parece ser uma falha na implementação do SO_REUSEPORT (de acordo com vários artigos, a semântica deve ser "a implementação SO_REUSEPORT distribui conexões uniformemente em todos os encadeamentos (ou processos) que estão bloqueados em accept () no mesmo porta. "

O kernel é: Versão Linux 3.14.27-25.47.amzn1.x86_64 (mockbuild @ gobi-build-60001) (gcc versão 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)) # 1 SMP qua Dez 17 18:36: 15 UTC 2014

    
por Michael Lindner 13.03.2017 / 17:28

0 respostas