I was not able to reproduce OOM in my laptop (Intel Core 2 Duo T9300 2.5GHz 6MB L2 Cache, 2GB RAM, JDK 1.6.0.10-beta). The following is the source code I have used - it was simply ported to MINA 2:
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
public class MyHandler extends IoHandlerAdapter {
IoSession mySession;
public static void main(String[] args) throws Exception {
SocketAcceptor acceptor = new NioSocketAcceptor(2);
// Prepare the configuration
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset
.forName("UTF-8"))));
acceptor.getSessionConfig().setTcpNoDelay(true);
// Bind
acceptor.setHandler(new MyHandler());
acceptor.bind(new InetSocketAddress(8080));
System.out.println("Listening on port 8080");
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) {
cause.printStackTrace();
// Close connection when unexpected exception is caught.
session.close();
}
@Override
public void sessionCreated(IoSession session) throws Exception {
mySession = session;
new MyThread().start();
}
private class MyThread extends Thread {
@Override
public void run() {
String message =
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
while (true) {
mySession.write(message);
mySession.write(message);
mySession.write(message);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
On the client side, I used netcat:
$ nc localhost 8080
Please note my test was run in Linux. I'm not sure about Windows
unfortunately. There's also netcat for Windows IIRC - you could try
that instead of Windows telnet, which doesn't seem to perform very well.
HTH,
Steve Johns wrote:
> I wrote the following testing program. I used one thread to simulate the
> incoming datafeed. Sleep(1) = 1000messages/sec(I added 3
> session.write(message)), then 3000 messages / sec roughly sent to client.
> My server CPU reaches 70% with one telnet client on the same machine.
> -----------------------------------------------------------------------------------
> public class MyHandler extends IoHandlerAdapter {
> IoSession mySession;
>
> public static void main(String[] args) throws Exception {
> IoAcceptor acceptor = new SocketAcceptor(2,
> Executors.newCachedThreadPool());
>
> ByteBuffer.setUseDirectBuffers(false);
> ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
>
> // Prepare the configuration
> SocketAcceptorConfig cfg = new SocketAcceptorConfig();
> cfg.setReuseAddress(true);
> cfg.setThreadModel(ThreadModel.MANUAL);
> //cfg.getFilterChain().addLast("logger", new LoggingFilter());
> cfg.getFilterChain().addLast(
> "codec",
> new ProtocolCodecFilter(new TextLineCodecFactory(Charset
> .forName("UTF-8"))));
> cfg.getSessionConfig().setTcpNoDelay(true);
>
> // Bind
> acceptor.bind(new InetSocketAddress(8080),
> new MyHandler(), cfg);
>
> System.out.println("Listening on port 8080");
> }
>
>
> public void exceptionCaught(IoSession session, Throwable cause) {
> cause.printStackTrace();
> // Close connection when unexpected exception is caught.
> session.close();
> }
>
> public void sessionCreated(IoSession session) throws Exception {
> mySession = session;
>
> new MyThread().start();
> }
>
> private class MyThread extends Thread {
> public void run() {
> String message =
> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
>
> while (true) {
>
> mySession.write(message);
> mySession.write(message);
> mySession.write(message);
>
> try {
> Thread.sleep(1);
> }
> catch (InterruptedException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> }
> }
> }
> }
>
> 2008/4/2 Steve Johns <[EMAIL PROTECTED]
> <mailto:[EMAIL PROTECTED]>>:
>
> Actually I used windows console telnet command to connect to the
> server.
>
>
> On Wed, Apr 2, 2008 at 8:54 PM, "이희승 (Trustin Lee)
> <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:
>
> Could you please upgrade to 1.1.6, 1.1.7-SNAPSHOT, 2.0.0-M1 or
> 2.0.0-M2-SNAPSHOT first?
>
> I don't think telnet client can be slow if it's implemented
> properly.
>
> Thanks,
>
> Steve Johns wrote:
> > Thank you very much.
> >
> > 1) I used Mina1.1.5 NOT 2.0 M1.
> > 2) Actually telnet client is on the same machine as my Mina
> server. Could it
> > be SLOW?
> >
> > In order to test how fast Mina could write, I modified the
> > ReverseProtocolHandler example. I added following code in the
> > ReverseProtocolHandler:
> >
> > public void sessionCreated(IoSession session) throws Exception {
> > String message =
> >
> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
> >
> > while (true) {
> > for (int i = 0; i < 5000; i++)
> > session.write(message);
> >
> > Thread.sleep(500);
> > }
> > }
> >
> > and I opened a telnet client connect to it. However, when I
> PrintGCDetails,
> > i obversed that GC is so busy to collect (take 0.15 sec to
> collect once, and
> > keep collecting )and after a while it seems too slow to
> collect. Eventually
> > OOM.
> >
> > I don't know if my code added was correct or NOT. I was
> impressed when you
> > said your server could handle 140k message/sec. How could you
> possible do
> > that? ^^
> > On Wed, Apr 2, 2008 at 11:30 AM, "이희승 (Trustin Lee)
> <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>>
> > wrote:
> >
> >> Hi Steve,
> >>
> >> OOM can be raised when the write request rate is so high.
> There are two
> >> possible issues:
> >>
> >> 1) MINA NioProcessor is writing slowly.
> >> 2) Receiving party (i.e. telnet client) is receiving slowly.
> >>
> >> If #1 is the case, we need to fix it. However, I was able to
> achieve
> >> 140k messages per second for asynchronous messaging and 20k
> messages per
> >> second for synchronous messaging in my private performance test
> >> performed in gigabit network recently. Just in case your
> scenario is
> >> triggering a hidden bug in MINA, please provide us a simple test
> >> application.
> >>
> >> HTH,
> >>
> >> Steve Johns wrote:
> >>> So far Mina does a good job in my recent project until
> yesterday. I am
> >>> working a GW server handling 10k - 15k incoming messages/sec
> with NOT
> >> very
> >>> big sizes and send them to clients. The weird thing is the
> program has
> >> NO
> >>> problem to consume the incoming messages(decoding, read).
> However, when
> >> a
> >>> simple telnet client connected to my server(same machine), I
> observed
> >> the GC
> >>> taking 0.5 - 1.0sec to do GC every time and eventually
> OOM(GC is NOT
> >>> faster??). I got serveral questions:
> >>> 1) just wonder if mina is able to write that many of
> messages? I believe
> >>> telnet client on the same machine NOT considered to be a
> SLOW client,
> >> right?
> >>> 2) IF 1) Yes, the problem seems GC limitation but NOT Mina
> problem?
> >>>
> >>> Thanks.
> >>>
> >> --
> >> Trustin Lee - Principal Software Engineer, JBoss, Red Hat
> >> --
> >> what we call human nature is actually human habit
> >> --
> >> http://gleamynode.net/
> >>
> >>
>
> --
> Trustin Lee - Principal Software Engineer, JBoss, Red Hat
> --
> what we call human nature is actually human habit
> --
> http://gleamynode.net/
>
>
>
--
Trustin Lee - Principal Software Engineer, JBoss, Red Hat
--
what we call human nature is actually human habit
--
http://gleamynode.net/
signature.asc
Description: OpenPGP digital signature
