Ver la versión completa : [Programación] Memoria disponible en Wiz
He estado estos meses portando un juego de estrategia complejo, y cuando ya lo tenía casi funcionando, me doy cuenta de que no cabe en la memoria de la consola :llorosa:. Se inicia correctamente, pero al mostrar la pantalla del juego carga muchos datos y se agota toda la memoria. Entonces el módulo oomkiller de Linux (out of memory killer) mata al proceso. Tendré que seguir depurándolo para ver donde revienta y recortarlo.
El juego tiene una parte cliente y otra de servidor local que se lanzan a la vez. Estos dos procesos con sus librerías dinámicas ocupan más de lo que esperaba, sobre todo el cliente. Así que he pensado unirlos, ya que usan mucho código compartido y puede reducirse el total. Pero no es un cambio trivial, ya que usan sockets de Unix. He pensado hacer funciones de recubrimiento que simulen los sockets.
Sobre la memoria, he hecho un "free" desde la línea de comandos y me dice que de 40 mb accesibles, hay unos 24 megas en uso :confused: y quedan 16 megas libres. Se supone que esto es lo que ocupan los procesos del sistema y los drivers, pero me parece demasiado. El firmware que tengo es el 1.0.1, supongo que será similar en los demás. Luego están unos 16 megas de memoria alta, accesible de forma especial.
Este es mi gran proyecto, en el que tardaré un poco más de lo que esperaba, pero merecerá la pena. A ver si consigo recortarlo y adaptarlo para la consola. Si tenéis alguna sugerencia estoy abierto. Si alguien me dice que estoy equivocado, y que se puede obtener más memoria libre, pues bienvenido sea.
Un saludo
:brindis:
Quizá Franxis pueda ayudarte, ya que creo que se ha peleado anteriormente con este tema y parece que comienza usando la memoria alta antes de acceder a la del sistema.
De todas formas, 16 megas libres es realmente poco, ya que si eso fuera así, supongo que en emuladores como el de NeoGeo la mayor parte de los juegos ni cargarían.
Sobre la memoria, he hecho un "free" desde la línea de comandos y me dice que de 40 mb accesibles, hay unos 24 megas en uso :confused: y quedan 16 megas libres.
Si, asi es, el Linux de la WIZ se come una cantidad exagerada de memoria. Si usas más memoria el sistema operativo intenta liberar memoria usada por el sistema y te la asigna al proceso. Incluso te deja reservar más memoria de la que hay realmente disponible, y cuando accedes a la memoria (para leer o escribir) el sistema operativo te mata el proceso.
A mi en el MAME me pasa igual. El ejecutable del MAME ocupa 10 MB y tengo disponible otras 10 MB (más o menos).
Yo lo que hago en el MAME es usar la memoria alta (0x3000000 a 0x3ffffff = 16 MB). Lo hago transparentemente con un wrapper que sustituye a malloc(), realloc(), calloc() y free() (mira wiz/uppermem.cpp y wiz_wrapper.h).
Además no sé por qué el acceso a memoria alta (con el MMUHack) funciona mucho más rápido que el acceso a la memoria de Linux (esta es la causa del aumento de rendimiento del MAME4ALL 2.4).
Saludos.
Una pregunta... no se supone que la consola tiene 64 MiB de ram?? Donde estan los 16 que faltan?
Los 16 mb que faltan son memoria alta, no accesible directamente desde Linux, pero accesibles mediante mapeado.
Muchas gracias Franxis por tus explicaciones.
sirberic
11/08/2009, 19:47
por lo del cliente + servidor... podría ser el wesnoth ?
bitrider
11/08/2009, 20:34
En teoria si el código duplicado de las dos aplicaciones está en las librerías usadas, no debería haber un cambio sustancial en uso de memoria entre usar uno o dos procesos. El Kernel de Linux ya se encarga de gestionar esto no duplicando en memoria la misma librería (usando una técnica copy-on-write)... Al menos en teoría.
espero que soluciones el problema :brindis:
A feature of the 2.6 Linux kernel is caching. Programs loaded in the RAM stay there, even when not needed anymore.
Type: "echo 3 > /proc/sys/vm/drop_caches" at the console and now use "free" again.
Now you get (with firmware 1.1.0):
total used free shared buffers
Mem: 39900 8844 31056 0 4
Swap: 0 0 0
Total: 39900 8844 31056
Note: Normally Linux should free the memory itself, so you don't need this.
I don't know why this isn't working for MAME and for your project, hardyx...
Regards,
Stephan
echo 3 > /proc/sys/vm/drop_caches
Thank you Stephan, this is a good trick. Wow! It works!
En teoria si el código duplicado de las dos aplicaciones está en las librerías usadas, no debería haber un cambio sustancial en uso de memoria entre usar uno o dos procesos.Usan librerías dinamicas los dos, pero me refería también a código común del juego. Aún sí es interesante saberlo.
------
Este es el resultado:
root@wiz:# free
total used free shared buffers
Mem: 39856 21812 18044 0 124
Swap: 0 0 0
Total: 39856 21812 18044
root@wiz:# echo 3 > /proc/sys/vm/drop_caches
root@wiz:# free
total used free shared buffers
Mem: 39856 7172 32684 0 8
Swap: 0 0 0
Total: 39856 7172 32684
root@wiz:#
Antes hay 18 megas libres, y después hay 32 megas. Flipa!!
Ya veremos si se puede utilizar esa memoria.
Thank you Stephan, this is a good trick. Wow! It works!
Usan librerías dinamicas los dos, pero me refería también a código común del juego. Aún sí es interesante saberlo.
------
Este es el resultado:
Antes hay 18 megas libres, y después hay 32 megas. Flipa!!
Ya veremos si se puede utilizar esa memoria.
*****, y esto no se puede usar en otro emus como el MAME o el GnGeo para poder lanzar juegos más tochos?
*****, y esto no se puede usar en otro emus como el MAME o el GnGeo para poder lanzar juegos más tochos?
A falta de que franxis confirme o no, prueba a cargar un juego que no carge en MAME, pero que no sea exageradamente grande, lanzando primero ese comando.
Saludos
Raydenito
11/08/2009, 22:50
Y lo mas mejor de todo: si libera tanta memoria ¿porque no incluirlo de forma genérica en el arranque de la Wiz? :confused:
Ahora veras como viene algún listo y dice que da problemas :D
Bueno, todavía hay que ser cautos y hacer más pruebas. Lo mismo esa memoria luego es reclamada por el sistema al lanzar un programa. Aún así, en el juego tengo que recortar el código duplicado y usar la memoria alta.
Gusarapo
11/08/2009, 22:57
Quizás deberíais usar sync antes de liberar las caches. Puede que podais liberar así aún más memoria.
¿Por otro lado? ¿Cómo de bueno puede ser que se libere la cache sin haber escrito primeramente? Si no se hace muy rápido sync y después la liberación de la cache y de inodos puede que perdais datos y dejeis a la aplicación con inconsistencias. Incluso aunque lo hagais rápido puede que perdais algo (no sé si esto podría ser un problema para vuestros programas)
EDIT: En teoría, ¿no se supone que Linux, a medida que se reduce el espacio de memoria reduce también el tamaño de la cache?
Cya
A falta de que franxis confirme o no, prueba a cargar un juego que no carge en MAME, pero que no sea exageradamente grande, lanzando primero ese comando.
Saludos
No parece que funcione haciéndolo directamente desde un gpe (he creado el siguiente):
#!/bin/sh
echo 3 > /proc/sys/vm/drop_caches
./mame.gpe
cd /usr/gp2x
exec ./gp2xmenu
Al menos el MK3 sigue sin cargar, y la rom ocupa unos 20MB.
No estoy seguro de si es por la nueva forma en la que Franxis ha puesto que use la memoria, o si se debe a que haciéndolo así no funciona, pero parece que en el MAME no tiene efecto, al menos aparentemente.
Nathrezim
11/08/2009, 23:16
Quizás deberíais usar sync antes de liberar las caches. Puede que podais liberar así aún más memoria.
¿Por otro lado? ¿Cómo de bueno puede ser que se libere la cache sin haber escrito primeramente? Si no se hace muy rápido sync y después la liberación de la cache y de inodos puede que perdais datos y dejeis a la aplicación con inconsistencias. Incluso aunque lo hagais rápido puede que perdais algo (no sé si esto podría ser un problema para vuestros programas)
EDIT: En teoría, ¿no se supone que Linux, a medida que se reduce el espacio de memoria reduce también el tamaño de la cache?
Cya
En teoría no habría problema, ya que parece que solo libera las páginas "limpias", con lo que no corres peligro de que se queden cosas sin escribir.
De todos modos ya es raro que no deje acceder a la memoria de esa caché, el kernel debería liberarla cuando un proceso pida más memoria de la que hay libre él solito. Según nos contaron en clase el manejo de la memoria por el kernel de linux es muy buena y no conviene andar tocando.
parece que en el MAME no tiene efecto, al menos aparentemente.
En mi programa tampoco, pero es que necesita mucha memoria. Por eso tengo que unir el código y usar la memoria alta. Hay memoria que es descartable, pero si se usan ciertas funciones o drivers se vuelve a requerir.
¿Cómo de bueno puede ser que se libere la cache sin haber escrito primeramente?
Yo creo que la caché son datos precargados o librerías que se pueden liberar, no datos pendientes de escribir. Pero tampoco soy un gurú de Linux. (Sería raro que te dejara corromper el disco así como así).
Gusarapo
11/08/2009, 23:40
Yo creo que la caché son datos precargados o librerías que se pueden liberar, no datos pendientes de escribir. Pero tampoco soy un gurú de Linux. (Sería raro que te dejara corromper el disco así como así).
Bueno si como comenta Nathrezim es una operación no destructiva no habrá problema. :-)
De todos modos si el problema es que la Wiz tiene una caché de tamaño muy elevado (mis programitas no usan tanta memoria y no he tenido problemas hasta ahora :) ) me parece que se podía fijar su tamaño utilizando un parámetro de /proc/sys/vm
Lo malo es que no recuerdo cual :(
EDIT: por lo que veo en esta página: http://www.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.7/2.6.7-mm1/broken-out/vfs-shrinkage-tuning.patch
El parametro es vfs_cache_pressure
Hardyx, no haz intentado crear una particion en la SD y utilizarla para swapping? No es que sea muy bueno para la SD pero por probar...
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.