Bienvenidos

Todos estos pasos descriptos fueron probados en ambientes productivos

lunes, 13 de junio de 2011

Direct IO y la p......


El escenario era el siguiente :
Teniamos un dominio del 10.000, conectado directamente a 2 storage externos un EMC y un SHARK, el s.o era solaris 7, con oracle 9.2.01
Migramos dicho servidor a un 4900, con solaris 10 , veritas 4.0 y oracle 10, conectado a el mismo storage pero a travez de una SAN ( switch brocade 24K ), con placa qlogic 2340.
 El problema era el siguiente :

Luego de migrar, la gente de base de datos decia que :
Las aplicaciones que hacen acceso random a los datafiles de oracle, tienen mucha mas demora que en la maquina anterior.
Las operaciones que realizan un acceso secuencial sobre los datafiles, funcionan mucho mejor. ( fullscan).            

Teniamos hasta el momento,segun estos datos, 2 lugares hacia donde apuntar, los discos de la SAN o quizas los parametros de la placa qlogic.

Por ejemplo, uno de los parametros a modificar en el /kernel/drv/qlc.conf , podria llegar a ser el hba1-execution-throttle=256 ( donde el actual es 1 )   
LUEGO, tocamos los siguientes parametros en el /etc/system :

El dba, me dijo que bajaron los tiempos con este parametro
* Tamanio fisico maximo de un I/O con VM                 
* Unidad=sector (de 512 bytes)                       
   
set vxio:vol_maxio=32768                                 

Tocamos parametros de Veritas de io

Luego de esto ultimo, El DBA me dijo que ya estaba solucionado el problema y que el resto seria un bug de Oracle, por lo cual pedi cerrar el caso en sun.

A los 2 o 3 dias, seguimos con los mismos problemas.
El escenario sigue siendo el mismo que detalle al comienzo .
El tema es que el error los da en forma aleatoria. ya sea en forma secuencial o random.

Lo que probe hacer fue bajar desde veritas con el vxtunefs bajar el parametro  discover_direct_ioz a 64 k, segun me guie en el siguiente blue print
http://www.sun.com/blueprints/0400/ram-vxfs.pdf             
                                                                                      

Pero se sigue dando el error en forma aleatoria y mas seguido cuando se trabaja con lectura random.

Abreviando muchismo, aca fue donde afinamos la punteria :
1) Generamos 2 filesystems para probar, ellos son /interfaz y /carga.
al filesystem /carga le sacamos el parametro directio de las opciones del mount.
y al filesystem /interfaz, le dejamos la opcion directio en el vfstab, que es como esta en el ambiente productivo.
/dev/vx/dsk/SOS/vol01 /dev/vx/rdsk/SOS/vol01 /carga vxfs 3 yes largefiles                                        
/dev/vx/dsk/SOS/vol02 /dev/vx/rdsk/SOS/vol02 /interfaz vxfs 3 yes largefiles,convosync=direct                    
Realizamos las siguientes pruebas.                                                                               
 En el fs /carga, ejecutamos un vxbench con opciones , write, read, random write,                                
 random read sin direct i/o y un vxbench con las mismas opciones pero con directio.                              

 A continuacion muestro la salida de los vxbench que hicimos en el fs /carga, Observemos los tiempos de
 la primer columna , como se pegan un viaje cuando los tiras con directio.      
Write SIN Directio
 /carga/PRUEBA # /usr/sbin/vxbench -w write -i iosize=16,iocount=10000,nrep=
10 test1
 total: 5.088 sec 314448.66 KB/s cpu: 4.84 sys 0.21 user                           
Read SIN Directio                                                                  
 /carga/PRUEBA # /usr/sbin/vxbench -w read -i iosize=16,iocount=10000,nrep=10 test1
 total: 2.830 sec 565335.87 KB/s cpu: 2.65 sys 0.17 user                           
Write CON Directio                                                                 
 /carga/PRUEBA #/usr/sbin/vxbench -w write -i iosize=16,iocount=10000,nrep=10 -c direct test2
 total: 101.390 sec 15780.62 KB/s cpu: 12.01 sys 0.47 user                                  
READ CON Directio
 /carga/PRUEBA # /usr/sbin/vxbench -w read -i iosize=16,iocount=10000,nrep=10 -c direct test2
 total: 88.032 sec 18175.25 KB/s cpu: 10.05 sys 0.45 user
Randon Write SIN Directio
 /carga/PRUEBA # /usr/sbin/vxbench -w rand_write -i iosize=16,iocount=10000,nrep=10 test3
 total: 19.299 sec 82906.56 KB/s cpu: 18.09 sys 0.43 user
Randon READ SIN Directio
/carga/PRUEBA # /usr/sbin/vxbench -w rand_read -i iosize=16,iocount=10000,nrep=10 test3
 total: 6.507 sec 245873.36 KB/s cpu: 6.17 sys 0.32 user
Random Write CON Directio
/carga/PRUEBA # /usr/sbin/vxbench -w rand_write -i iosize=16,iocount=10000,nrep=10 -c directio
 total: 362.794 sec 4410.21 KB/s cpu: 53.67 sys 0.77 user
Random READ CON Directio
/carga/PRUEBA # /usr/sbin/vxbench -w rand_read -i iosize=16,iocount=10000,nrep=10 -c directio
 total: 663.139 sec 2412.77 KB/s cpu: 12.64 sys 0.56 user
/carga/PRUEBA #


Hicimos las mismas pruebas sobre el filesystem /interfaz, es decir el que esta montado con directio
y la conclusion fue ....................:
En el /etc/vfstab, sacamos la opcion convosync=direct de los filesystems de la Base de Datos y anduvo Perfecto.

 
       



 


                       
                

No hay comentarios:

Publicar un comentario