[Zope] Zope hangs with Ape and large number of objects

Francis Kelly zope at crubellier.com
Wed Mar 23 18:52:42 EST 2005


I'm having an issue with Ape that I'm hoping someone might have some 
insight into. I'm running Zope 2.7.3 on a Fedora Core 3 dual processor 
Xeon box with a gig of memory. I've got a FileStorage (generic Data.fs) 
as well as a file-based Ape storage. The Ape storage is based on the 
default file-storage that is described in the component.xml file that 
comes with Ape (I didn't create any mappers or anything). This is a 
development environment, so I'm running Zope in debug mode & I'm using 
VerboseSecurity.

I've loaded about 700,000 objects, each of which is fairly small, 
probably <1k in size. I was interested in using Ape for a couple of 
reasons. Since the system will have a lot of objects in it (probably > 
5M), I wanted to explore ways of storing those objects in more than one 
file to avoid a massive Data.fs file. Ape seemed appealing over mounted 
storage (though I still need to play around a bit more with that) 
because I don't care about undo support (once the objects are loaded 
they won't be modified hardly at all).

My Ape storage is mounted at /fs. When I try to go into /fs via the ZMI, 
the system essentially hangs. Zope starts to consume more and more 
system resources (swapping increases as does top's average load value) 
and the system gets slower and slower. If I cancel the operation, that 
has no effect on the consumption of system resources; I have to restart 
Zope. I've attached a dump produced by the DeadlockDebugger product that 
I think captures the place where Zope seemed to be spending most of its 
time in the event that's helpful. Likewise, I used a reference counting 
routine to dump out the refs in the system. Here are the top 5, you'll 
see that Ape tops the list (which may be normal, I don't know):

(2509, <class apelib.zodb3.connection.UnmanagedJar at 0xb7867e0c>)
(301, <class Shared.DC.Scripts.Bindings.NameAssignments at 0xb79939ec>)
(294, <class Shared.DC.Scripts.Signature.FuncCode at 0xb7993f8c>)
(162, <class DocumentTemplate.DT_Util.Eval at 0xb79d1d1c>)
(161, <class Products.ZGadflyDA.gadfly.kjParser.ParseRule at 0xb7191dac>)

Any insight anyone has on this problem would be very useful. In general, 
recommendations on handling large numbers (>1M) of objects would be very 
useful as well.

Thanks,
Francis

----- stacktrace -------

Thread 126962608 (GET /fs/manage_main):
  File "/usr/local/zope2.7.3/lib/python/ZServer/PubCore/ZServerPublisher.py", line 23, in __init__
    response=response)
  File "/var/zopescale/Products/ZopeProfiler/MonkeyPatcher.py", line 35, in __call__
    return self._function(*args,**kw)
  File "/var/zopescale/Products/ZopeProfiler/ZopeProfiler.py", line 357, in _profilePublishModule
    request=request, response=response)
  File "/usr/local/zope2.7.3/lib/python/ZPublisher/Publish.py", line 384, in publish_module
    environ, debug, request, response)
  File "/usr/local/zope2.7.3/lib/python/ZPublisher/Publish.py", line 175, in publish_module_standard
    response = publish(request, module_name, after_list, debug=debug)
  File "/usr/local/zope2.7.3/lib/python/ZPublisher/Publish.py", line 101, in publish
    request, bind=1)
  File "/usr/local/zope2.7.3/lib/python/ZPublisher/mapply.py", line 88, in mapply
    if debug is not None: return debug(object,args,context)
  File "/usr/local/zope2.7.3/lib/python/ZPublisher/Publish.py", line 39, in call_object
    result=apply(object,args) # Type s<cr> to step into published object.
  File "/usr/local/zope2.7.3/lib/python/Shared/DC/Scripts/Bindings.py", line 306, in __call__
    return self._bindAndExec(args, kw, None)
  File "/usr/local/zope2.7.3/lib/python/Shared/DC/Scripts/Bindings.py", line 343, in _bindAndExec
    return self._exec(bound_data, args, kw)
  File "/usr/local/zope2.7.3/lib/python/App/special_dtml.py", line 175, in _exec
    try: result = render_blocks(self._v_blocks, ns)
  File "/usr/local/zope2.7.3/lib/python/DocumentTemplate/DT_In.py", line 643, in renderwob
    sequence=self.sort_sequence(sequence, md)
  File "/usr/local/zope2.7.3/lib/python/DocumentTemplate/DT_In.py", line 771, in sort_sequence
    else: k = getattr(v, sort)
  File "/var/zopescale/Products/Ape/lib/apelib/zodb3/connection.py", line 359, in setstate
    event = osio.deserialize(oid, obj, classification, state)
  File "/var/zopescale/Products/Ape/lib/apelib/core/io.py", line 160, in deserialize
    mapper.serializer.deserialize(event, state)
  File "/var/zopescale/Products/Ape/lib/apelib/core/serializers.py", line 121, in deserialize
    s.deserialize(event, state)
  File "/var/zopescale/Products/Ape/lib/apelib/zope2/products.py", line 69, in deserialize
    obj._setOb(id, subob)
  File "/var/zopescale/Products/BTreeFolder2/BTreeFolder2.py", line 230, in _setOb
    meta_type = getattr(object, 'meta_type', None)
  File "/var/zopescale/Products/Ape/lib/apelib/zodb3/connection.py", line 359, in setstate
    event = osio.deserialize(oid, obj, classification, state)
  File "/var/zopescale/Products/Ape/lib/apelib/core/io.py", line 160, in deserialize
    mapper.serializer.deserialize(event, state)
  File "/var/zopescale/Products/Ape/lib/apelib/core/serializers.py", line 121, in deserialize
    s.deserialize(event, state)
  File "/var/zopescale/Products/Ape/lib/apelib/zope2/products.py", line 69, in deserialize
    obj._setOb(id, subob)
  File "/var/zopescale/Products/BTreeFolder2/BTreeFolder2.py", line 230, in _setOb
    meta_type = getattr(object, 'meta_type', None)
  File "/var/zopescale/Products/Ape/lib/apelib/zodb3/connection.py", line 322, in setstate
    p, serial = self._storage.load(oid, self._version)
  File "/var/zopescale/Products/Ape/lib/apelib/zodb3/storage.py", line 102, in load
    event, classification, state, hash_value = self._gwio.load(oid)
  File "/var/zopescale/Products/Ape/lib/apelib/core/io.py", line 99, in load
    state, hash_value = mapper.gateway.load(event)
  File "/var/zopescale/Products/Ape/lib/apelib/core/gateways.py", line 67, in load
    state, serial = gw.load(event)
  File "/var/zopescale/Products/Ape/lib/apelib/fs/structure.py", line 111, in load
    classification = event.classify(child_oid)
  File "/var/zopescale/Products/Ape/lib/apelib/core/events.py", line 67, in classify
    return self.conf.classifier.classify_state(sub_event)
  File "/var/zopescale/Products/Ape/lib/apelib/zope2/classifier.py", line 136, in classify_state
    classification, serial = self.gateway.load(event)
  File "/var/zopescale/Products/Ape/lib/apelib/fs/classification.py", line 36, in load
    text = fs_conn.read_annotation(oid, 'classification', '')
  File "/var/zopescale/Products/Ape/lib/apelib/fs/connection.py", line 143, in read_annotation
    annotations = self.afs.get_annotations(path)
  File "/var/zopescale/Products/Ape/lib/apelib/fs/annotated.py", line 98, in get_annotations
    data = self.ops.readfile(props_fn, 1)
  File "/var/zopescale/Products/Ape/lib/apelib/fs/fileops.py", line 47, in readfile
    return f.read()




More information about the Zope mailing list