public static void main(String[] args) {
    try {
      ClientArgs clientArgs = new ClientArgs(args);
      final NettyPerfClient nettyPerfClient =
          new NettyPerfClient(clientArgs.hosts, clientArgs.port, clientArgs.path, clientArgs.pathFileName,
              clientArgs.concurrency, clientArgs.postBlobTotalSize, clientArgs.postBlobChunkSize,
              clientArgs.sslPropsFilePath, clientArgs.serviceId, clientArgs.targetAccountName,
              clientArgs.targetContainerName, clientArgs.customHeaders, clientArgs.targetQPS, clientArgs.ttl);
      // attach shutdown handler to catch control-c
      Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        logger.info("Received shutdown signal. Requesting NettyPerfClient shutdown");
        nettyPerfClient.shutdown();
      }));
      nettyPerfClient.start();
      ScheduledExecutorService scheduler = null;
      if (clientArgs.testTime != null) {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.schedule(nettyPerfClient::shutdown, clientArgs.testTime, TimeUnit.SECONDS);
      }
      nettyPerfClient.awaitShutdown();
      if (scheduler != null) {
        Utils.shutDownExecutorService(scheduler, 30, TimeUnit.SECONDS);
      }
    } catch (Exception e) {
      logger.error("Exception during execution of NettyPerfClient", e);
    }
  }
Invokes the {@link NettyPerfClient} with the command line arguments.
@param args command line arguments.
ambry-tools/src/main/java/com/github/ambry/tools/perf/rest/NettyPerfClient.java