De uma resenha casual da fonte, parece que o (s) autor (es) estavam com excesso de zelo no uso de set_nonblock
em sslh-select.c .
Se você sinalizar todos os soquetes (como faz) como não-bloqueantes, o loop
while(1) {
select(… a bunch of non-blocking sockets …);
}
na linha 230 no arquivo vinculado se torna uma espera ocupada. Ou seja, mesmo que não haja dados disponíveis para leitura em qualquer soquete, selecione retorna instantaneamente e, em seguida, é chamado novamente imediatamente. Isso é bastante processador intensivo.
O autor chegou perto de acertar, com algum uso condicional do argumento timeout
para select
, mas isso não tem efeito se todos forem definidos como não-bloqueantes de qualquer maneira.
Eu não criei o perfil sslh
, que é a melhor maneira de confirmar que essa é a causa real.