quarta-feira, 20 de junho de 2018

LDAP vs LDAPS vs LDAPI: Performance?

O LDAP (Lightweight Directory Access Protocol) é um protocolo para acessar e manter serviços de Diretório. Amplamente utilizado para acessar serviço implementado com Windows AD, OpenLDAP, etc. Definição:

LDAP: Acesso a Diretório sem ou com criptografia habilitado (TLS) através da rede;
LDAPS: Acesso a Diretório com criptografia (SSL) através da rede;
LDAPI: Acesso a Diretório sem criptografia através de Comunicação entre Processos (IPC, Inter-Process Communication);

O teste consiste em medir o tempo necessário para execução de três experimentos com 1, 100 e 1.000 consultas (LDAP SEARCH).

Segue abaixo o script chamado "testeperformance.pl", desenvolvido em PERL, para realização dos testes:

#!/usr/bin/perl -w

($protocolo,$ntentativas) = @ARGV;

if ($protocolo eq "ldap") {
    use Net::LDAP;
    for (my $i=0; $i < $ntentativas; $i++) {
        $ldap = Net::LDAP->new( 'ldap://192.168.0.1' ) or die "$@";
        $mesg = $ldap->bind ;    # an anonymous bind
        $mesg = $ldap->search( # perform a search
                       base   => "dc=testeperformance",
                       filter => "(cn=fulano1)"
                     );
        $mesg->code && die $mesg->error;
        $mesg = $ldap->unbind;   # take down session
    }
}

if ($protocolo eq "ldaps") {
    use Net::LDAPS;
    for (my $i=0; $i < $ntentativas; $i++) {
        $ldaps = Net::LDAPS->new( 'ldaps://testeperformance',verify => 'allow',
                         capath => '/etc/ldap/tls/') or die "$@";
        $mesg = $ldaps->bind ;    # an anonymous bind
        $mesg = $ldaps->search( # perform a search
                       base   => "dc=testeperformance",
                       filter => "(cn=fulano1)"
                     );
        $mesg->code && die $mesg->error;
        $mesg = $ldaps->unbind;   # take down session
    }
}

if ($protocolo eq "ldapi") {
    use Net::LDAPI;
    for (my $i=0; $i < $ntentativas; $i++) {
        $ldapi = Net::LDAPI->new( '/var/run/ldapi' ) or die "$@";
        $mesg = $ldapi->bind ;    # an anonymous bind
        $mesg = $ldapi->search( # perform a search
                       base   => "dc=testeperformance",
                       filter => "(cn=fulano1)"
                     );
        $mesg->code && die $mesg->error;
        $mesg = $ldapi->unbind;   # take down session
    }
}


Modo de utilizar o script:

# perl testeperformance.pl <PROTOCOLO> <Número de Tentativas>

O parâmetro <PROTOCOLO> pode ser "ldap", "ldaps" ou "ldapi". E o <Número de Tentativas> é um inteiro que indica o número de vezes que o script irá executar a consulta. 
Obs.: Caso você tenha interesse em testes mais profundos no servidor de Diretório, recomendo utilizar o JMITER.

Experimentos

Foram executados em uma máquina virtual na nuvem, com a seguinte configuração:
Processador: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz
Memória: 2 GB
Disco: 40 GB
Sistema Operacional: Linux Debian - 64 Bits
Sistema de Diretório: OpenLDAP 2.4.46 

A operação de busca, SEARCH, é a mais utilizada em Diretórios, por este motivo iremos testar apenas esta operação. O terceiro experimento consiste em medir o tempo de execução de 1.000 consultas, afim de reproduzir ambientes de produção como por exemplo serviço de e-mail.
A implementação é sequencial, ou seja, uma nova busca será executada depois da conclusão da anterior. Este é o comportamento da maioria dos sistemas, mas há casos onde a implementação é paralela, ou seja consultas simultâneas. Não foi considerado consultas simultâneas neste teste de performance. 

Experimento 01: Apenas uma consulta

Consiste em medir o tempo necessário para execução de uma consulta (search) nos diferentes protocolos.
Exemplo comando executado:
# time perl testeperformance.pl <PROTOCOLO> 1


Resultado experimento com uma tentativa:
LDAP: 0,065s
LDAPS: 0,094s
LDAPI: 0,065s

Experimento 02: 100 consultas sequenciais

Consiste em medir o tempo necessário para execução de 100 consultas (search) repetidas nos diferentes protocolos.
Exemplo comando executado:
# time perl testeperformance.pl <PROTOCOLO> 100



Resultado experimento com uma tentativa:
LDAP: 0,195s
LDAPS: 0,749s
LDAPI: 0,155s

Experimento 03: 1.000 consultas sequenciais

Consiste em medir o tempo necessário para execução de 1.000 consultas (search) repetidas nos diferentes protocolos.
Exemplo comando executado:
# time perl testeperformance.pl <PROTOCOLO> 1000

Resultado experimento com uma tentativa:
LDAP: 1,292s
LDAPS: 6,833s
LDAPI: 0,996s


Resumo dos experimentos

Teste de Performance: LDAP vs LDAPS vs LDAPI


Conclusão

Como era de se esperar, o LDAPS é até cinco vezes mais lento que o LDAP, por causa dos procedimentos necessários para segurança (Criptografia).
O resultado que surpreendeu foi a agilidade do LDAPI, que chegar ser 20% superior ao protocolo padrão. A justificativa é que IPC não precisa se preocupar com as validações de rede (CHECKSUM, MTU, encapsulamento, cabeçalho, endereçamento).

Observação

Há limitação na quantidade de conexão simultânea quando utilizamos o LDAP ou LDAPS. Depende do sistema operacional mas este número geralmente é de 32768 conexões simultânea. Não faz parte da performance, mas é interessante ressaltar que o LDAPI é ilimitado.

 

Nenhum comentário:

Postar um comentário