Thanks the reply, you taught me a couple things.  My email that is on this
list is on my home
computer and unfortunately the power has been out on my street all day so
I am just reading this now.  realize when I say 1 million unique hits I
mean unique page visits not unique users, its close but still not the
same.  I still think i am pretty cool though. hahaha.  

You are right I am using cookies to keep my sessionid in check.  I have
been doing some tests and watching the logs when I login I see the
SessionListener messages with all the session
created and all the attribute added info.  I have timed it and when a
session goes inactive for the session timeout time it then issues the
sessiondestroyed and attribute removed commands.  It certainly seems to
work properly, and it is not allocating a new session per page.  I might
add that session.invalidate just to be safe
though.  Looking at your suicide example and some of the responses from
others on the list I am wondering what constitutes too much in terms of
allocating session objects?  Is there anyway to trace how big sessions are
growing to?  


It is difficult dealing with these problems while I am on my production
box here, but when I initially
rolled out the tomcat powered site it didn't have quite as much going on
and was only like 20 jsp pages now it is a couple hundred pages and lots
more beans per session.  Tomcat was certainly a lot stabler when the site was
a lot more cut and dry.   I migrated recently from 3.2 to 4.1.12 hoping
that would help with some of these problems but the problems still seem
to be there just with different error messages.  I have another tomcat
server up running just some
servlets that never create any session objects.  That server seems never
to have any of these problems.   So I am certainly fishing for problems in
my jsp code.  I also tend to think there are more problems with the JDK
rather than tomcat.  

You know I get these warning constantly do you know what the heck that is
all about?

Dec 3, 2002 3:31:47 PM org.apache.jk.common.ChannelSocket 
processConnection
WARNING: server has closed the current connection (-1)


And I also get some of these, do you know what this means?:
Dec 3, 2002 1:23:20 PM org.apache.jk.server.JkCoyoteHandler action
SEVERE: Error in action code
java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at
java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:380)
        at
org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:558)
        at
org.apache.jk.server.JkCoyoteHandler.action(JkCoyoteHandler.java:354)
        at org.apache.coyote.Response.action(Response.java:216)
        at org.apache.coyote.Response.finish(Response.java:336)
        at
org.apache.coyote.tomcat4.CoyoteResponse.finishResponse(CoyoteResponse.java:504)
        at
org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:224)
        at
org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:256)
        at
org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:361)
        at
org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:563)
        at
org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:535)
        at
org.apache.jk.common.SocketConnection.runIt(ChannelSocket.java:638)
        at
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:533)
        at java.lang.Thread.run(Thread.java:536)





 
thanks julius and everyone else
Please keep helping

ryan





On Mon, 2 Dec 2002, Julius Davies wrote:

> 
> 
> ryan,
> 
> Wow!  You get 1 million unique hits a month (1 unique hit every 2 seconds) handled 
>by a single pc running linux.  That's awesome!  When I was originally writing, I 
>didn't realize you were dealing with live, production issues...  I hope I can help.
> 
> In my office I don't have direct access to that kind of load, and so I have to 
>simulate it.  My original comments were more coming from that direction:  I pictured 
>you running some home-grown load test which forgot to take cookies into account, and 
>consequently was experiencing a memory spike.
> 
> In real production usage almost all the clients support cookies.  Very rare for a 
>person to have "cookies" disabled in their browser.  
> 
> >So you are saying that possible  it is not only creating a new session
> >per new user but per page each user accesses?
> >If so please teach me how to fix my problems with my coding.
> 
> The good news in reply to this: a new session per page access is (very) unlikely.  I 
>didn't mean to scare you.  I didn't realize the performance problems you were 
>reporting were real life.  My thinking originally had me imagining that a problem 
>like you were experiencing would come from over-zealous simulation.  The bad news is, 
>I guess, that your problem is currently impairing your production website!
> 
> >I do not use cookies and I do not call
> >"session.setMaxInactiveInterval()" or
> >"session.invalidate()" or response.encodeURL().  In fact I am completely
> >ignorant about these calls.  I assume my sessions are closed automatically
> >by tomcat when there is no usage from that client for 15 minutes.  So can
> >I assume session.invalidate() kills a session.  How and in what situation
> >would I use this method?
> 
> If you ever use "session.setAttribute()" or "session.getAttribute()" in a jsp, then 
>you are using cookies.  There's a chance you are using URL rewriting instead, but 
>that's not the default behaviour.  The default behaviour is to use cookies.  Tomcat 
>will do this whether you use the "session" object or not, but it only starts to weigh 
>down your application when you start calling "setAttribute()" on it.  For example, 
>this would be suicide:
> 
> =================================
> suicide.jsp
> =================================
> <%
>    // Allocate huge StringBuffer:
>    StringBuffer buf = new StringBuffer( 1000000 );
>    session.setAttribute( "Big-Waste-O-Space", buf );
> %>
> <html>
> <head>
> <title>Help!</title>
> </head>
> <body>
> <h1>Help!</h1>
> <p>I'm running out of memory!</p>
> </body>
> </html>
> =================================
> 
> On the other hand, you'd have a hard time noticing:
> 
> =================================
> session.setAttribute( "Small-Waste-O-Space", new Integer( 42 ) );
> =================================
> 
> Now, a short tutorial.  Since http is stateless, the concept of a "session" takes 
>some effort.  How does Tomcat remember the user?
> 
> Let's use, for example, this jsp, named "hello.jsp":
> 
> =================================
> hello.jsp
> =================================
> <% Object o = session; %>
> <html>
> <head>
> <title>Welcome</title>
> </head>
> <body>
> <h1>Hello</h1>
> <p>Welcome to my page.</p>
> </body>
> </html>
> =================================
> 
> As you can see, the "session" object is mentioned by name.  But nothing interesting 
>is done to it.  Look at the headers Tomcat responds with, however, when I try to 
>telnet into my server:
> 
> =================================
> haplo $ telnet localhost 8080
> Trying...
> Connected to localhost.
> Escape character is '^]'.
> GET /hello.jsp HTTP/1.0    <-- I'm typing this by hand.
> 
> 
> HTTP/1.1 200 OK
> Content-Type: text/html;charset=ISO-8859-1
> Connection: close
> Date: Tue, 03 Dec 2002 05:34:43 GMT
> Server: Apache Tomcat/4.0.4-b2 (HTTP/1.1 Connector)
> Set-Cookie: JSESSIONID=24BF830B73E7C313909FC4255DD3CD44;Path=/
> 
> 
> 
> <html>
> <head>
> <title>Welcome</title>
> </head>
> <body>
> <h1>Hello</h1>
> <p>Welcome to my page.</p>
> </body>
> </html>
> 
> Connection closed.         
> =================================
> 
> That "Set-Cookie" header is the cookie Tomcat expects me to quote back to it on any 
>subsequent requests I may make from now on.  That's how the notion of a "session" is 
>possible:  big random strings that no-one else in their right mind would ever think 
>to mention in their day-to-day http requests.
> 
> Watch what a modern browser then says on a subsequent request (as opposed to my 
>hand-typing telnet browser :-] ):
> 
> =================================
> GET /index.jsp HTTP/1.1
> Host: localhost:8080
> User-Agent: Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.2a) Gecko/20020913
> Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plai
> n;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1
> Accept-Language: en-us, en;q=0.50
> Accept-Encoding: gzip, deflate, compress;q=0.9
> Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66
> Keep-Alive: 300
> Connection: keep-alive
> Cookie: JSESSIONID=24BF830B73E7C313909FC4255DD3CD44
> Cache-Control: max-age=0
> 
> 
> =================================
> 
> The difference is small:  the server says "Set-Cookie:" and the browser says 
>"Cookie:".
> 
> Notice how I'm cheating:  I cut & paste the original JSESSIONID from my telnet 
>session into this one.  That's called "hijacking" a session.  My Mozilla browser is 
>now masquerading as my original telnet browser.  Tomcat thinks they are the same 
>person.  Okay, that was probably too confusing...  consider it a joke for the 
>Tomcat-User list.
> 
> But, I hope you see how it works:   Tomcat provides ("Set-Cookie:") a special 
>"secret code" for the browser to identify itself with from then on.  By even coming 
>up with that "secret code", Tomcat has to allocate some resources so that Tomcat can 
>later recognize that same code when it is quoted back ("Cookie:") by the browser.  As 
>you can imagine, Tomcat probably gives out more secret codes than it ends up getting 
>back... people might leave the site after the first page, or their browser might just 
>not support that header:
> 
> Cookie: JSESSIONID=24BF830B73E7C313909FC4255DD3CD44
> 
> That doesn't mean Tomcat can afford to forget any of them.
> 
> If Tomcat doesn't recieve the "secret code" (the cookie) for a specified amount of 
>time, in your case, 15 minutes, Tomcat forgets about it.  The code and the objects 
>associated with the session are dropped.
> 
> In summary:  in real-life use, the abstraction of a "session" provided to jsp 
>writers by Tomcat and other web containers is going to work perfectly fine, with no 
>resource compromise.  Your well-designed application already needed those resources 
>stored in the session anyway.  Sessions only add a few more references/pointers (at 4 
>bytes a shot - cheap!) to those resources.
> 
> Over 99% of browsers support cookies.  There are no hidden dangers with sessions.
> 
> Now, onto the rest of email.
> 
> > I assume session.invalidate() kills a session.  How and in what situation
> would I use this method?
> 
> Use it on a "logoff.jsp".  Inside "logoff.jsp" just paste:
> 
> ============================
> <% session.invalidate() %>
> ============================
> 
> > I assume my sessions are closed automatically
> by tomcat when there is no usage from that client for 15 minutes.
> 
> That is correct.  Tomcat probably calls "invalidate()" just like you would on a 
>"logoff.jsp" page.  Code re-use.  :-)
> 
> > What does setMaxInactiveInterval do and how is that applied?
> 
> You could use this to override the 15 minute application-wide timeout you've 
>configured on a per/jsp or per/servlet basis.  For example, maybe you would like to 
>set you "login.jsp's" session timeout to 2 minutes, but after the user successfully 
>logs in set it back to 15 minutes.  This way people who fail to login, or don't 
>bother trying, use up less session resources.  However, once you've set the session 
>to 2 minutes on one page, it's going to stay 2 minutes unless you state otherwise 
>somewhere else.
> 
> I imagine that would work.  I wouldn't bother messing around like that, though.  Too 
>finicky.  Buy a 2nd server and cluster them.  :-)
> 
> > And same questions on  response.encodeURL()?
> 
> This only applies if you're not using cookies.  But it's not a bad idea - makes your 
>application more portable, since the cookie/no-cookie configuration is administrator 
>controlled, not developer controlled.  Basically you run every internal link (to 
>other jsps or servlets) through "encodeURL()", et voila, sessions without cookies if 
>ever needed.  I haven't used this, so my explanation here may be a little fluffy.
> 
> 
> >Tomcat starts out with 128 megs and baloons up pretty quickly to 300 megs.  It
> >often exceeds that, there also seems to be a huge thread count. 
> 
> Perhaps you have a thread problem (yikes!).  My experience with threads and Tomcat 
>is very minimal, but in my experience threads use a lot of memory.  I believe they 
>keep references to their entire call-stack (methods calling methods), and so when 
>they hang a lot of references remain unavailable to the garbage collector.  Don't 
>worry about Tomcat:  in my experience on this mailing list Tomcat's thread usage is 
>perfect.  It's always developers that mess up.  Don't feel bad if this is the case.  
>You only get good (err... marginally less dangerous) by screwing up several times.  I 
>almost took down a medium sized financial institution's website I was developing due 
>to some shoddy thread work.  Debugging multi-threaded apps when the threads go bad is 
>fun in a way.
> 
> The thing to remember with web applications is that each request, from start to 
>finish, is going to need a thread.  If the thread gets lost somewhere along the way, 
>it's not coming back.  Some tricks that seem to work for me (see what Tomcat-User 
>thinks):
> 
> Don't use wait() when you can use wait( 60000 )!  At least you'll recover the thread 
>a minute later.
> 
> Don't use notify().  Use notifyAll() instead.
> 
> In my opinion "wait(void)" and "notify()" are not meant for mortals.  Especially not 
>in conjunction with web applications.
> 
> 
> Good luck, ryan!  Hopefully we can help you fix your website, and help Tomcat 
>conquer the world!
> 
> It would be a good idea to try and isolate your problem.  Can you get the memory 
>usage to balloon up during a simulation in a test environment?  Of course, you're 
>probably frantically trying to fix your production site... in which case banging out 
>fear-inspired fixes can also work quite well, too.
> 
> I do envy your close proximity to such a respectable load on your computer.  I wish 
>I could see what my own code would do at such use.  My company plays it too safe to 
>ever know:  when the CPU hits 35% in top, they add a new computer to the cluster.
> 
> yours,
> 
> Julius
> [EMAIL PROTECTED]
> 
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> Sent: Mon 12/2/2002 2:31 PM
> To:   Julius Davies
> Cc:   Tomcat Users List
> Subject:      RE: Memory/Performance
> Thanks for replying I think you are on the right track i must not be doing
> something right here. You certainly got me confused and that can only be a
> step in the right direction. I have my session-timeout set to 15.  My load
> is being generated from massive usage i get a million unique hits a month
> and have a lot of customers simultaneously logged in at once.  Tomcat
> starts out with 128 megs and baloons up pretty quickly to 300 megs.  It
> often exceeds that, there also seems to be a huge thread count.   
> 
> I do not use cookies and I do not call
> "session.setMaxInactiveInterval()" or
> "session.invalidate()" or response.encodeURL().  In fact I am completely
> ignorant about these calls.  I assume my sessions are closed automatically
> by tomcat when there is no usage from that client for 15 minutes.  So can
> I assume session.invalidate() kills a session.  How and in what situation
> would I use this method?
> 
> What does setMaxInactiveInterval do and how is that applied?
> 
> 
> And same questions on  response.encodeURL()?
> 
> 
> So you are saying that possible  it is not only creating a new session
> per new user but per page each user accesses? 
> If so please teach me how to fix my problems with my coding.
> 
> -ryan
> 
> 
> On Mon, 2 Dec 2002, Julius Davies wrote:
> 
> > 
> > Developer,
> > 
> > Hello.  I use Tomcat 4.1.12 standalone.  I was just thinking about what you were 
>saying, especially "[...] I would think the memory stamp would correspondingly shrink 
>when all these sessions are closed and it doesn't".
> > 
> > I noticed this section in the default "web.xml":
> > 
> >   <!-- ==================== Default Session Configuration ================= -->
> >   <!-- You can set the default session timeout (in minutes) for all newly   -->
> >   <!-- created sessions by modifying the value below.                       -->
> > 
> >     <session-config>
> >         <session-timeout>30</session-timeout>
> >     </session-config>
> > 
> > So, by default on my machine sessions will stay around for 30 minutes, unless 
>either "session.setMaxInactiveInterval()" or "session.invalidate()" was called.  I 
>haven't changed this file since I installed Tomcat, and so I'm assuming you have the 
>same file.
> > 
> > Are you calling either of those methods - invalidate or setMaxInactiveInterval?  
>Or when you say "these sessions are closed", do you mean they time out after 30 
>minutes?
> > 
> > Secondly, what are you doing to generate all this (server-crashing!) load?  
>Obviously you're not going to call "session.invalidate()" on the same page that you 
>created the session.  That would be pointless...  so here comes an interesting 
>possibility:  suppose a significant portion of your load didn't support cookies?  Or, 
>if you were using URL rewriting for the sessions, suppose you forgot to use 
>"response.encodeURL()"?  In both cases the result is the same:
> > 
> > Sessions are being created for a client, but the client won't remember his special 
>"session id".  This means a new session is created for this client with every request 
>he makes!  
> > 
> > So, I have three questions I need to know:
> > 
> > 1.)  What kind of load is Tomcat experiencing on your machine, and where is this 
>load coming from?
> > 
> > 2.)  Does your load support cookies?  Is the "session id" being remembered by the 
>client?
> > 
> > 3.)  How are you closing your sessions?
> > 
> > Suppose each of your sessions weighed in at 512 bytes.  If your load, at, let's 
>pretend 10/hits second, didn't support cookies, you're going to need ~15mb to hold on 
>to 30 minutes of sessions before they start expiring.  This is because each hit is 
>going to create a new session.
> > 
> > Tomcat User please correct any mistakes I may have made here!  
> > 
> > 
> > Julius Davies, Programmer, CUCBC
> > Email: [EMAIL PROTECTED], Ph: 604.730.6385
> > 
> > 
> > 
> > > -----Original Message-----
> > > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> > > Sent: Monday, December 02, 2002 1:24 PM
> > > To: Tomcat Users List
> > > Subject: Re: Memory/Performance
> > > 
> > > 
> > > Thanks for your comments.  Well all my jspcode is definitely 
> > > session happy
> > > and I am creating several
> > > objects per session.  The objects I am creating consist of mostly
> > > string, int and floats, probably up to like 20 of each.  
> > > Although i create
> > > a large application pool of jdbc
> > > connections I am fairly positive that this is not the problem 
> > > because I
> > > use this pooling model in several applications that don't 
> > > seem to have a
> > > problem.  I realize that every time a session is created all 
> > > these objects
> > > must be allocated, and that should cause the memory blob to 
> > > keep growing
> > > as the session count increase but I would think the memory stamp would
> > > correspondingly shrink when all these sessions are closed and it
> > > doesn't.  I am basing this on tomcats crashing or slow behavior
> > > in conjunction with monitoring the processes and memory 
> > > usage.  What other
> > > information can I share that would help?  Like I said I don't 
> > > know if this
> > > is tomcat or me or a bit a both so I am jsut throwing out 
> > > what seems to be
> > > going on and looking for insight?  
> > > 
> > > 
> > > 
> > > 
> > > On Mon, 2 Dec 2002, Michael Nicholson wrote:
> > > 
> > > > I suppose it depends on what you're doing, which, 
> > > unfortunately, I don't
> > > > know.
> > > > 
> > > > If you're overly filling your session w/ objects, or if you 
> > > have a session
> > > > scoped bean that is spiraling out of control or something, 
> > > that might lead
> > > > to the problem, or if you create/leave open jdbc 
> > > connections or stuff like
> > > > that.  I'm running tomcat 4.03 on a much less beefy system, 
> > > and I don't ever
> > > > notice any memory issues, now that I make sure I close and null my
> > > > connections and such.
> > > > 
> > > > More info on what's happening might help, though..
> > > > 
> > > > 
> > > > ----- Original Message -----
> > > > From: <[EMAIL PROTECTED]>
> > > > To: "Tomcat Users List" <[EMAIL PROTECTED]>
> > > > Sent: Monday, December 02, 2002 3:51 PM
> > > > Subject: Memory/Performance
> > > > 
> > > > 
> > > > > I find that tomcat's memory stamp grows continually until 
> > > eventually there
> > > > > are out of memory errors or it just bogs down.  I am 
> > > running on jdk1.4_1,
> > > > > tomcat 4.1.12, apache 1.27, mod_jk on the linux 2.2 
> > > kernel.  The box I am
> > > > > operating on has 1gig of memory and has dual gigahertz 
> > > processors.  I
> > > > > believe that tomcat has some serious memory leaks and/or 
> > > I am not writing
> > > > > my jsppages properly.  So i would like to ask two questions:
> > > > >
> > > > >
> > > > > 1)Assuming tomcat has memory issues what can I do to control them?
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > 2)What techniques would you suggest to write jsppages 
> > > that help keep
> > > > > memory consumption down?  Are there ways to write 
> > > jsppages that makes them
> > > > > more "garbage collection friendly"?
> > > > >
> > > > > please comment....
> > > > >
> > > > >
> > > > > --
> > > > > To unsubscribe, e-mail:
> > > > <mailto:[EMAIL PROTECTED]>
> > > > > For additional commands, e-mail:
> > > > <mailto:[EMAIL PROTECTED]>
> > > > >
> > > > >
> > > > 
> > > > 
> > > > --
> > > > To unsubscribe, e-mail:   
> > <mailto:[EMAIL PROTECTED]>
> > > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
> > > 
> > > 
> > 
> > 
> > --
> > To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
> > 
> > 
> 
> 
> 
> 
> 


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to