I have a site under zope 5 which has been running for a few months. I noticed that Zope is increasing in memory usage. I even had a memory saturation which forced me to restart my processes.
How can I avoid increasing memory usage? Is there a command to execute to free memory.
I usually add a job in my crontab to restart the instances periodically.
Weekly, nightly or whenever is needed.
I know other people disagree with this approach but it works for me.
To have a complete picture I suggest you to have a look to:
Usually, you cannot. Unlike (e.g.) Java, Python does not have a compacting garbage collector. As a consequence, memory fragmentation builds up over time and causes increased memory usage. Python 3 has a function to monitor Python's memory management and the Linux C library allows to monitor its memory management (-->
mallinfo2). Together, they allow to estimate the fragmentation degree.
Usually, the fragmentation growth rate decreases over time. If you observe this behavior, you almost cannot do anything (apart from restarting).
If you observe that the memory growth rate does not decrease, then you may have a memory leak. Usually, memory leak analysis is very expensive. Thus, even if you could do something about memory leaks, you might choose to just restart the process.
This is very annoying for a high availability site, whose activity on the zodb is important.
I will first set up an automatic restart cron.
It shouldn't make any difference if you are using ZEO/loadbalancing/caching and stagger the restarts.
Unless we use session data. Users connected to an instance will be disconnected when the instance restarts! Am I fair?
You should not use Zope sessions, at least not on the default
tempstorage does not work reliably with modern ZODB versions.
A client is using Zope sessions on a
FileStorage (accessed via
ZEO). This way sessions remain active across process restarts. Note that Plone's CSRF protection relies on session data being maintained in a storage with name
Ok, do you know where I can find the documentation or an example configuration to migrate the storage "transient object container" to a FileStorage. what would be the impacts on my code to read / write in my session
You read the
plone.recipe.zope2instance documentation (-->
PyPI) to find out how to take control over the session configuration. I do not know how this works: it is possible that you can only configure "with" or "without sessions". I know that the recipe has an option to add arbitrary definitions to the generated configuration file. However you do it, your aim is to replace the
temporarystorage definition in the configuration file by a
zeoclient. This definition will much resemble that of the
main database (lwith a different file/remote storage); the remaining parts of the
zodb_db temporary section should remain unchanged. If you use ZEO, you configure the new session storage for it (again similar to the definition for