MTRR Significa”Memory Type Range Registers” y es la forma como la memoria RAM es segmentada para ser accedida por distintos dispositivos de hardware (sistema, dispositivos, bus AGP y video-RAM).
El error
En algunos sistemas Linux se presenta un error recurrente (no solamente en Intel, también en ATI) :
dmesg | grep drm [ 7.112889] [drm] Initialized drm 1.1.0 20060810 [ 7.938443] [drm] MTRR allocation failed. Graphics performance may suffer. [ 7.938701] [drm] set up 7M of stolen space [ 8.063932] [drm] initialized overlay support [ 8.705706] fb0: inteldrmfb frame buffer device [ 8.713896] [drm] Initialized i915 1.6.0 20080730 for 0000:00:02.0 on minor 0
Fijense que DRM (Direct Rendering Manager) indica que no pudo registrar un segmento de RAM para la tarjeta de video, advirtiendonos que esto incurría en un serio fallo de performance.
Y muy serio, Sin ninguna corrección, glxgears reporta entre 180 y 200 fps.
Ya yo había hablado de este bug antes y había comentado la forma de corregir el fallo acá.
Solo quería confirmar que en la última versión de Squeeze, el último kernel y la última versión de video-intel el error sigue sucediendo.
Los síntomas
Los síntomas son entre otros (no necesariamente ocurren todos, depende del equipo):
- glxGears reporta entre 180 y 220 FPS (una velocidad muy baja de frames por segundo)
- Corrupción y/o lentitud en algunos efectos del compiz
- Imposibilidad de acceder a video pantalla completa (o videos flash-youtube pantalla completa) de manera “suave”.
Cuando revisamos el estado de los rangos de asignación de la memoria RAM, vemos los siguiente:
cat /proc/mtrr reg00: base=0x0c0000000 ( 3072MB), size= 1024MB, count=1: uncachable reg01: base=0x13c000000 ( 5056MB), size= 64MB, count=1: uncachable reg02: base=0x000000000 ( 0MB), size= 4096MB, count=1: write-back reg03: base=0x100000000 ( 4096MB), size= 1024MB, count=1: write-back reg04: base=0x0bf700000 ( 3063MB), size= 1MB, count=1: uncachable reg05: base=0x0bf800000 ( 3064MB), size= 8MB, count=1: uncachable
Vemos que las regiones 04 y 05 (bus AGP y video) están “uncachable”
Fijense que si desactivamos esas regiones y re-activamos (en modo write-back):
echo 'disable=5' >| /proc/mtrr echo 'disable=4' >| /proc/mtrr echo 'disable=0' >| /proc/mtrr echo 'disable=1' >| /proc/mtrr
Ejecutamos:
echo "base=0x0 size=0x80000000 type=write-back" >| /proc/mtrr echo "base=0x80000000 size=0x10000000 type=write-combining" >| /proc/mtrr
Consultamos:
cat /proc/mtrr
reg00: base=0x400000000 (16384MB), size=16384MB, count=2: write-back reg01: base=0x200000000 ( 8192MB), size= 8192MB, count=1: write-back reg02: base=0x000000000 ( 0MB), size= 4096MB, count=4: write-back reg03: base=0x100000000 ( 4096MB), size= 4096MB, count=2: write-back
glxGears mejora un 10%:
glxgears
1494 frames in 5.0 seconds = 298.796 FPS
1582 frames in 5.0 seconds = 316.213 FPS
1616 frames in 5.0 seconds = 323.090 FPS
Pero no vamos a estar ejecutando eso cada vez … así que ejecutaremos la corrección a lo “Debian Squeeze”.
La Solución
Primero, optimizaremos al máximo nuestra tarjeta, para ello crearemos un archivo en:
/usr/share/X11/xorg.conf.d/10-screen.conf
Nota: si es ubuntu-trisquel, la ruta es en /usr/lib/X11/xorg.conf.d/
Al cual agregaremos opciones de “máximo performance” para la tarjeta de video Intel:
Section "Device" Identifier "Configured Video Device" Driver "intel" Option "AllowGLXWithComposite" "true" Option "XAANoOffscreenPixmaps" "true" Option "AddARGBGLXVisuals" "True" Option "VideoRam" "262144" Option "AccelMethod" "UXA" Option "EXAOptimizeMigration" "true" Option "MigrationHeuristic" "smart" Option "Tiling" "true" Option "NoDDC" Option "BackingStore" "True" Option "AIGLX" "true" Option "MTRR" "on" Option "LinearAlloc" "6144" Option "MonitorLayout" "CRT,LFP" Option "DevicePresence" "true" Option "RenderAccel" "true" Option "RandRRotation" "on" Option "XvMC" "true" Option "CacheLines" "1980" EndSection
Son de vital importancia:
- VideoRAM: cantidad de RAM que asignaremos al video
- MTRR: “on” indicarle a la tarjeta de video que hay un rango MTRR para que pueda hacer caché de video
- AccelMethod: UXA, modo de aceleración 2D/3D nativo de la tarjeta Intel
- MigrationHeuristic: Descubrí que con “smart” el equilibrio entre 3D y 2D es perfecto, aunque se dedica más a 3D, si queremos favorecer más al 2D, usaremos “always”, si queremos mejorar algunas cosas 3D para compiz usaremos “greedy”.
- xvMC: Activa la extensión “Video Motion Compensation” de Intel, con lo cual los programas de video (VLC, mplayer, Xine, etc) usarán la GPU Intel (y no software) para procesar el video, mejorando la calidad y el performance.
Posteriormente, editaremos el grub, en la linea de comandos del grub agregaremos:
editamos /etc/default/grub
GRUB_CMDLINE_LINUX="acpi=force vga=0x31B mtrr_spare_reg_nr=1 enable_mtrr_cleanup"
Las opciones son:
- enable_mtrr_cleanup: permite al Kernel *eliminar* las regiones y volverlas a crear si ocurre un fallo
- mtrr_spare_reg_nr: genera una región de *repuesto* adicional en este caso, una sola (región 6) que tomará la tarjeta de video.
Volvemos a generar el menu del grub (grub.cfg)
update-grub2
Y reiniciamos.
Al terminar de reiniciar, podemos ver que DRM inicia correctamente y sin fallos:
dmesg | grep drm [ 5.439814] [drm] Initialized drm 1.1.0 20060810 [ 5.729688] [drm] set up 7M of stolen space [ 5.854882] [drm] initialized overlay support [ 6.458946] fb0: inteldrmfb frame buffer device [ 6.462396] [drm] Initialized i915 1.6.0 20080730 for 0000:00:02.0 on minor 0
Que la tarjeta de video logra reservar un espacio “write-combining” en la región 6:
cat /proc/mtrr reg00: base=0x000000000 ( 0MB), size= 2048MB, count=1: write-back reg01: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back reg02: base=0x0bf700000 ( 3063MB), size= 1MB, count=1: uncachable reg03: base=0x0bf800000 ( 3064MB), size= 8MB, count=1: uncachable reg04: base=0x100000000 ( 4096MB), size= 1024MB, count=1: write-back reg05: base=0x13c000000 ( 5056MB), size= 64MB, count=1: uncachable reg06: base=0x0e0000000 ( 3584MB), size= 256MB, count=1: write-combining
Y lo que nos interesa para nuestro “performance”, obtenemos unos 450 FPS de promedio (eso es casi 50% de mejora):
glxgears -info GL_RENDERER = Software Rasterizer GL_VERSION = 2.1 Mesa 7.7.1 GL_VENDOR = Mesa Project 2277 frames in 5.0 seconds = 455.288 FPS 2314 frames in 5.0 seconds = 462.779 FPS 2251 frames in 5.0 seconds = 450.191 FPS
Conclusiones
Mucha gente monta GNU/Linux Debian o Ubuntu de manera genérica y como *cae* al disco duro, comienzan a usarlo y lo sienten “pesado” sin olvidarse de la necesidad imperiosa de “enchular” la computadora para mejorar el rendimiento y así gozar de una experiencia más placentera al usar nuestro GNU/Linux.
¿Pruebas?
Me dediqué a sacarle “provecho” a la aceleración 3D, con 500 FPS no son los 2000 FPS que logra mi Nvidia 8400 SLI del Desktop pero esta es una portatil!.
Para muestra, podemos ver una pantallazo interesante:
Aca podemos ver a Billard-GL (un juego de Billar 3D que usa SDL y openGL) a pantalla completa.
Pero para mejores pruebas, tenemos esto:
Fijense que tengo cargados tanto Compiz (icono superior, fusion-icon), como Billard-GL y además, a ExtremeTuxRacer (reportando a 40FPS) y el Firefox cargado (para consumir RAM obviamente).
Para probar la aceleración openGL + la extensión xvMC cargames un video y corremos el efecto “cubo” de compiz, el video no debería “ralentizarse” nunca.
Espero que logren disfrutar sus juegos 3D y su compiz a full efectos!.













Pingback: Linux Video: mejorando la aceleración de video | Phenobarbital con Soda!
Pingback: Articulo Indexado en la Blogosfera de Sysmaya
muy buen articulo modifique mi xorg.conf para debian lenny amd 64 y consegui unos 1011.305 fps que me parecen bastante bien gracias por el dato
Felicidades!, eso es bueno!
Gracias por el comentario!
Pingback: [Linux] El parche milagroso de Mike Galbraith en acción | Phenobarbital con Soda!
Perfecto, estoy por implementarlo junto con el parche de las ~200 lineas. Sin embargo, mi tarjeta de video es Nvidia, y veo que muchas de las opciones son para Intel. Sabes cuales se deben usar en éste tipo de tarjetas (Especificamente una VGA compatible controller: nVidia Corporation G84 [GeForce 8600M GT] (rev a1))
Gracias!
La mayoría son de intel, las de nvidia tendré que hacer un artículo!, jajaja (mi desktop es una Nvidia Gforce idéntica a la tuya, una G84 GT)
Hola, buenos dias. Creo q ya estoy fastidiosa, pero ayer instale Canaima Vc5 y esta corriendo a la perfeccion en una toshiba satellite A215, fue tan suave y sin errores la instalacion y reconocio todo el hardware a dudosa diferencia de squeeze que me dejo sin sonido, que decidi meterle mano por primera vez viendo las mejoras que le has hecho a las canaimitas me propuse tener esas mejoras en mi canaimota, segui las instrucciones de debiansick para compilar un kernel y en el paso de la configuracion del mismo me salte a su receta de como activar el cgroup en el kernel 2.6.38, y aunq la mejora es brutal he leido en tus articulos que a tus masquinas les haces una serie de mejoras distintas. Como soy dise;adora grafica y planeo incursionar en blender le puse una velocidad en lo de la latencia de 1000 mghz, aun no he probado como responde el renderizado en cinelerra porq quiero probarlo cuando tenga todo a punto. Mi pregunta es, este archivo de configuracion se puede crear para otras tarjetas de video? a mi no me da los errores que tu dices pero sospecho que podria afinarse mejor el video integrado, estoy en lo correcto? Esto trae es una ATI Radeon Mobility pero siento que me da valores muy bajos
828 frames in 5.0 seconds = 165.357 FPS
816 frames in 5.0 seconds = 163.083 FPS
823 frames in 5.0 seconds = 164.524 FPS
817 frames in 5.0 seconds = 163.388 FPS
834 frames in 5.0 seconds = 166.792 FPS
Donde puedo conseguir los valores correspondientes del archivo 10-screen.conf para mi tarjeta de video?
Donde puedo conseguir la documentacion de tus ponencias de pimp my canaima? Una pregunta ya q tu estas en el medio, canaima ya trae la mejora de lennart pottering o debo realizarla? GRacias por leerme y disculpa lo largo de mi comentario. Q disfrutes tu semana.
El error SOLO ocurre en Intel (de eso se trata el artículo) la configuración de video para ATI Radeon es completamente distinta y no deberías fijarte en los archivos que yo pongo en mi blog …
No tengo una RADEON para probar y disponer de un Xorg válido para tu equipo …
Creo que hice algo mal, ahorita que reinicie con el kernel viejo me doy cuenta de esto
2320 frames in 5.0 seconds = 463.878 FPS
2361 frames in 5.0 seconds = 472.074 FPS
2378 frames in 5.0 seconds = 475.407 FPS
2379 frames in 5.0 seconds = 475.660 FPS
No podré saber que hiciste mal si no sé que hiciste … tienes algo mal en la configuración de las X …
El problema se mantiene en squeeze (stable) , lo que no entiendo es el uso del parametro vesafb en el kernel . En mi caso no me reconoce la tarjeta al poner info en /etc/X11/xorg.conf u /usr/share/X11/xorg.conf.d/10-screen.conf
Hola que tal ,
tengo una
VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) , tuve el problema de la asignacion del DRM , le pase los parametros al kernel , y una modificacion al xorg.conf , pero los FPS se redujeron de 70 a 59 , en promedio aproximadamente .
dmesg | grep drm
[ 7.697608] [drm] Initialized drm 1.1.0 20060810
[ 7.993516] fb: conflicting fb hw usage inteldrmfb vs VESA VGA – removing generic driver
[ 8.051637] fb0: inteldrmfb frame buffer device
[ 8.051652] drm: registered panic notifier
[ 8.051803] [drm] Initialized i915 1.6.0 20080730 for 0000:00:02.0 on minor 0
alguna idea? , uso slackware 13.37 64bits , no creo que ese sea el problema
Estás intentando usar fbdev?, necesitas DRI2 y una versión nueva de Xorg … verifica comparar entre los modos XAA, EXA y UXA para comparar el uso …
slackware usa fbdev . Para mostrar los pinguinitos segun el numero de nucleos al iniciar ,
XAA ,EXA y UXA rinden casi mismo pero este no pasa de 60 FPS, puedo activar la aceleracion 3D , pero es muy inestable , busque informacion de mi procesador y parece que es de los hibridos (CPU+GPU) , en la red lei que el soporte estaba pesimo , en fin se me cae el servidor grafico a cada rato , y luego no me deja levantarlo nuevamente , tengo que reiniciar la pc (ya asta windows parece por tanta reiniciada) . Mi nucleo es 2.6.37.6 , no quiero usar un nucleo mas moderno , asi que decidi que pondre una tarjeta de video nvida por ahi , espero que esto lo solucione gracias de antemano.