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/

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to