blob: a2d7d5245f53c03a93f98a0e8e4b422b6149eec6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.loadtests.nio;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.ignite.internal.util.typedef.X;
/**
*
*/
public class GridNioBenchmarkClient {
/** */
private static final int INITIAL_PACKET_SIZE = 65536;
/** */
private static final byte[] INITIAL_PACKET = new byte[INITIAL_PACKET_SIZE];
/**
*
*/
static {
Random r = new Random();
for (int i = 0; i < INITIAL_PACKET_SIZE; i++)
r.nextBytes(INITIAL_PACKET);
}
/** */
private final int connCnt;
/** */
private final String host;
/** */
private final int port;
/** */
private final ExecutorService exec;
/** */
private final byte[] buf = new byte[(int)(65536 * 1.5)];
/**
* @param connCnt Connections count.
* @param host Host.
* @param port Port.
*/
public GridNioBenchmarkClient(int connCnt, String host, int port) {
this.connCnt = connCnt;
this.host = host;
this.port = port;
exec = Executors.newFixedThreadPool(connCnt);
}
/**
* Runs single benchamark configuration.
*
* @throws IOException If connection failed.
* @throws InterruptedException If benchmark was interrupted.
*/
public void run() throws IOException, InterruptedException {
for (int i = 0; i < connCnt; i++)
exec.execute(new ClientThread());
Thread.sleep(5 * 60 * 1000);
exec.shutdownNow();
}
/**
* Runs set of tests.
*
* @param args Command line arguments.
* @throws Exception If failed.
*/
public static void main(String[] args) throws Exception {
if (args.length != 3) {
X.println("Usage: " + GridNioBenchmarkClient.class.getSimpleName() + " <connections count> <host> <port>");
return;
}
final int connCnt = Integer.parseInt(args[0]);
final String host = args[1];
final int port = Integer.parseInt(args[2]);
new GridNioBenchmarkClient(connCnt, host, port).run();
}
/**
* Test thread.
*/
private class ClientThread implements Runnable {
/** {@inheritDoc} */
@Override public void run() {
Socket s = new Socket();
try {
s.connect(new InetSocketAddress(host, port));
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
out.write(INITIAL_PACKET);
for (int i = 0; i < 1000000; i++)
doIteration(in, out);
long bytes = 0;
long start = System.currentTimeMillis();
while (!Thread.interrupted())
bytes += doIteration(in, out);
long duration = System.currentTimeMillis() - start;
long mb = bytes / 1048576;
X.println("Thread finished [MB=" + bytes / 1048576 + ", MB/s=" + ((double)mb) * 1000 / duration + "]");
}
catch (IOException e) {
e.printStackTrace();
}
}
/**
* Performs single test iterations.
*
* @param in Stream to read data.
* @param out Stream to write data.
* @return Echoed bytes count.
* @throws IOException If failed.
*/
@SuppressWarnings("CallToThreadYield")
private long doIteration(InputStream in, OutputStream out) throws IOException {
int read = in.read(buf, 0, in.available());
if (read == 0)
Thread.yield();
out.write(buf, 0, read);
return read;
}
}
}