¿Quieres dar formación sobre rendimiento en Solaris/OpenSolaris a tus técnicos?

A raíz del interés mostrado en las últimas charlas he decidido ofrecer mis servicios para consultoría y formación a empresas.

Ponte en contacto conmigo para pedir información.

3.- La memoria.

Hoy en día los servidores cuentan con gigas y gigas de RAM, comparado con hace unos años su coste se ha abaratado sustancialmente. En mi humilde opinión esto no ha repercutido en una mejora sustancial del rendimiento, ya que las aplicaciones actuales son auténticas devoradoras de recursos. Debido a esto no es extraño encontrarse en una situación donde la memoria física se haya terminado y el sistema se vea forzado a swapear.

Nuestro objetivo

Como suele ser habitual una pérdida de performance debido a escasez de memoria suele ser debido a que una aplicación se ha salido de su patrón de carga habitual. Así deberemos centrar nuestro análisis en localizar el/los pid/s responsables.

Reconociendo el estado de falta de memoria.

El Usuario

En general percibirá una perdida de velocidad en sus aplicaciones, en casos realmente extremos puede ser que no pueda lanzar nuevos comandos y obtenga un mensaje indicando que no hay memoria suficiente para hacer un fork.

Los síntomas

Prtconf

Un primer paso sencillo es ver la cantidad de memoria física que hay instalada en el sistema, para ello usaremos el comando #prtconf.

root@box # prtconf | more System Configuration: Sun Microsystems sun4u Memory size: 32768 Megabytes

Vmstat

La columna sr de la salida del vmstat indica el número de veces que se ha ejecutado el page scanner durante la muestra.

El proceso se activa cuando queda menos de 1/64 de la memoria física libre disponible, es decir, cualquier valor superior a 0 significa que andamos francamente escasos de memoria, si el valor es sostenido durante varias muestras implica que la situación es realmente grave. La ejecución del page scanner supone un gasto notable de CPU por lo que en casos realmente extremos puede ser que el equipo esté prácticamente dedicando todos sus recursos a liberar memoria.

La columna free es el total de memoria libre disponible, se obtiene de la suma de la Free (cachelist) y la Free (freelist).

root@box # vmstat 5 kthr memory page disk faults cpu r b w swap free re mf pi po fr de sr 2m m0 m1 m2 in sy cs us sy id 1 0 0 42157120 7573496 585 2219 1920 7 9 0 6 44 2 1 1 19612 34991 12905 42 15 43 0 0 0 41882080 7348816 546 2233 2175 0 0 0 0 35 0 0 0 12435 29385 6561 32 9 59 0 0 0 41882512 7344728 584 2393 2162 0 0 0 0 36 20 19 19 10922 32580 7231 28 9 63 0 0 0 41884936 7342656 628 2809 2174 0 0 0 0 35 0 0 0 11673 43611 8204 31 9 60 [...]

mdb

Con mdb podemos obtener una estadística de la memoria según el uso que se la esté dando:

root@box # mdb -k Loading modules: [ unix krtld genunix dtrace specfs ufs ssd fcp fctl ipc md ip s ctp usba random emlxs nca ptm sd nfs sppp crypto logindmux cpc fcip isp ] ::memstat Page Summary Pages MB %Tot ------------ ---------------- ---------------- ---- Kernel 371610 2903 9% Anon 2406527 18800 58% Exec and libs 22685 177 1% Page cache 460896 3600 11% Free (cachelist) 811777 6342 19% Free (freelist) 105288 822 3% Total 4178783 32646 Physical 4111653 32122

El total de memoria libre disponible es la suma de la Free (cachelist) y la Free (freelist). Este valor es le que presenta la columna free del vmstat.

La Free (freelist) es la memoria libre que nunca ha sido usada.
La Free (cachelist) es memoria que ha sido usada y aun contiene datos validos pero en caso de necesidad pueden ser sobrescritos, de esta manera si los mismos datos son necesitados antes de haber sido sobrescritos no hace falta volverlos a traer a la memoria fisica.

Quien está consumiendo toda la memoria.

Hay que tener en cuenta que el proceso que más ocupa en memoria no tiene porque ser el que esté creando el problema si su tamaño se mantiene constante.

Pongamos un ejemplo tonto, En nuestro sistema tenemos un total de 8 gigas, tenemos 3 procesos, A consume 3G, B 3G y C 1G. Si el proceso C tiene un funcionamiento anómalo y su consumo se dispara su tamaño máximo será de 2 G, es decir seguirá siendo el más pequeño pero sin embargo será el responsable de los problemas de performance.

Prstat

La salida del prstat nos indica el tamaño de cada proceso en memoria, sin embargo es engaƱoso. Si varios procesos utilizan las mismas libreri´as, ejecutables, etc solo hay una copia cargada en memoria, sin embargo se tienen en cuenta al mostrar el tamaño total que ocupa el proceso.

root@box # prtconf | more System Configuration: Sun Microsystems sun4u Memory size: 32768 Megabytes root@box # prstat PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 16197 oracle 16G 16G cpu1 20 0 11:41:50 6,9% oracle/15 4209 oracle 16G 16G cpu16 10 0 0:58:48 6,3% oracle/11 27821 oracle 16G 16G sleep 10 0 0:06:32 4,0% oracle/1 15582 oracle 16G 16G cpu0 0 0 0:00:09 3,9% oracle/1 28194 oracle 16G 16G cpu2 33 0 11:27:39 2,1% oracle/13 9776 oracle 16G 16G sleep 59 0 5:39:50 1,8% oracle/13 [...]

Si sumamos el tamaño de todos los procesos oracle nos da un valor superior a la memoria instalada en el equipo. Por ello el prstat NO es una buena herramienta para determinar que proceso es el responsable del agotamiento de la memoria.

Dtrace

Un buen indicativo de consumo de memoria es el número de minor faults que está generando un proceso, un número de minor faults indica que el proceso está reclamando más memoria.

Para localizar estos procesos tenemos que hechar mano de dtrace, por suerte podemos usar los scripts del Dtrace Tool Kit que nos simplificará la vida. En concreto el script minfbypid.d.

root@box # ./minfbypid.d Tracing... Hit Ctrl-C to end. ^C PID CMD MINFAULTS 7313 oracle 2 13591 sleep 2 [...] 13626 init.cssd 86 4209 oracle 364

Conclusión

Después de estas comprobaciones deberemos tener claro si tenemos problemas de memoria y en este caso una pequeña lista de pid que merece la atención analizar detenidamente, en artículos posteriores veremos como hacer un análisis detallado de estos procesos.

Creative Commons License
Esta obra está bajo una licencia de Creative Commons.