Analisando o throughput de rede com o oratcptest

Analisando o throughput de rede com o oratcptest

Recentemente, durante uma análise de lag em um ambiente Data Guard, precisei analisar a performance da rede que interligava os ambientes primary e standby, e utilizei a ferramenta oratcptest para a análise. Como não encontrei nenhum artigo em português sobre ela, aqui vai um overview sobre o que ela é capaz de fazer.

Funcionalidades do oratcptest

Essa ferramenta serve para medir a banda e a latência de rede entre dois pontos, e pode ser usada para avaliação não só de redes usadas em configurações Data Guard, mas também GoldenGate, backups e restores RMAN, migrações e clones de bancos de dados. Com ela podemos simmular o transporte de maneira similar ao que o Oracle utiliza para todas essas ferramentas e analisar o comportamento da rede durante esse processo.

O download dessa ferramenta pode ser realizado através do MOS, na nota KB150844 – Assessing and Tuning Network Performance for Data Guard and RMAN. Por se tratar de um arquivo JAR, é necessário o JRE6 ou superior para executá-la.

O oratcptest possui diversas capacidades, permitindo controlar o tamanho da mensagem que será enviada, a duração do teste, paralelismo, modo de de comunicação (ASYNC ou SYNC), dentro outras.

$ java -jar oratcptest.jar -help

[OraTcpTest server]

Usage:
        java OraTcpTest -server [server_address] [OPTION]

Options:
        -port=<number>
                listening TCP port number. Must be specified.
        -file=<name>
                file name for disk-write test. Default value is oratcp.tmp.
        -sockbuf=<bytes>
                server socket receive buffer size. Default value is zero,
                which means system default receive buffer size.
        -help
                display help.
        -version
                display version.
Server examples:
        java OraTcpTest -server -port=5555
        java OraTcpTest -server my.server.com -port=5555 -file=test.out -sockbuf=64k

 

[OraTcpTest client]
Usage:

        java OraTcpTest <server_address> [OPTION]

Options:

        -port=<number>
                listening TCP port number at server. Must be specified.
        -write
                server writes network message to disk before server replies
                with ACK.
        -mode=[SYNC|ASYNC]
                In SYNC mode, client waits for server's ACK before it sends
                next message. In ASYNC mode, it doesn't wait. Default value is
                SYNC
        -num_conn=<number>
                number of TCP connections. Default value is 1.
        -sockbuf=<bytes>
                client socket send buffer size. Default value is zero, which
                means system default send buffer size.
        -length=<bytes>
                message payload length. Default value is 1 Mbyte.
        -delay=<milliseconds>
                delay in milliseconds between network messages. Default value
                is zero, which means no delay between messages.
        -rtt
                round-trip-time measurement mode. Equivalent to -mode=SYNC and
                -length=0.
        -random_length
                random payload length uniformly distributed between 512 bytes
                and -length option value.
        -random_delay
                random delay uniformly distributed between zero and -delay
                option value.
        -payload=[RANDOM|ZERO|<filename>]
                payload content type among random data, all zeroes, or the
                contents of a user-specified file. Default value is RANDOM.
        -interval=<time>
                statistics reporting interval. Default value is 10 seconds.
        -duration=<time> or <bytes>
                test duration in time or bytes. If not specified, test does not
                terminate.
        -freq=<time>/<time>
                test repeat frequency. For example, -freq=1h/24h means the
                test will repeat every 1 hour for 24 hours.
        -timeout=<time>
                network timeout. Default value is zero, which means no timeout.
        -output=<name>
                output file name where client stores test result statistics.
        -help
                display help.
        -version
                display version.

Client examples:

        java OraTcpTest my.server.com -port=5555
        java OraTcpTest my.server.com -port=5555 -rtt
        java OraTcpTest my.server.com -port=5555 -write -mode=SYNC -num_conn=2 -length=2M -delay=15 -sockbuf=64k -interval=5s -duration=2m -freq=1h/24h -timeout=60s -random_length -random_delay -payload=ZERO -output=test.out

Como usar

Para usar o oratcptest, é necessário rodar em um dos hosts com o modo server habilitado, e em outro host, rodar como client, apontando para o server.

Por exemplo, no host onde o standby database está, rodo o server, repassando uma porta que não esteja utlizada e esteja liberada para o host primário conectar:

[orcldg.oracle@dc2-host pion]$ java -jar oratcptest.jar -server 192.168.1.116 -port=7001

OraTcpTest server started.

[A test was requested.]

    Message payload         = 1 Mbyte
    Disk write              = NO
    Socket receive buffer   = (system default)

The test terminated. The socket receive buffer was 3777956 bytes.

Agora no meu host primário, posso chamar o oratcptest apontando para o server. Neste caso rodei um teste de 120 segundos, com intervalo de 20 segundos entre os envios:

[orcl.oracle@dc1-host pion]$ java -jar oratcptest.jar 192.168.1.116 -port=7001 -duration=120s -interval=20s -mode=ASYNC

[Requesting a test]

    Message payload         = 1 Mbyte
    Payload content type    = RANDOM
    Delay between messages  = NO
    Number of connections   = 1
    Socket send buffer      = (system default)
    Transport mode          = ASYNC
    Disk write              = NO
    Statistics interval     = 20 seconds
    Test duration           = 2 minutes
    Test frequency          = NO
    Network Timeout         = NO
    (1 Mbyte = 1024x1024 bytes)

(17:15:38) The server is ready.

                Throughput

(17:15:58)  1793.058 Mbytes/s
(17:16:18)  1944.047 Mbytes/s
(17:16:38)  2990.064 Mbytes/s
(17:16:58)  2998.536 Mbytes/s
(17:17:18)  2076.125 Mbytes/s
(17:17:38)  2104.138 Mbytes/s

(17:17:38) Test finished.

        Socket send buffer = 8 Mbytes
        Avg. throughput = 2017.821 Mbytes/s

Ao ser executado, o teste traz informações sobre o throughput da rede. Como não foi especificado um modo, o modo ASYNC é usado por padrão. Caso o teste seja feito com o modo SYNC, a latência também é retornada:

[orcl.oracle@dc1-host pion]$ java -jar oratcptest.jar 192.168.1.116 -port=7001 -duration=120s -interval=20s -mode=SYNC

[Requesting a test]

       Message payload      = 1 Mbyte
       Payload content type = RANDOM
       Delay between messages = NO
       Number of connections = 1
       Socket send buffer   = (system default)
       Transport mode       = SYNC
       Disk write           = NO
       Statistics interval  = 20 seconds
       Test duration        = 2 minutes
       Test frequency       = NO
       Network Timeout      = NO

       (1 Mbyte = 1024x1024 bytes)

(17:24:57) The server is ready.

                  Throughput          Latency
(17:25:17)    841.792 Mbytes/s        1.189 ms
(17:25:37)    848.602 Mbytes/s        1.178 ms
(17:25:57)    846.190 Mbytes/s        1.182 ms
(17:26:17)    848.203 Mbytes/s        1.179 ms
(17:26:37)    851.995 Mbytes/s        1.174 ms
(17:26:57)    853.968 Mbytes/s        1.171 ms

(17:26:57) Test finished.

              Socket send buffer = 935680 bytes
              Avg. throughput = 848.370 Mbytes/s
              Avg. latency = 1.179 ms

Conclusão

O oratcptest pode ser um aliado para determinar se a rede está sendo o ofensor em cenários de transport lag. Entretanto, segundo o KB150844, o oratcptest precisa ser executado com cuidado, porque o teste de throughput pode utilizar uma parcela considerável da banda disponível, e pode impactar aplicações críticas compartilhando a mesma rede.

Leitura complementar: Understand Current Network Throughput.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *