I found out that windows telnet should be considered a "slow" client which
caused my server OOM. After I used my own decode client, I got
5000messages/sec(10kmessages/sec should be okay). Thanks Mina and Trustin.

2008/4/3 Steve Johns <[EMAIL PROTECTED]>:

> Thanks a lot.
>
> Actually I fount out Thread.sleep(1) didn't work as what I expected. On
> Windows XP, the minimum time Thread Acutally could sleep is 15ms. Which
> meant my example didn't really simulate messages as much as expected. What I
> tried to do was to generate 5k - 10k messages/sec and send them to the
> client.
>
>   On Thu, Apr 3, 2008 at 5:55 PM, "이희승 (Trustin Lee) <[EMAIL PROTECTED]>
> wrote:
>
> > 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/
> >
> >
>

Reply via email to