Aumentar memoria en WordPress para evitar Fatal error: Allowed memory size of N bytes exhausted

Si manejáis WordPress a diario seguro que alguna vez habréis sufrido un error de falta de memoria RAM, que se traduce en un mensaje de este tipo:

Fatal error: Allowed memory size of N bytes exhausted

Como sabréis, PHP es un lenguaje del lado del servidor, que se interpreta (no se compila) y que en cada ejecución necesita una no despreciable cantidad de memoria para poder ejecutarse. Si usamos un sistema gestor de contenidos como WordPress y encima usamos cantidad de plugins y un theme que sea algo pesado, es muy posible que una ejecución necesite del orden de 64MB de RAM hacia arriba (he visto necesidades de más de 128 MB de RAM para ciertas operaciones). read more

Leer más » 2 Comentarios

Fatal error: Allowed memory size of N bytes exhausted en PHP

Uno de los mayores problemas de usar WordPress, es que a pesar de ser un sistema bastante ligero, llega un momento en el que como no tengamos cuidado, puede llegar a ocupar muchos recursos. De cómo aligerar WordPress, he hablado y hablaré (de forma presencial por cierto en la próxima WordPress Meetup Córdoba que es ya mismo) pero esta no es la idea de esta entrada.

La idea de esta entrada es: no puedo aligerar WordPress por cualquier razón (no hay más que aligerar, falta de tiempo…) y el espacio que direcciona de memoria RAM se ha agotado. El indicativo de este problema es un mensaje que dice lo siguiente:

Fatal error: Allowed memory size of N bytes exhausted en PHP

La solución, intentar ampliar la memoria que tenemos disponible para PHP y por lo tanto para WordPress. ¿Cómo? Iremos intentando cada una de estas acciones.

Dentro de php.ini

Si tienes acceso al php.ini global o en su defecto, tienes un php.ini disponible en tu cuenta compartida, busca la línea:

memory_limit = 32M;

Y sustitúyela por esta otra:

memory_limit = 64M;

Leer más » 3 Comentarios

Reservar memoria dinámica para una matriz en C

Acabamos de hablar hace nada de cómo reservar memoria para un vector unidimensional de forma dinámica con C. Hoy le toca el turno a las matrices o arrays bidimensionales. Los vectores se organizan de forma lineal, secuencial y con todos los elementos en posiciones correlativas en la memoria. Las matrices se almacenan en forma de vector de vectores.

Dimensiones fijas

Si es de dimensiones fijas (declarándolas como matriz[filas][columnas]), el vector de vectores se guardará también uno al lado del otro.

Por lo tanto, en una matriz del tipo:

a00a01a02
a10a11a12
a20a21a22

En memoria (en la que los elementos los direccionamos en una sola dirección) los tendríamos de la siguiente forma (en cada lenguaje este criterio cambia, en Fotran se almacena en forma de vector de columnas):

a00a01a02a10a11a12a20a21a22

Dimensiones variables

Sin embargo, en el caso de la memoria dinámica, las cosas cambian. El mecanismo será el siguiente:

  • Declararemos un doble puntero “matriz” sobre el que reservaremos memoria para tantas filas tengamos.
  • Recorreremos el vector recién creado para reservar memoria para las columnas de cada fila.

Hay dos detalles a tener en cuenta:

  • La variable “matriz” será del tipo doble puntero ya que hará referencia a un vector de punteros.
  • Cada fila sí estará almacenada de forma consecutiva en memoria, pero éstas a su vez no estarán de forma obligada juntas, aunque podremos seguir accediendo de la misma forma.

Veamos un ejemplo con código real (no hace comprobaciones de que el malloc se ejecute correctamente):

#include <stdlib.h> #include <stdio.h> int main(void) { int filas = 2; int columnas = 3; int **x; int i; // Recorre filas int j; // Recorre columnas // Reserva de Memoria x = (int **)malloc(filas*sizeof(int*)); for (i=0;i<filas;i++) x[i] = (int*)malloc(columnas*sizeof(int)); // Damos Valores a la Matriz x[0][0] = 1; x[0][1] = 2; x[0][2] = 3; x[1][0] = 4; x[1][1] = 5; x[1][2] = 6; // Dibujamos la Matriz en pantalla for (i=0; i<filas; i++) { printf("\n"); for (j=0; j<columnas; j++) printf("\t%d", x[i][j] ); } return 0; } read more

Leer más » 16 Comentarios

Reservar memoria dinámica para un vector en C

Puesto que estamos hablando bastante de C en el curso de programación de videojuegos con SDL, voy a publicar una serie de pequeños apuntes sobre programación en C que seguro que os son de utilidad. No van a constituir un curso como tal pero serán una serie de entradas relacionadas sobre este tema. read more

Leer más » 8 Comentarios

Manejando la memoria en “caliente” con Xen

Cuando tenemos una máquina física con tantos GB de RAM y empezamos a paravirtualizar con Xen sobre ella, el recurso que más debemos cuidar es éste, la memoria física disponible en el sistema. Dentro del fichero de configuración de nuestras máquinas definiremos dos valores:

  • memory: memoria con la que se creará la máquina
  • maxmem: tope de memoria que podremos conseguir gracias al balloning (aumento de la memoria en caliente)

De hecho, si no definimos el siguiente parámetro, Xen interpretará que será igual al anterior. Imaginemos que tenemos una máquina creada con 1024MB de memoria y con un tope de 4096MB.

Cuando hacemos xm create nombreMaquina y se inicia, con xm list podremos ver la cantidad de memoria que está consumiendo:

# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0      256     2 r-----  54678.1
foo                                        2     1024     1 -b----   4660.2

Aumentar y reducir memoria en ejecución

La máquina está ejecutando, necesitas crear nuevas máquinas y ésta en concreto no está usando toda la memoria. Recordad que el uso de CPUs virtuales en Xen es escalable, pero el de la memoria no lo es, al menos de forma tan automática. La solución es usar la siguiente instrucción:

xm mem-set nombreMaquina nuevoTamaño

Veamos cómo quedaría nuestro caso xm mem-set foo 512:

# xm mem-set foo 512 # xm list Name ID Mem(MiB) VCPUs State Time(s) Domain-0 0 256 2 r----- 56681.0 foo 2 512 1 -b---- 5160.2 read more

Leer más » 7 Comentarios

Instalar Ubuntu Linux desde una memoria USB

Si quieres instalar Ubuntu desde una memoria USB o pendrive necesitas que tu ordenador pueda reiniciar leyendo desde la entrada USB. Si es así, realiza los siguientes pasos:

Si estás en Ubuntu

1. Descárgate la ISO de Ubuntu.
2. Entra en Sistema, Administración, Creador de discos de arranque.

3. Se abrirá un asistente. Especifica la ISO (o el CD) de Ubuntu y la memoria USB o pendrive USB donde instalar.
4. Pulsa en Crear disco de inicio. Si el botón sale inactivo, es que antes tienes que pulsar en Borrar disco. read more

Leer más » 12 Comentarios

Datos de rendimiento de WordPress

Para quién tenga WordPress alojado en un servidor propios estos datos probablemente serán anecdóticos, pero para quién tenga un servidor compartido los datos pueden ser más que necesarios para evitar mensajes como “Allowed memory exhausted” o similares que nos dejan la web inservible. read more

Leer más » Comentar