[Zope-dev] Zope/OpenBSD: Too many open files

Ricardo Bermell rbermell@amutis.com
Tue, 27 Mar 2001 18:59:15 +0200


Zope (started from a shell) in OpenBSD gets locked 
too easyly because of the low default limit for 
open file descriptors (64).   

When Zope gets locked shows repeatedly this message
"PROBLEM(100) ZServer warning: server accept() threw an exception",
locking effectively also the console.

Conditions in wich i have tested the problem:

- OpenBSD 2.7
- Zope 2.3.0 
- 'bash' shell

How to reproduce the problem:

1. Anotate your current limit for open files
   (after this test you will want to restore this value):
   type "ulimit -a | grep 'open files'"
   My systems gives "open files   64"

2. If you want to crash zope sooner, set a lower limit 
   (for example, 32) with "ulimit -n 32".

3. Start Zope from your shell (mine is 'bash') with 
   zope 'start' script.

   Before, in the call to z2.py (in 'start') include option 
   -D for 'debugging' (if not, all will be the same, exept 
   that you won't see the "Problem(100)" message

4. Type "fstat | grep run-zope | grep stream | wc -l",
  (where 'run-zope' is the user account you use to run zope)

  or "fstat | grep 11789 | grep stream | wc -l"
  (where '11789' is the pid of zope process)

  That gives you the number of open streams for zope,
  which initially is 1.

  Each open stream consumes one file descriptor.

5. From a browser of another computer, open any (one) page
   of your zope site (http://your.zope.server:8080, where 
   8080 is the port you've open for zope).

   That will open 2 tcp streams in your server. 
   Test, as before: "fstat | grep run-zope | grep stream | wc -l"
   This gives me 3 streams in total (1 initial + 2 for browser)

6. Close your browser and see how the open streams persists
   Type again: "fstat | grep run-zope | grep stream | wc -l"
   You will see 3 yet.

7. Repeat this operation many times (open browser, get http page,
   close browser), observing how the number of open streams increases 
   in steps of 2.

   After m repetitions your browser does not get response from Zope:
   your Zope service and your console stops attending requests.

8. Stop your Zope from another console. (This liberates also
   the locked console)

9. Test distinct values for 'ulimit -n'. You will observe that, 
   for a given value of 'ulimit -n' the number of repetitions (m) 
   needed to hang your zope will be always the same.

   (You must run 'ulimit -n' _before_ run zope for it to get effect,
   not _while_ running zope)


Questions which i'm not able to answer:

- How many time an open tcp stream lives after you open a page from
  your browser?

- How many time an open tcp stream lives after you close the browser
  (wich originated the stream)?

the answer to those two questions will help to know:

- How can i predict an adequate number for 'ulimit -n' (max. number of
  file/stream descriptors) in function of the utilization of my server?

Unknowing wich is the perfect election, i've selected a limit of 1024

- Is it too many 1024? Too many resources utilization? 

But, the main question, IMHO, is that:

- It is Zope robustness what fails. It should deny access gracefully when
  resources are exhausted. (Or at least, it should give comprehensive error
  information). Is it so? Or is it a wrong observation? 

I am now using zope only for developing static pages, not for a public 
dynamic service, and the 'ulimit' patch suffices, but i am afraid for 
when i'll want to put it in a public service with a heavy load.


-- Ricardo




P.S. I have tested also Zope 2.2.4 and 2.3.1b1 in OpenBSD. 
I didn't perform the 'ulimit' test in these versions but i do 
have experienced the "PROBLEM(100)" error (or similar).
I have tested Zope 2.3.1b1 and 2.3.0 thru Apache and standalone.
When thru Apache: with pcgi and with fastcgi.
When with fastgi: with port and with socket.