Captura de pantalla 2015-08-19 a las 8.53.54

La gestión de memoria de OSX era buena. Como buen Unix que es, se lleva pensando y programando desde 1978, con lo que, si algo funciona bien, lo mejor es que no lo toques, sobre todo cuando es eficiente y hace su trabajo estupendamente. Pero llego Apple y su mania de “tocar” a ver si así se puede llevar el gato a su agua, mover el problema a su terreno, crear “su estándar” y que, a ser posible sea incompatible con el resto.

Por eso mismo, desde Maveriks la gestión de memoria ha ido de mal en peor. Y no me refiero a aplicaciones con bugs ni tampoco a otras que consuman mas o menos memoria (que eso pasa), sino a tocar la gestión de memoria en si.

Y lo malo no es solo tocar la gestión de memoria sino, de paso y a modo de engañarnos, tocar otros parámetros de los sistemas Unix que, salvo casos muy excepcionales, no hay que tocar ya que es una maquina muy bien engrasada. Ademas, estos “parámetros” que tocan lo hacen a modo de engañar al sistema y que así no consuma “tanta memoria”.

El ejemplo que os cuento, que pasa en Yosemite y en “el Gran Capitan” tampoco han variado mucho es, aparte de su pésima gestión de memoria comprimiendo y descomprimiendo con extraños tiempos y esperas las aplicaciones que “están abiertas” pensando que la cosa va a ir mas deprisa o la aplicación mal programada (o mal compilada) va a tener más hueco en tu memoria para campar a sus anchas a modo de engañar al sistema (y al usuario) es cambiar los limites del sistema de ficheros abiertos, procesos en ejecución y forks de los mismos. Pensando (y esto es cosa mía) que el usuario es gilipollas y usa su equipo para abrir cuatro pestañas y navegar por las redes sociales. Vamos, que nos toman por gilipollas y les aplaudimos.

Desde siempre, Unix, ha tenido unos “limites” para las cosas que podias tener abiertas. Simplemente abrid un terminal y escribid el viejo comando:

ulimit -a

Que os respondera algo como:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2048
virtual memory          (kbytes, -v) unlimited

Aunque veáis ahí mucho “unlimited” (sin limite) veréis que el numero máximo de ficheros abiertos (2^16) en sistemas de 64 bits y el máximo de procesos por usuario… es irrisorio. Así que, de esta forma, ya que la gestión de memoria es un poco fulera, la acotamos no dejando que crezca por si alguna aplicación se va de madre, que de la aplicación error y el sistema sigue “en marcha”… o no.

Por suerte, esto se puede cambiar, aunque, desde Yosemite, no se puede hacer desde el propio comando ulimit. Si intentamos cambiar los parámetros desde el ulimit, aunque parece que funciona, veremos que no varian (curiosamente). Apple reinventando la rueda y la forma para no permitir al usuario que toque y modifique su propio sistema, gra-cias.

Curiosamente, si nos aburrimos y ponemos el siguiente comando:

launchctl limit

Veremos que… oh sorpresa, nos aparece lo mismo pero desde otra perspectiva:

	cpu         unlimited      unlimited      
	filesize    unlimited      unlimited      
	data        unlimited      unlimited      
	stack       8388608        67104768       
	core        0              unlimited      
	rss         unlimited      unlimited      
	memlock     unlimited      unlimited      
	maxproc     2048           2048           
	maxfiles    65536          65536 

Es decir, Apple ha pasado del demonio de toda la vida que siempre ha funcionado bien y va como la seda para pasar a su propio sistema de demonios (de ahí el launchctl). Lo que nos da un olor a donde hay que tocar para modificarlo ya que el fichero del /etc/limit.conf pues curiosamente, ya no existe y no vale… ni siquiera si lo ponemos en /private/etc nuevo sitio para las configuraciones.

Pero, si vamos a la carpeta /Library/LaunchDaemons nos encontraremos con un fichero llamado limit.maxfiles.plist que justamente es un XML de configuración el cual ejecuta el demonio del launchctl y que… sorpresa sorpresa, los números corresponden a lo que el ulimit y el limit nos escupen. Yo, desde aquí, os recomiendo dejar un valor de 524288, quedando el fichero tal que así.

< !DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxfiles</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxfiles</string>
          <string>524288</string>
          <string>524288</string>
        </array>
       <key>RunAtLoad</key>
        <true></true>
      <key>ServiceIPC</key>
        <false></false>
    </dict>
  </plist>

Recordad abrir el fichero como root o via “sudo” para poder editarlo desde vuestro editor de terminal favorito.

Ahora bien, que aquí no acaba el tema y la “cagadita de Apple”, si tenéis subís mucho el limite, Apple no os permite, tampoco, poner un numero muy alto (recordad que vuestra maquina es de 64 bits, luego que menos que poner valores de 32 bits, es decir 2^32. La forma de hacerlo es… curiosamente, comprando OSX Server y activando el metodo de “equipo de alto rendimiento” vía terminal con el comando:

sudo serverinfo --setperfmode true

Donde, según la maquina que tengáis, hasta la propia Apple indica cuales son los limites (antes, ahora ya no) que se ajustan mas a ella.

Al final, Apple, sinceramente nos trata como tontos pensando que lo somos y nos capa los equipos. El anuncio de “fabricamos el hardware y hacemos el mejor software para el” consiste en pensar que no tenéis ni idea y que nunca sereis capaces de sacar el rendimiento de la maquina que habéis comprado porque, o no lo necesitáis o no sabréis hacerlo. Luego esa publicidad de “esto esta hecho con un iPhone” no es mas que un insulto a la gente porque deben de pensar que eso que sale, que ha hecho la gente, que es normal, es algo excepcional y vosotros (si, vosotros) nunca lo lograreis.

P.S.: Recordad que en cada actualización, los valores vuelven a su “seno natal” y habrá que cambiarlos.
P.S.2.: El Gran Capitan, no soluciona esto. Sigue existiendo el mismo problema, por lo que no es el sistema en si, es la política, como piensa Apple y que piensa de vosotros.