昨天一个前同事问跟我聊如何测试Oracle主备库的带宽,除了scp,是否使用过oratcptest测试主备带宽。
之前还真未使用过oratcptest来测试带宽,我也挺感兴趣这东西,就查阅MOS和网上其它资料,并在Oracle主备环境进行了测试。
oratcptest是Oracle原厂提供的一个jar包,具体jar包里什么信息,就不太清楚了,另外,oratcptest对java版本有一定要求,要求java版本不低于 1.6
oratcptest下载及其详细用法都可以在MOS上查询到.(Assessing and Tuning Network Performance for Data Guard and RMAN (Doc ID 2064368.1))。根据主备网络间的的带宽,查找网络瓶颈,来优化网络。
oratcptest执行需要使用root权限。
另外在使用oratcptest的时候还有几个地方需要注意:
-
需要在主备两端同时执行
-
如果是RAC集群,需要使用数据库VIP地址
-
不能使用数据库在使用的监听端口
通过java -jar oratcptest.jar -help 可查询oratcptest的详细帮助信息,以下是帮助信息详细输出
[root@xxx ~]# /u01/app/oracle/product/19.3.0/db_1/jdk/bin/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
复制
接下来,我们通过实验,来详细查看oratcptest是如何测试主备网络带宽的。
首先,需要在备库执行oratcptest
[root@xxxx ~]# /u01/app/oracle/product/19.3.0/db_1/jdk/bin/java -jar /oratcptest.jar -server 192.168.xxx.xxx -port=1521 OraTcpTest server started.
复制
接着,在主库执行oratcptest
[root@xxxx ~]# /u01/app/oracle/product/19.3.0/db_1/jdk/bin/java -jar /root/oratcptest.jar 192.168.xxx.xxx -port=1521 -duration=30s -interval=2s [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 = 2 seconds Test duration = 30 seconds Test frequency = NO Network Timeout = NO (1 Mbyte = 1024x1024 bytes) (13:53:34) The server is ready. Throughput Latency (13:53:36) 90.170 Mbytes/s 11.090 ms (13:53:38) 81.076 Mbytes/s 12.334 ms (13:53:40) 102.197 Mbytes/s 9.785 ms (13:53:42) 102.679 Mbytes/s 9.739 ms (13:53:44) 102.920 Mbytes/s 9.716 ms (13:53:46) 103.872 Mbytes/s 9.627 ms (13:53:48) 102.751 Mbytes/s 9.732 ms (13:53:50) 103.954 Mbytes/s 9.620 ms (13:53:52) 102.315 Mbytes/s 9.774 ms (13:53:54) 104.207 Mbytes/s 9.596 ms (13:53:56) 93.695 Mbytes/s 10.673 ms (13:53:58) 90.044 Mbytes/s 11.106 ms (13:54:00) 104.193 Mbytes/s 9.598 ms (13:54:02) 103.509 Mbytes/s 9.661 ms (13:54:04) 91.570 Mbytes/s 10.921 ms (13:54:04) Test finished. Socket send buffer = 326400 bytes Avg. throughput = 98.549 Mbytes/s Avg. latency = 10.147 ms
复制
通过输出结果,可以看到主库到备库的平均带宽是 98.549 Mbytes/s,平均延迟时间是 10.147 ms
此时,备库看到的信息如下
[root@node2 ~]# /u01/app/oracle/product/19.3.0/db_1/jdk/bin/java -jar /oratcptest.jar -server 192.168.68.169 -port=1521 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 968880 bytes.
复制
另外oratcptest测试,气候也可以跟mode参数,mode可以使用ASYNC或SYNC,如下:
[root@node2 ~]# /u01/app/oracle/product/19.3.0/db_1/jdk/bin/java -jar /root/oratcptest.jar 192.168.xxx.xxx -port=1521 -duration=40s -interval=4s -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 = 4 seconds Test duration = 40 seconds Test frequency = NO Network Timeout = NO (1 Mbyte = 1024x1024 bytes) (14:02:44) The server is ready. Throughput (14:02:48) 108.343 Mbytes/s (14:02:52) 108.390 Mbytes/s (14:02:56) 109.879 Mbytes/s (14:03:00) 110.548 Mbytes/s (14:03:04) 106.619 Mbytes/s (14:03:08) 107.720 Mbytes/s (14:03:12) 106.927 Mbytes/s (14:03:16) 107.190 Mbytes/s (14:03:20) 102.796 Mbytes/s (14:03:24) 105.555 Mbytes/s (14:03:24) Test finished. Socket send buffer = 339456 bytes Avg. throughput = 107.357 Mbytes/s [root@xxxx ~]# /u01/app/oracle/product/19.3.0/db_1/jdk/bin/java -jar /root/oratcptest.jar 192.168.xxx.xxx -port=1521 -duration=30s -interval=2s -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 = 2 seconds Test duration = 30 seconds Test frequency = NO Network Timeout = NO (1 Mbyte = 1024x1024 bytes) (14:06:14) The server is ready. Throughput Latency (14:06:16) 98.696 Mbytes/s 10.132 ms (14:06:18) 100.049 Mbytes/s 9.995 ms (14:06:20) 101.756 Mbytes/s 9.827 ms (14:06:22) 101.584 Mbytes/s 9.844 ms (14:06:24) 102.045 Mbytes/s 9.800 ms (14:06:26) 101.565 Mbytes/s 9.846 ms (14:06:28) 101.564 Mbytes/s 9.846 ms (14:06:30) 101.601 Mbytes/s 9.843 ms (14:06:32) 102.244 Mbytes/s 9.781 ms (14:06:34) 92.646 Mbytes/s 10.794 ms (14:06:36) 100.945 Mbytes/s 9.907 ms (14:06:38) 90.749 Mbytes/s 11.020 ms (14:06:40) 102.685 Mbytes/s 9.739 ms (14:06:42) 92.229 Mbytes/s 10.843 ms (14:06:44) 101.945 Mbytes/s 9.809 ms (14:06:44) Test finished. Socket send buffer = 322048 bytes Avg. throughput = 99.432 Mbytes/s Avg. latency = 10.057 ms
复制
可以通过设置不同参数,多次测试,来测试主备间平均带宽和延迟。
测试中,监听端口不能使用在用端口,否则会报如下信息
[root@xxx ~]# /u01/app/oracle/product/19.3.0/db_1/jdk/bin/java -jar /oratcptest.jar -server 192.168.xxx.xxx -port=1522 Failed to listen a socket : Address already in use
复制