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.
