Showing
4 changed files
with
144 additions
and
83 deletions
| ... | @@ -7,6 +7,7 @@ import java.io.IOException; | ... | @@ -7,6 +7,7 @@ import java.io.IOException; |
| 7 | import java.nio.channels.Selector; | 7 | import java.nio.channels.Selector; |
| 8 | 8 | ||
| 9 | import static com.google.common.base.Preconditions.checkArgument; | 9 | import static com.google.common.base.Preconditions.checkArgument; |
| 10 | +import static java.lang.System.currentTimeMillis; | ||
| 10 | 11 | ||
| 11 | /** | 12 | /** |
| 12 | * Abstraction of an I/O processing loop based on an NIO selector. | 13 | * Abstraction of an I/O processing loop based on an NIO selector. |
| ... | @@ -118,4 +119,41 @@ public abstract class SelectorLoop implements Runnable { | ... | @@ -118,4 +119,41 @@ public abstract class SelectorLoop implements Runnable { |
| 118 | notifyAll(); | 119 | notifyAll(); |
| 119 | } | 120 | } |
| 120 | 121 | ||
| 122 | + /** | ||
| 123 | + * Waits for the loop execution to start. | ||
| 124 | + * | ||
| 125 | + * @param timeout number of milliseconds to wait | ||
| 126 | + * @return true if loop started in time | ||
| 127 | + */ | ||
| 128 | + public final synchronized boolean awaitStart(long timeout) { | ||
| 129 | + long max = currentTimeMillis() + timeout; | ||
| 130 | + while (state != State.STARTED && (currentTimeMillis() < max)) { | ||
| 131 | + try { | ||
| 132 | + wait(timeout); | ||
| 133 | + } catch (InterruptedException e) { | ||
| 134 | + throw new RuntimeException("Interrupted", e); | ||
| 135 | + } | ||
| 136 | + } | ||
| 137 | + return state == State.STARTED; | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + /** | ||
| 141 | + * Waits for the loop execution to stop. | ||
| 142 | + * | ||
| 143 | + * @param timeout number of milliseconds to wait | ||
| 144 | + * @return true if loop finished in time | ||
| 145 | + */ | ||
| 146 | + public final synchronized boolean awaitStop(long timeout) { | ||
| 147 | + long max = currentTimeMillis() + timeout; | ||
| 148 | + while (state != State.STOPPED && (currentTimeMillis() < max)) { | ||
| 149 | + try { | ||
| 150 | + wait(timeout); | ||
| 151 | + } catch (InterruptedException e) { | ||
| 152 | + throw new RuntimeException("Interrupted", e); | ||
| 153 | + } | ||
| 154 | + } | ||
| 155 | + return state == State.STOPPED; | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + | ||
| 121 | } | 159 | } | ... | ... |
| 1 | package org.onlab.nio; | 1 | package org.onlab.nio; |
| 2 | 2 | ||
| 3 | import org.junit.Before; | 3 | import org.junit.Before; |
| 4 | -import org.junit.Ignore; | ||
| 5 | import org.junit.Test; | 4 | import org.junit.Test; |
| 6 | 5 | ||
| 7 | import java.net.InetAddress; | 6 | import java.net.InetAddress; |
| 8 | -import java.text.DecimalFormat; | ||
| 9 | import java.util.Random; | 7 | import java.util.Random; |
| 8 | +import java.util.logging.Level; | ||
| 9 | +import java.util.logging.Logger; | ||
| 10 | 10 | ||
| 11 | import static org.onlab.junit.TestTools.delay; | 11 | import static org.onlab.junit.TestTools.delay; |
| 12 | 12 | ||
| ... | @@ -15,55 +15,51 @@ import static org.onlab.junit.TestTools.delay; | ... | @@ -15,55 +15,51 @@ import static org.onlab.junit.TestTools.delay; |
| 15 | */ | 15 | */ |
| 16 | public class IOLoopIntegrationTest { | 16 | public class IOLoopIntegrationTest { |
| 17 | 17 | ||
| 18 | - private static final int MILLION = 1000000; | ||
| 19 | - private static final int TIMEOUT = 60; | ||
| 20 | - | ||
| 21 | private static final int THREADS = 6; | 18 | private static final int THREADS = 6; |
| 22 | - private static final int MSG_COUNT = 20 * MILLION; | 19 | + private static final int TIMEOUT = 60; |
| 23 | - private static final int MSG_SIZE = 128; | 20 | + private static final int MESSAGE_LENGTH = 128; |
| 24 | 21 | ||
| 25 | - private static final long MIN_MPS = 10 * MILLION; | 22 | + private static final int MILLION = 1000000; |
| 23 | + private static final int MSG_COUNT = 40 * MILLION; | ||
| 26 | 24 | ||
| 27 | @Before | 25 | @Before |
| 28 | public void warmUp() throws Exception { | 26 | public void warmUp() throws Exception { |
| 27 | + Logger.getLogger("").setLevel(Level.SEVERE); | ||
| 29 | try { | 28 | try { |
| 30 | - run(MILLION, MSG_SIZE, 15, 0); | 29 | + runTest(MILLION, MESSAGE_LENGTH, 15); |
| 31 | } catch (Throwable e) { | 30 | } catch (Throwable e) { |
| 32 | System.err.println("Failed warmup but moving on."); | 31 | System.err.println("Failed warmup but moving on."); |
| 33 | e.printStackTrace(); | 32 | e.printStackTrace(); |
| 34 | } | 33 | } |
| 35 | } | 34 | } |
| 36 | 35 | ||
| 37 | - @Ignore | 36 | + |
| 38 | @Test | 37 | @Test |
| 39 | public void basic() throws Exception { | 38 | public void basic() throws Exception { |
| 40 | - run(MSG_COUNT, MSG_SIZE, TIMEOUT, MIN_MPS); | 39 | + runTest(MILLION, MESSAGE_LENGTH, TIMEOUT); |
| 41 | } | 40 | } |
| 42 | 41 | ||
| 42 | + public void longHaul() throws Exception { | ||
| 43 | + runTest(MSG_COUNT, MESSAGE_LENGTH, TIMEOUT); | ||
| 44 | + } | ||
| 43 | 45 | ||
| 44 | - private void run(int count, int size, int timeout, double mps) throws Exception { | 46 | + private void runTest(int count, int size, int timeout) throws Exception { |
| 45 | - DecimalFormat f = new DecimalFormat("#,##0"); | 47 | + // Use a random port to prevent conflicts. |
| 46 | - System.out.print(f.format(count * THREADS) + | 48 | + int port = IOLoopTestServer.PORT + new Random().nextInt(100); |
| 47 | - (mps > 0.0 ? " messages: " : " message warm-up: ")); | ||
| 48 | - | ||
| 49 | - // Setup the test on a random port to avoid intermittent test failures | ||
| 50 | - // due to the port being already bound. | ||
| 51 | - int port = IOLoopServer.PORT + new Random().nextInt(100); | ||
| 52 | 49 | ||
| 53 | InetAddress ip = InetAddress.getLoopbackAddress(); | 50 | InetAddress ip = InetAddress.getLoopbackAddress(); |
| 54 | - IOLoopServer sss = new IOLoopServer(ip, THREADS, size, port); | 51 | + IOLoopTestServer server = new IOLoopTestServer(ip, THREADS, size, port); |
| 55 | - IOLoopClient ssc = new IOLoopClient(ip, THREADS, count, size, port); | 52 | + IOLoopTestClient client = new IOLoopTestClient(ip, THREADS, count, size, port); |
| 56 | 53 | ||
| 57 | - sss.start(); | 54 | + server.start(); |
| 58 | - ssc.start(); | 55 | + client.start(); |
| 59 | - delay(250); // give the server and client a chance to go | 56 | + delay(100); // Pause to allow loops to get going |
| 60 | 57 | ||
| 61 | - ssc.await(timeout); | 58 | + client.await(timeout); |
| 62 | - ssc.report(); | 59 | + client.report(); |
| 63 | 60 | ||
| 64 | - delay(1000); | 61 | + server.stop(); |
| 65 | - sss.stop(); | 62 | + server.report(); |
| 66 | - sss.report(); | ||
| 67 | } | 63 | } |
| 68 | 64 | ||
| 69 | } | 65 | } | ... | ... |
| ... | @@ -22,15 +22,18 @@ import java.util.concurrent.Semaphore; | ... | @@ -22,15 +22,18 @@ import java.util.concurrent.Semaphore; |
| 22 | import java.util.concurrent.TimeUnit; | 22 | import java.util.concurrent.TimeUnit; |
| 23 | import java.util.concurrent.TimeoutException; | 23 | import java.util.concurrent.TimeoutException; |
| 24 | 24 | ||
| 25 | +import static java.lang.String.format; | ||
| 26 | +import static java.lang.System.out; | ||
| 25 | import static org.onlab.junit.TestTools.delay; | 27 | import static org.onlab.junit.TestTools.delay; |
| 28 | +import static org.onlab.nio.IOLoopTestServer.PORT; | ||
| 26 | import static org.onlab.util.Tools.namedThreads; | 29 | import static org.onlab.util.Tools.namedThreads; |
| 27 | 30 | ||
| 28 | /** | 31 | /** |
| 29 | * Auxiliary test fixture to measure speed of NIO-based channels. | 32 | * Auxiliary test fixture to measure speed of NIO-based channels. |
| 30 | */ | 33 | */ |
| 31 | -public class IOLoopClient { | 34 | +public class IOLoopTestClient { |
| 32 | 35 | ||
| 33 | - private static Logger log = LoggerFactory.getLogger(IOLoopClient.class); | 36 | + private static Logger log = LoggerFactory.getLogger(IOLoopTestClient.class); |
| 34 | 37 | ||
| 35 | private final InetAddress ip; | 38 | private final InetAddress ip; |
| 36 | private final int port; | 39 | private final int port; |
| ... | @@ -55,6 +58,18 @@ public class IOLoopClient { | ... | @@ -55,6 +58,18 @@ public class IOLoopClient { |
| 55 | */ | 58 | */ |
| 56 | public static void main(String[] args) | 59 | public static void main(String[] args) |
| 57 | throws IOException, InterruptedException, ExecutionException, TimeoutException { | 60 | throws IOException, InterruptedException, ExecutionException, TimeoutException { |
| 61 | + startStandalone(args); | ||
| 62 | + | ||
| 63 | + System.exit(0); | ||
| 64 | + } | ||
| 65 | + | ||
| 66 | + /** | ||
| 67 | + * Starts a standalone IO loop test client. | ||
| 68 | + * | ||
| 69 | + * @param args command-line arguments | ||
| 70 | + */ | ||
| 71 | + public static void startStandalone(String[] args) | ||
| 72 | + throws IOException, InterruptedException, ExecutionException, TimeoutException { | ||
| 58 | InetAddress ip = InetAddress.getByName(args.length > 0 ? args[0] : "127.0.0.1"); | 73 | InetAddress ip = InetAddress.getByName(args.length > 0 ? args[0] : "127.0.0.1"); |
| 59 | int wc = args.length > 1 ? Integer.parseInt(args[1]) : 6; | 74 | int wc = args.length > 1 ? Integer.parseInt(args[1]) : 6; |
| 60 | int mc = args.length > 2 ? Integer.parseInt(args[2]) : 50 * 1000000; | 75 | int mc = args.length > 2 ? Integer.parseInt(args[2]) : 50 * 1000000; |
| ... | @@ -63,15 +78,13 @@ public class IOLoopClient { | ... | @@ -63,15 +78,13 @@ public class IOLoopClient { |
| 63 | 78 | ||
| 64 | log.info("Setting up client with {} workers sending {} {}-byte messages to {} server... ", | 79 | log.info("Setting up client with {} workers sending {} {}-byte messages to {} server... ", |
| 65 | wc, mc, ml, ip); | 80 | wc, mc, ml, ip); |
| 66 | - IOLoopClient sc = new IOLoopClient(ip, wc, mc, ml, IOLoopServer.PORT); | 81 | + IOLoopTestClient client = new IOLoopTestClient(ip, wc, mc, ml, PORT); |
| 67 | 82 | ||
| 68 | - sc.start(); | 83 | + client.start(); |
| 69 | delay(2000); | 84 | delay(2000); |
| 70 | 85 | ||
| 71 | - sc.await(to); | 86 | + client.await(to); |
| 72 | - sc.report(); | 87 | + client.report(); |
| 73 | - | ||
| 74 | - System.exit(0); | ||
| 75 | } | 88 | } |
| 76 | 89 | ||
| 77 | /** | 90 | /** |
| ... | @@ -84,7 +97,7 @@ public class IOLoopClient { | ... | @@ -84,7 +97,7 @@ public class IOLoopClient { |
| 84 | * @param port socket port | 97 | * @param port socket port |
| 85 | * @throws IOException if unable to create IO loops | 98 | * @throws IOException if unable to create IO loops |
| 86 | */ | 99 | */ |
| 87 | - public IOLoopClient(InetAddress ip, int wc, int mc, int ml, int port) throws IOException { | 100 | + public IOLoopTestClient(InetAddress ip, int wc, int mc, int ml, int port) throws IOException { |
| 88 | this.ip = ip; | 101 | this.ip = ip; |
| 89 | this.port = port; | 102 | this.port = port; |
| 90 | this.msgCount = mc; | 103 | this.msgCount = mc; |
| ... | @@ -112,8 +125,9 @@ public class IOLoopClient { | ... | @@ -112,8 +125,9 @@ public class IOLoopClient { |
| 112 | } | 125 | } |
| 113 | 126 | ||
| 114 | // Wait for all of them to get going | 127 | // Wait for all of them to get going |
| 115 | -// for (CustomIOLoop l : iloops) | 128 | + for (CustomIOLoop l : iloops) { |
| 116 | -// l.waitForStart(TIMEOUT); | 129 | + l.awaitStart(1000); |
| 130 | + } | ||
| 117 | 131 | ||
| 118 | // ... and Next open all connections; one-per-loop | 132 | // ... and Next open all connections; one-per-loop |
| 119 | for (CustomIOLoop l : iloops) { | 133 | for (CustomIOLoop l : iloops) { |
| ... | @@ -162,11 +176,10 @@ public class IOLoopClient { | ... | @@ -162,11 +176,10 @@ public class IOLoopClient { |
| 162 | */ | 176 | */ |
| 163 | public void report() { | 177 | public void report() { |
| 164 | DecimalFormat f = new DecimalFormat("#,##0"); | 178 | DecimalFormat f = new DecimalFormat("#,##0"); |
| 165 | - log.info("{} messages; {} bytes; {} mps; {} Mbs", | 179 | + out.println(format("Client: %s messages; %s bytes; %s mps; %s Mbs", |
| 166 | - f.format(messages.total()), | 180 | + f.format(messages.total()), f.format(bytes.total()), |
| 167 | - f.format(bytes.total()), | 181 | + f.format(messages.throughput()), |
| 168 | - f.format(messages.throughput()), | 182 | + f.format(bytes.throughput() / (1024 * msgLength)))); |
| 169 | - f.format(bytes.throughput() / (1024 * 128))); | ||
| 170 | } | 183 | } |
| 171 | 184 | ||
| 172 | 185 | ||
| ... | @@ -186,19 +199,20 @@ public class IOLoopClient { | ... | @@ -186,19 +199,20 @@ public class IOLoopClient { |
| 186 | } | 199 | } |
| 187 | 200 | ||
| 188 | @Override | 201 | @Override |
| 189 | - protected synchronized void removeStream(MessageStream<TestMessage> b) { | 202 | + protected synchronized void removeStream(MessageStream<TestMessage> stream) { |
| 190 | - super.removeStream(b); | 203 | + super.removeStream(stream); |
| 191 | - | 204 | + |
| 192 | - messages.add(b.messagesIn().total()); | 205 | + messages.add(stream.messagesIn().total()); |
| 193 | - bytes.add(b.bytesIn().total()); | 206 | + bytes.add(stream.bytesIn().total()); |
| 194 | - b.messagesOut().reset(); | 207 | + |
| 195 | - b.bytesOut().reset(); | 208 | +// out.println(format("Disconnected client; inbound %s mps, %s Mbps; outbound %s mps, %s Mbps", |
| 196 | -// | 209 | +// FORMAT.format(stream.messagesIn().throughput()), |
| 197 | - log.info("Disconnected client; inbound {} mps, {} Mbps; outbound {} mps, {} Mbps", | 210 | +// FORMAT.format(stream.bytesIn().throughput() / (1024 * msgLength)), |
| 198 | - IOLoopServer.FORMAT.format(b.messagesIn().throughput()), | 211 | +// FORMAT.format(stream.messagesOut().throughput()), |
| 199 | - IOLoopServer.FORMAT.format(b.bytesIn().throughput() / (1024 * 128)), | 212 | +// FORMAT.format(stream.bytesOut().throughput() / (1024 * msgLength)))); |
| 200 | - IOLoopServer.FORMAT.format(b.messagesOut().throughput()), | 213 | + |
| 201 | - IOLoopServer.FORMAT.format(b.bytesOut().throughput() / (1024 * 128))); | 214 | + stream.messagesOut().reset(); |
| 215 | + stream.bytesOut().reset(); | ||
| 202 | } | 216 | } |
| 203 | 217 | ||
| 204 | @Override | 218 | @Override | ... | ... |
| ... | @@ -18,15 +18,17 @@ import java.util.List; | ... | @@ -18,15 +18,17 @@ import java.util.List; |
| 18 | import java.util.concurrent.ExecutorService; | 18 | import java.util.concurrent.ExecutorService; |
| 19 | import java.util.concurrent.Executors; | 19 | import java.util.concurrent.Executors; |
| 20 | 20 | ||
| 21 | +import static java.lang.String.format; | ||
| 22 | +import static java.lang.System.out; | ||
| 21 | import static org.onlab.junit.TestTools.delay; | 23 | import static org.onlab.junit.TestTools.delay; |
| 22 | import static org.onlab.util.Tools.namedThreads; | 24 | import static org.onlab.util.Tools.namedThreads; |
| 23 | 25 | ||
| 24 | /** | 26 | /** |
| 25 | * Auxiliary test fixture to measure speed of NIO-based channels. | 27 | * Auxiliary test fixture to measure speed of NIO-based channels. |
| 26 | */ | 28 | */ |
| 27 | -public class IOLoopServer { | 29 | +public class IOLoopTestServer { |
| 28 | 30 | ||
| 29 | - private static Logger log = LoggerFactory.getLogger(IOLoopServer.class); | 31 | + private static Logger log = LoggerFactory.getLogger(IOLoopTestServer.class); |
| 30 | 32 | ||
| 31 | private static final int PRUNE_FREQUENCY = 1000; | 33 | private static final int PRUNE_FREQUENCY = 1000; |
| 32 | 34 | ||
| ... | @@ -34,8 +36,8 @@ public class IOLoopServer { | ... | @@ -34,8 +36,8 @@ public class IOLoopServer { |
| 34 | static final long TIMEOUT = 1000; | 36 | static final long TIMEOUT = 1000; |
| 35 | 37 | ||
| 36 | static final boolean SO_NO_DELAY = false; | 38 | static final boolean SO_NO_DELAY = false; |
| 37 | - static final int SO_SEND_BUFFER_SIZE = 1024 * 1024; | 39 | + static final int SO_SEND_BUFFER_SIZE = 128 * 1024; |
| 38 | - static final int SO_RCV_BUFFER_SIZE = 1024 * 1024; | 40 | + static final int SO_RCV_BUFFER_SIZE = 128 * 1024; |
| 39 | 41 | ||
| 40 | static final DecimalFormat FORMAT = new DecimalFormat("#,##0"); | 42 | static final DecimalFormat FORMAT = new DecimalFormat("#,##0"); |
| 41 | 43 | ||
| ... | @@ -59,19 +61,29 @@ public class IOLoopServer { | ... | @@ -59,19 +61,29 @@ public class IOLoopServer { |
| 59 | * @throws IOException if unable to crate IO loops | 61 | * @throws IOException if unable to crate IO loops |
| 60 | */ | 62 | */ |
| 61 | public static void main(String[] args) throws IOException { | 63 | public static void main(String[] args) throws IOException { |
| 64 | + startStandalone(args); | ||
| 65 | + System.exit(0); | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + /** | ||
| 69 | + * Starts a standalone IO loop test server. | ||
| 70 | + * | ||
| 71 | + * @param args command-line arguments | ||
| 72 | + */ | ||
| 73 | + private static void startStandalone(String[] args) throws IOException { | ||
| 62 | InetAddress ip = InetAddress.getByName(args.length > 0 ? args[0] : "127.0.0.1"); | 74 | InetAddress ip = InetAddress.getByName(args.length > 0 ? args[0] : "127.0.0.1"); |
| 63 | int wc = args.length > 1 ? Integer.parseInt(args[1]) : 6; | 75 | int wc = args.length > 1 ? Integer.parseInt(args[1]) : 6; |
| 64 | int ml = args.length > 2 ? Integer.parseInt(args[2]) : 128; | 76 | int ml = args.length > 2 ? Integer.parseInt(args[2]) : 128; |
| 65 | 77 | ||
| 66 | log.info("Setting up the server with {} workers, {} byte messages on {}... ", | 78 | log.info("Setting up the server with {} workers, {} byte messages on {}... ", |
| 67 | wc, ml, ip); | 79 | wc, ml, ip); |
| 68 | - IOLoopServer ss = new IOLoopServer(ip, wc, ml, PORT); | 80 | + IOLoopTestServer server = new IOLoopTestServer(ip, wc, ml, PORT); |
| 69 | - ss.start(); | 81 | + server.start(); |
| 70 | 82 | ||
| 71 | // Start pruning clients. | 83 | // Start pruning clients. |
| 72 | while (true) { | 84 | while (true) { |
| 73 | delay(PRUNE_FREQUENCY); | 85 | delay(PRUNE_FREQUENCY); |
| 74 | - ss.prune(); | 86 | + server.prune(); |
| 75 | } | 87 | } |
| 76 | } | 88 | } |
| 77 | 89 | ||
| ... | @@ -84,7 +96,7 @@ public class IOLoopServer { | ... | @@ -84,7 +96,7 @@ public class IOLoopServer { |
| 84 | * @param port listen port | 96 | * @param port listen port |
| 85 | * @throws IOException if unable to create IO loops | 97 | * @throws IOException if unable to create IO loops |
| 86 | */ | 98 | */ |
| 87 | - public IOLoopServer(InetAddress ip, int wc, int ml, int port) throws IOException { | 99 | + public IOLoopTestServer(InetAddress ip, int wc, int ml, int port) throws IOException { |
| 88 | this.workerCount = wc; | 100 | this.workerCount = wc; |
| 89 | this.msgLength = ml; | 101 | this.msgLength = ml; |
| 90 | this.ipool = Executors.newFixedThreadPool(workerCount, namedThreads("io-loop")); | 102 | this.ipool = Executors.newFixedThreadPool(workerCount, namedThreads("io-loop")); |
| ... | @@ -107,9 +119,10 @@ public class IOLoopServer { | ... | @@ -107,9 +119,10 @@ public class IOLoopServer { |
| 107 | } | 119 | } |
| 108 | apool.execute(aloop); | 120 | apool.execute(aloop); |
| 109 | 121 | ||
| 110 | -// for (CustomIOLoop l : iloops) | 122 | + for (CustomIOLoop l : iloops) { |
| 111 | -// l.waitForStart(TIMEOUT); | 123 | + l.awaitStart(TIMEOUT); |
| 112 | -// aloop.waitForStart(TIMEOUT); | 124 | + } |
| 125 | + aloop.awaitStart(TIMEOUT); | ||
| 113 | } | 126 | } |
| 114 | 127 | ||
| 115 | /** | 128 | /** |
| ... | @@ -121,10 +134,11 @@ public class IOLoopServer { | ... | @@ -121,10 +134,11 @@ public class IOLoopServer { |
| 121 | l.shutdown(); | 134 | l.shutdown(); |
| 122 | } | 135 | } |
| 123 | 136 | ||
| 124 | -// for (CustomIOLoop l : iloops) | 137 | + for (CustomIOLoop l : iloops) { |
| 125 | -// l.waitForFinish(TIMEOUT); | 138 | + l.awaitStop(TIMEOUT); |
| 126 | -// aloop.waitForFinish(TIMEOUT); | 139 | + } |
| 127 | -// | 140 | + aloop.awaitStop(TIMEOUT); |
| 141 | + | ||
| 128 | messages.freeze(); | 142 | messages.freeze(); |
| 129 | bytes.freeze(); | 143 | bytes.freeze(); |
| 130 | } | 144 | } |
| ... | @@ -134,11 +148,10 @@ public class IOLoopServer { | ... | @@ -134,11 +148,10 @@ public class IOLoopServer { |
| 134 | */ | 148 | */ |
| 135 | public void report() { | 149 | public void report() { |
| 136 | DecimalFormat f = new DecimalFormat("#,##0"); | 150 | DecimalFormat f = new DecimalFormat("#,##0"); |
| 137 | - log.info("{} messages; {} bytes; {} mps; {} Mbs", | 151 | + out.println(format("Server: %s messages; %s bytes; %s mps; %s Mbs", |
| 138 | - f.format(messages.total()), | 152 | + f.format(messages.total()), f.format(bytes.total()), |
| 139 | - f.format(bytes.total()), | 153 | + f.format(messages.throughput()), |
| 140 | - f.format(messages.throughput()), | 154 | + f.format(bytes.throughput() / (1024 * msgLength)))); |
| 141 | - f.format(bytes.throughput() / (1024 * 128))); | ||
| 142 | } | 155 | } |
| 143 | 156 | ||
| 144 | /** | 157 | /** |
| ... | @@ -175,11 +188,11 @@ public class IOLoopServer { | ... | @@ -175,11 +188,11 @@ public class IOLoopServer { |
| 175 | messages.add(stream.messagesIn().total()); | 188 | messages.add(stream.messagesIn().total()); |
| 176 | bytes.add(stream.bytesIn().total()); | 189 | bytes.add(stream.bytesIn().total()); |
| 177 | 190 | ||
| 178 | - log.info("Disconnected client; inbound {} mps, {} Mbps; outbound {} mps, {} Mbps", | 191 | +// out.println(format("Disconnected server; inbound %s mps, %s Mbps; outbound %s mps, %s Mbps", |
| 179 | - FORMAT.format(stream.messagesIn().throughput()), | 192 | +// FORMAT.format(stream.messagesIn().throughput()), |
| 180 | - FORMAT.format(stream.bytesIn().throughput() / (1024 * 128)), | 193 | +// FORMAT.format(stream.bytesIn().throughput() / (1024 * msgLength)), |
| 181 | - FORMAT.format(stream.messagesOut().throughput()), | 194 | +// FORMAT.format(stream.messagesOut().throughput()), |
| 182 | - FORMAT.format(stream.bytesOut().throughput() / (1024 * 128))); | 195 | +// FORMAT.format(stream.bytesOut().throughput() / (1024 * msgLength)))); |
| 183 | } | 196 | } |
| 184 | 197 | ||
| 185 | @Override | 198 | @Override | ... | ... |
-
Please register or login to post a comment