Showing posts with label análisis de performance. Show all posts
Showing posts with label análisis de performance. Show all posts

Monday, June 15, 2009

Enamorándome

Disclaimer: post técnico.

El oráculo siempre me ha parecido la base de datos que, por mucho, aventajaba a sus competidores. Por esas cosas del fanatismo, tenía pocos argumentos porque siempre había trabajado con Oracle, salvo algunas cortas pesadillas donde mi disgusto por la nueva base podía tener que ver más con mis costumbres y hábitos que con la diferencia real entre ellas.

Ahora, trabajando con Sql Server, mi gusto por Oracle se está transformando en enamoramiento. Enamoramiento, claro, como el de un tanguero: llorando por lo perdido. O como canta Serrat, no hay nada más amado que lo que perdí.

Y que perdí?. Esto perdí:
  • En Oracle, de toda la vida, un lector no se bloquea porque otro proceso escriba. Sql Server lo incorpora a partir de 2005. Antes, si queríamos hacer que un lector no se bloqueara por un escritor podíamos leer los bloques sucios (no comiteados).
  • En Oracle, el profiler no agrega carga adicional, tanto que si no fuera por el espacio en disco, uno lo podría tener siempre prendido.
  • En oracle el profiler da datos agregados y también da un listado de los eventos generados por esa sesión: por ejemplo, puedo ver una línea por cada bloque que leyó una consulta, viendo a que tablespace fue. En Sql Server solo tengo valores agregados por consulta. Y que para que quiero ver a donde leyó cada bloque?... por ejemplo para saber si está yendo al rollback (o a la tempdb en Sql Server) para leer consistente. Como me entero en el profiler de Sql Server si el problema es que un stored procedure está recibiendo parámetros innecesariamente largos y la demora está en la transferencia de red? (cosa que me ha pasado en Oracle). Más genéricamente, la comunidad de Sql Server parece que todavía está haciendo análisis de performance por indicadores (tema para otro post, mientras tanto, se puede leer online el primer capítulo del libro de Cary Millsap , particularmente la página 6).
  • En Oracle, existe un paquete, llamado DBMS_STATS (por cierto, si googlean algo de Oracle y caen en oracle-dba.com dba-oracle.com (*), sepan que su autor sabe muy poco de lo que habla), que permite generar estadísticas de las tablas para probar que plan elegiría el motor con otros, hipotéticos, juegos de datos. En Sql Server hay un mecanismo no documentado que permite exportar estadísticas de una tabla que ya existe. El mecanismo de Sql Server genera una larga sucesión de números en hexa que tienen codificados, de alguna manera y claramente inaccesible al resto de los mortales (muy Microsoft's way) las estadísticas. O sea, si querés sacarte una duda sobre una situación hipotética, esperá a que se produzca (sin mencionar lo incómodo que es pedirle al DBA algo cada cinco minutos)
  • Oracle tiene RAC, que no es un mecanismo de snapshots, por más que los admiradores de Sql Server lo intenten comparar con la replicación. RAC no es replicación de snapshots, RAC es un mecanismo por el cual varias instancias de bases de datos pueden acceder a los mismos archivos de datos. Y anda muy pero muy bien.
  • En Oracle puedo correr un debug contra los stored procedures sin necesidad de comprar un producto adicional. En Sql Server necesito una de las versiones de 'gama alta' del Visual Studio.
  • Oracle anda en varios sistemas operativos. Sql Server en uno (concedámosle ese status a Windows)
  • En Oracle, hay un UTL_MATCH, para calcular distancias entre strings que hasta implementa el algoritmo Jaro-Winkler. En Sql Server, claro, lo podés hacer.
  • En Oracle existe una API armada que incluye muchísimas funciones típicamente necesarias, en Sql Server se pueden hacer (con la extensión del CLR en 2005). Un ejemplo?... expresiones regulares (lo que ocurre, emho, es que los programadores windows se enteraron de la existencia de las expresiones regulares hace unos pocos años)
Supongo que habrá más diferencias, que iré disfrutando con el correr de las semanas.

Update: me comenta mi amigo P. que el dominio de la empresa de Burleson está mal, que el correcto es dba-oracle.com. En el link de su nombre hay un artículo de alguien que sí sabe sobre la ignorancia de este tipo. En la página de Jonathan Lewis hay bastante sobre Don Burleson.


Friday, May 15, 2009

Modelos de espera

Por motivos que no vienen al caso, el otro día estaba repasando las herramientas y papers que tengo en mi notebook y que pueden llegar a ser útiles en el trabajo. Pienso que hay una, que he usado en los proyectos de mejora de performance (mi pasión oculta, y algo así como el premio consuelo: puedo jugar a detective sin trabajar para House o sin dedicarme a la investigación) que bien vale un post.

La herramienta es tan simple como una planilla excel que se basa en la idea de que un sistema que atiende transacciones en, en definitiva, un modelo de colas. La idea del modelo de colas es bastante simple:
  • Existen una cantidad variable de recursos que atienden peticiones (canales).
  • Los clientes arriban al sistema y si no hay un recurso que atienda espera poniéndose en una cola.
  • Los canales demoran en atender cada cliente un tiempo variable descrito por una función de probabilidad.
  • Los clientes arriban al sistema en intervalos variables descriptos por una función de probabilidad
Los cálculos que yo conozco se basan en sistemas donde la disciplina de la cola es FIFO, la distribución de los arribos se describe como un proceso Poisson caracterizado por la tasa de clientes arribados sobre unidad de tiempo. Los tiempos de servicio de los canales (lo que tarda cada canal desde que la petición entra el canal, no a la cola, hasta que sale) se describen por medio de una distribución exponencial. Se puede complicar más ( impaciencia de los clientes, otras disciplinas de espera ) pero usualmente el modelo básico es suficiente para analizar un software up&running.

Prácticamente, no me he encontrado con un sistema que no pueda ser modelado como un sistema de colas:
  • Un sistema web recibe peticiones (los GET y POST HTTP) que son atendidas por threads que corren en el application server. Los threads son los canales de atención y si no hay un thread disponible, la petición espera.
  • Un proceso batch procesa peticiones (transacciones) que esperan en cola hasta que el proceso puede atender a la próxima.
  • Una base de datos que recibe DML es tiene una serie de procesos que atienden las peticiones
Encuentro particularmente útil el modelo de colas no para reemplazar al test de stress de un sistema, sino para complementarlo. Así, luego de terminar el test de stress o de mirar en producción un rato puedo contestar fácilmente preguntas del tipo:
  • Que sucedería si mi sistema recibe el doble de peticiones y hago un esfuerzo (en rediseño) para que el tiempo de servicio no aumente más del 10%?
  • Si espero un determinado incremento en la carga de transacciones, cual debería ser mi optimización del tiempo de servicio para obtener un determinado tiempo libre del canal (para tareas administrativas, por ejemplo).
Craig Shallahamer tiene un excel de un modelo de colas en su web (en el link hasta que Craig decida rediseñar su página). Es una modesta maravilla que en la primer solapa requiere la introducción de los valores característicos y en las siguientes muestra la evolución del sistema con variaciones de los valores característicos.

Así que la próxima vez que un cliente, con cara de ‘ahá, acá te cagué, consultor’ pregunte: 'y de donde sacaste que si la carga de transacciones aumenta un 20% me quedo sin tiempo para el backup', uno puede sacar las planillas y agobiarlo con una clase de investigación operativa ligera.

Y como bien saben los economistas, mostrar números y matemática razonablemente avanzada da un aura de respetabilidad. Aunque todo esté construido sobre nada. En realidad, el modelo de colas sí funciona para el análisis de performance de los sistemas informáticos, simplemente tenía ganas de hablar mal de los economistas. Porque (y con el solo objeto de divertirse un rato con una buena lectura y sin que tenga relación con el post) como bien señala Leonardo Moledo, con la economía es otra historia.