Herramientas Personales
Usted está aquí: Inicio Documentación Configuraciones Uso de Memoria de Zope

Uso de Memoria de Zope

Algunos cálculos sobre el uso de memoria de Zope según los hilos y el tamaño del caché

Bueno esto es un referente práctico pero no muy exacto basado en la experiencia

Wake Up

Primero hay que tener claro que zope cuando accede a un objeto (wakeup en terminología de zope) lo carga desde la base de datos completo a memoria, esto trae una serie de problemas:

  • Si el objeto es binario y es grande, ocupa bastante memoria. Si tenemos muchos objetos de considerable tamaño empiezan los problemas, es más, si colocamos, por ejemplo un vídeo de 100Mbytes, primero lo carga en memoria y cuando termina lo sirve, tardando un tiempo considerable en comenzar la transferencia. Este problema actualmente tiene solución.
  • Al programar plantillas / scripts hay que tener cuidado en no despertar demasiados objetos. Si utilizamos referencias o listamos contenidos completos de carpetas sin utilizar el catálogo, el sistema se vuelve lentísimo, tengo pruebas en las que las referencias tardan más de un minuto en mostrar un listado. Por tanto, es muy importante poner en el catálogo todo lo que podamos, es más, crear incluso catálogos nuevo si fuera necesario.

Conclusión: Intentar sólo acceder al objeto activo en la url y evitar despertar el resto en cualquier plantilla que hagamos

Uso de memoria

La configuración de zope es una decisión importante, dos parámetros son los fundamentalmente rigen el uso de memoria de zope:
  • Directiva global zserver-threads por defecto a 4, os recomiendo que no la pongáis a mas de 6 he colgado varios servidores por ponerlos a 10. Cuando los hilos no dan a basto, el uptime llega a sobrepasar 25 y no se puede ni ejecutar un shell de root para reiniciar la máquina o parar zope. Tener muchos hilos no resuelve nada.
  • Directiva particular de cada base de datos cache-size por defecto a 5000. En principio por cada hilo que tenga la instancia de zope se guardan en memoria un máximo de 5000 objetos, es decir, con 4 hilos tendremos un máximo de 4x5000=20000 objetos en memoria. La clave ahora es saber cual es el tamaño medio de los objetos.
¡Cuidado con los hilos!

Problema de python e hilos

En mi caso, el servidor tenía 4 procesadores y fueron necesarios 4 zopes, al descubrir que una instancia de zope sólo ocupa un procesador por muchos hilos que tenga. Parece un problema de python, no se hasta que versiones de python tienen ese problema, pero el proceso python no es capaz de ubicar un hilo en cada procesador, por lo que el rendimiento de la máquina no es óptimo.

Este problema se soluciona con un ZEO y varios ZOPES en paralelo.

Podeís encontrar más información sobre el problema de los hilos en: http://docs.python.org/api/threads.html


Cache

Realmente los tamaños de los objetos son variables en cada sitio. En uno de los sitios que tengo con mayor actividad hay unos 20000 objetos de todo tipo por lo que puede ser relevante. Se ha evitado incluir fichero binarios grandes mediante productos encargados de mantenerlos en el sistema de ficheros (External Storage, Attachment Field, LocalFolderNG, Reflecto, etc..). Estos productos también requieren unos comentarios que escribiré en otro documento parecido a este (estoy en ello)

Estas estadísticas las usé para optimizar el uso de la memoria de la máquina e intentar evitar la paginación del sistema: (Zope 2.8/ Zope 2.9 plone 2.1.X)

Estadísticas en el servidor de las en las primeras 12 horas de salida. No se utilizó la directiva "ignore-reload" de squid, todas las recargas atravesaron el caché:  (esta directiva de squid se puede utilizar cuando comienzan los problemas en zope, mientras se busca solución)

  • 1279922 accesos
  • 63332 fallos de caché (acierto del 95%)

Hubo problemas con "transient-objects" se aumentó en el archivo de configuración de cada instancia de zope. El entorno constó de 4 zopes: 1 con 6 hilos para escritura y 3 con 4 hilos sólo lectura. Todos con un caché de objetos de 10000.

Cuando todos los cachés de objetos estaban llenos estos son los datos de RAM:
  • Zope de 6 hilos: 656MB, 60000 objetos en caché
  • Zopes de 4 hilos: 452MB, 40000 objetos en caché

Aproximadamente son unos 116MB/10000 Objetos. Este cálculo es simple pero funciona para optimizar el uso de RAM en el servidor, lo he utilizado varias veces:

Conclusión: 12K por objeto de media. Uso de memoria=12K * CacheSize * ServerThreads

Acciones de Documento

Buen documento

Enviado por Usuario Anónimo en 29/06/2007 08:00
Gracias por compartir tus experimentos con nosotros.
Hay un poco de magia budú en el rendimiento de una instalación de Zope.
No es facil y solo se aprende mediante ensayo error.

Gracias,
Nando.

Buena ayuda

Enviado por Usuario Anónimo en 05/07/2007 12:12
Muy buena ayuda, ya que existe poquita documentación sobre este tema, pero tengo algunas dudas que a lo mejor me podrías resolver:
- Por qué los procesos de Zope/Python empiezan cogiendo muy poca memoria al principio y se incrementan con el tiempo??(Esto supongo que es porque va aumentando el tamaño de la caché de objetos almacenados)
- Llegado un momento, mi servidor zope se queda colgado, estando el proceso en ejecución, pero sin apenas consumir recursos, a que puede deberse?? Puede que el tamaño de la caché sea demasiado grande y halla que hacer un limpiado de caché(flush)??
- Tambien he detectado problemas de rendimiento en mi servidor, y aunque he aumentado la Ram y configurado los parámetros como indicas, estos cambios afectan sobre todo al uso de Ram que realiza el servicio Zope, pero no tan directamente al rendimiento a la hora de servir páginas, encontrándome con un rendimiento similar(casi igual) con configuraciones radicalmente distintas de los parámetros que indicas. No se que más puedo tocar para mejorar el rendimiento, ya que estaba convencido de que era la Ram.

Gracias de antemano.
Un Saludo!!!