miércoles, 2 de noviembre de 2011

[11 de 97] Tambien tienes que saber de hardware.


Post publicado originalmente entre Mayo del 2009 y Enero del 2011 en mi anterior blog.
Pertenece a una serie sobre arquitectura de software, replicaré los comentarios ya que, a mi parecer, son lo más importante de la serie.

Puedes encontrar el listado de esta primera entrega en este enlace.

El axioma de hoy (tomado del libro 97 things Every Software Architech Should Know) dice:

"También tienes que saber de hardware"
Kamal Wickramanayake.

Kamal Wickramanayake es un arquitecto de software que vive en Sri Lanka. Está certificado en TOGAF por el Open Group.

[NT. El título original del axioma es: You have to understand Hardware too]

Aquí parte importante del axioma:

Hardware store

---

For many software architects, hardware capacity planning is a topic that lies beyond their comfort zone, yet it remains an important part of the architect’s job.  There are a number of reasons software architects often fail to properly consider hardware but they mostly have to do with a lack of understanding and unclear requirements.  

The primary reason we neglect hardware considerations is that we are focused on software and tend to ignore hardware demands. In addition, we are naturally isolated from hardware by high-level languages and software frameworks.

Unclear requirements are also a factor as they may change or may be poorly understood.  As the architecture evolves hardware considerations will also change.  In addition, our clients may not understand or be able to predict the size of their own user base or system usage dynamics.  Finally, hardware is constantly evolving. What we knew about hardware in the past does not apply today.  

Without hardware expertise predicting hardware configurations for systems to be developed is highly error prone. To compensate some software architects use large safety factors. Such safety factors are generally not based on objective assessments or founded in any methodology. In most of the cases, this leads to excessive infrastructure capacities that will not be utilized even in periods of peak demand. As a result, clients' money is wasted on more hardware than a system will ever need.

The best defense against poor hardware planning is to work closely with an infrastructure architect.  Infrastructure architects, unlike software architects, are specialists in hardware capacity planning and they should be a part of your team.  However, not every software architect has the luxury of working with an infrastructure architect. In such cases there are some things a software architect can do to mitigate errors when planning for hardware.

Hardware capacity planning is as important as software architecture and it needs to be given a first order priority whether you have an infrastructure architect on hand or not.  Just like an architect is responsible to establish the links between business demands and a software solution, she is responsible to envision the links between hardware and software.

---


A riesgo de equivocarme, creo que una de las cosas que hacemos en nuestros inicios en este peregrinaje evolutivo, es que, pasamos por alto cuestiones de bajo nivel, y, escudándonos con la abstracción, dejamos los temas relacionados con el hardware para "alguien más".

Voy a iniciar este post compartiendo una anécdota para ejemplificar un poco lo costoso que puede ser que pasemos por algo que:  lo efímero y etéreo de nuestro código requiere bases físicas, tangibles, medibles  y sobre todo, algo que se nos olvida constantemente,  limitadas.

Hace un par de años me encomendaron realizar una pequeña aplicación de escritorio que tenia que ser distribuida mediante JNLP, la tarea parecía sencilla (iluso de mí) sólo se trataba de manipular en promedio unas 20 imágenes y agruparlas de una manera amigable, estaba a punto de terminar cuando el encargado de proyecto me dijo:

-"Espero que ya te hayan comentado de la restricción 
que tenemos con las maquinas-cliente"

 -Lo primero que pensé fue: 
"Sabia que no sería fácil".
-"¿Cual restricción?" pregunté. 

-"Los equipos solo cuentan con 256MB en memoria RAM" argumentó.
- No pude evitar reírme,  
cuando me dice:
-"No, no te rías, es en serio"

A partir de ahí, una tarea sencilla se convirtió en una tarea algo compleja y llena de pruebas, certificaciones por parte del cliente y cambios en la manera en que manipulaba los BufferedImage :P

Y, aquí el punto es que, no sólo importa conocer las condiciones actuales del hardware sobre la cual se ejecutará nuestra aplicación, sino que además cuales serán las previsiones que debemos tomar para el crecimiento de nuestra aplicación.

Aunque suene más filosófico que técnico, debemos aprender a crecer (o ¿aprender es crecer?); y en ese viaje seguramente nos toparemos con los términos: Escalabilidad y Capacity Planning.

Así que, me permito compartirles estos enlaces que considero pueden ser útiles:
Y, hablando de Capacity Planning, uno de los libros que más se están moviendo en amazon es el siguiente:
cpjpg






The Art of Capacity Planning: Scaling Web Resources (Paperback)
by John Allspaw (Author)






Seguramente, como hasta ahora, sus comentarios enriquecerán este post.  ;)  pero, en lo que llegan, Dilbert tiene cosas que decir:

dilbert

Saludos a todos!!

RuGI
Isaac Ruiz Guerra.


Comentarios:

Siguiendo la misma línea del post, quisiera aportar con un artículo de Joel Spolsky:


Joel Spolsky no se refiere en ese artículo directamente al hardware, pero al igual que Rugi, indica que se deben tener en consideración los aspectos básicos durante el desarrollo de software. Eso incluye al hardware.

Excelente post Rugi, saludos!

Enviado por Germán G. en julio 26, 2009 a las 11:56 PM CDT #
---
Ummm, no llego a estar 100% de acuerdo con este consejo, sobre todo con esta frase:
"To compensate some software architects use large safety factors. Such safety factors are generally not based on objective assessments or founded in any methodology."

le respondería: ya bueno, ¿y que? ;-) Preguntad a cualquier ingeniero civil: tras realizar todos sus cálculos de elementos finitos de infraestructuras, siempre aplicará márgenes de seguridad a todos sus cálculos (alguno me ha comentado que van desde un 10% hasta un 20%).

[OT]E incluso cuando hablamos de dinero: un veterano ingeniero (con un montón de proyectos a sus espaldas) me comentó que como mínimo el siempre ponía en sus presupuestos un 12% para "imprevistos"[/OT]

Lo digo porque a veces el ingeniero de software parece frustrado porque su trabajo no se basa en fórmulas exactas con base científica probada (necesitaré ln 2*xE3 megas de RAM siendo X el LOC de mi proyecto ;-)), y desprecia los "desperdicios" de hardware. Y parecen olvidar que en nuestra industria el recurso más caro es la hora-hombre.

Dedicar 20 horas a estudiar hasta sus últimas consecuencias si necesitamos 512Mb de RAM o 4 gigas es en sí mismo una pérdida económica bestial, teniendo en cuenta el precio de la memoria RAM. Por no hablar de la pérdida que pueden suponer las equivocaciones por abajo. Las equivocaciones por arriba, dentro del ámbito de lo razonable (no usar un cluster de 20 servidores cuando sólo era necesario 1 ;-)), no son tan costosas, y además siempre dejan el camino libre para que el sistema evolucione a proporcionar más servicios que los previstos inicialmente (cosa que pasa un montón de veces).

No digo que no haya que estudiar las necesidades hardware de nuestro sistema, pero más por predictibilidad de su comportamiento en distintas configuraciones y no por ajustar exactamente en que sistema debe funcionar. Pero ello se puede hacer mientras se testea la aplicación, midiendo estadísticamente (y para ello aprendiendo nociones básicas de estadística:http://zedshaw.com/essays/programmer_stats.html ) como se comporta la aplicación. Y además esa medida puede poner de manifiesto errores más graves (de repente de un build al siguiente la aplicación pasa a necesitar el doble de memoria, ¿que ha pasado?)

Creo que en estos momentos el factor hardware que más deberíamos tener en cuenta, y que en algunos casos se está despreciando, son la explosión de quores en las cpu's modernas, porque es un factor que realmente fija el sistema operativo a utilizar, la máquina virtual e incluso, en determinados casos, el diseño-programación de la aplicación. Pero es que el concepto "infraestructure architect" (oh no! otro arquitecto más no por diosss! ;-)) me ha chirriado un poco al leerlo ;-)

Salu2

PD: @Rugi, creo que en la anécdota que cuentas el hardware es un requisito del proyecto, no una necesidad. Por lo tanto te debían informar al principio, y no tiene que ver con planificar correctamente el despliegue de la aplicación (cosa que tu hiciste correctamente para los requisitos que te dieron inicialmente)

Enviado por Ibon Urrutia en julio 27, 2009 a las 06:49 AM CDT #
---
Lo que apuntas, considero, sigue siendo importante: los programas corren dentro de sistemas, y esos sistemas pueden ser (y muchas veces lo son) distintos. Recuerdo más de un ejemplo de Java 1.2 donde se escribía en un lado, pero no sucedía exactamente lo mismo en todas las arquitecturas.
 Adiós portabilidad.

Otro aspecto es el que dice el dicho "según el sapo es la pedrada". Ibon, como siempre un genio, apunta que la RAM es muy barata estos días, pero en mi Mexicalzingo veo que en muchas empresas pequeñas es sencillamente imposible en estos días de "ajuste económico" encarar tales actualizaciones. Lo más divertido/frustrante es cuando se obvia el SO del cliente, y te encuentras máquinas con Win95A (sin siquiera la actualización de Explorer 4) con 64 MB (menos 8 de video). La lógica del cliente es irrefrutable: le han funcionado hasta entonces. ¿Por qué habría de gastar miles de pesos en actualizar con todo lo "bueno" que oye de Vista?

No puedo olivar la cara del ingeniero, flamante a instalar el framework del .NET 3 para que corriera su mini-aplicación. ¡Ya mero! Y la verdad, yo no tendría cara para recomendar que cambiaran 40 computadoras a XP, Vista, OSX o algún Linux... o que sus empleadas (gente medianamente mayor) aprenda un nuevo entorno... tomando en cuenta que tienen sus licencias de su flamante Office para Win95. ¿512 megas para que arranque el .NET? Ese es el espacio en disco que 5 de esas máquinas tenían... ¿dónde queda entonces la optimización de nuestros sistemas?

Enviado por Miguel Zúñiga González (miguel~1.mx) en julio 27, 2009 a las 06:17 PM CDT #
---
And Capacity Planning isn't nearly as hard as people think: for a software person doing "scrum" or XP, it's just another unit test, to make sure the response time of the program stays the same or improves as you do more development. 

Enviado por David Collier-Brown en julio 27, 2009 a las 06:41 PM CDT #
---
Absolutamente de acuerdo con la recomendación. Y en desacuerdo con Ibon, un descuido en hardware no es sólo de unos centavos y tampoco tiene que ser escoger entre 1 y 20 instancias, he tenido experiencias verdaderamente costosas para pasar de un cluster de 2 a 6 (unos US 800k).

Y no sólo es importante para dimensionar, en ambientes de clustering en decidir si activar o no transferencia de sesión puede decidirse en base a tener un etherchannel o no, por la cantidad de RAM que tenga disponible el servidor (que no siempre es tan barata, menos cuando es una actualización masiva), etc.

Aparte de hardware yo agregaría conocimientos de sistemas operativos, red y todos los elementos sobre los que se soporta el software.

¿Qué es una locura un arquitecto de infraestructura? ¿qué no es necesario?

Te mostraría un par de proyectos donde sin 3 ó 4 de estos la cosa nunca hubiera posible.

Saludos.

Enviado por Pedro en julio 27, 2009 a las 07:30 PM CDT #
---

@Pedro
Perdona, pero no me salen las cuentas. Me he ido a la página de Dell (ya que el precio va apareciendo según eliges configuración), he elegido un powerEdge R900 (su servidor más potente), y me he puesto a configurarlo con una selección bestial (256Gigas de Ram!, teras y teras de discos duros en RAID, procesadores cuadruples), y a lo máximo que he llegado han sido a 60.000 €. 6 servidores andarían sobre los 360.000, más todo el equipamiento de redes que quieras, no llego a los 800.000 $ ni de lejos. Y eso, partiendo de unos servidores monstruosos que no he llegado a tener el placer de ver en mi vida profesional (lo cual no significa nada... pero es que no veo la aplicación que llegue a necesitar 256Gigas de Ram!)

¿Podrías especificar más en que se fueron esos 800.000 $? (Tal vez en IBM's, pero es que aún siendo muy bestia con el hardware, me parecería un error pagar el DOBLE por unos IBM's)

"en ambientes de clustering en decidir si activar o no transferencia de sesión puede decidirse en base a tener un etherchannel o no, por la cantidad de RAM que tenga disponible el servidor"

Por supuesto, pero es que ahí estás hablando del despliegue. Creo que los dos estaríamos de acuerdo en que diseñar la aplicación pensando en que tenemos un etherchannel disponible, sería un error, o por lo menos una imprudencia. Mejor diseñarla no teniendo en cuenta el hardware/configuración de red concreta, para que se pueda adaptar a distintos despliegues.

Vamos, o esa ha sido una de las promesas de muchos servidores de aplicaciones, hacernos transparente detalles como la transferencia de sesión entre nodos de un cluster o la tolerancia a fallos.

No digo que haya que diseñar pensando en que tenemos un hardware con capacidades infinitas (lo cual puede redundar en necesitar mega-servidores); lo que creo es que partir de ciertas suposiciones (o confirmaciones) del hardware a utilizar, pueden desembocar en decisiones de diseño erróneas, que esas sí que son costosas (sospecho que en los 800.000$ también hay metidas muchas horas de rediseño y refactorización de la aplicación).

Repito, según se vaya testeando la aplicación, hay que ir teniendo en cuenta que exigencias de hardware tiene. Doy por hecho que el testeo se realiza en una configuración hardware lo más parecida posible a la de puesta en producción, pero la verdad, no se como se puede hacer un "hardware capacity planning" REAL, sentándose en una mesa y estudiando el CPD disponible. Lo siento, pero creo que usar esos "safety factors" de los que parece renegar el axioma, son la única solución razonable cuando aún no hay código real corriendo en ningún sitio.

Precisamente, yo soy ingeniero de telecomunicaciones, especialidad telemática, y siempre agradezco mis conocimientos de redes a la hora de diseñar/programar software, y creo que todo el mundo debe tenerlos. Pero tenerlos en cuenta en su justa medida, y viendo que el recurso humano puede ser mucho más costoso que el hardware (lo sigo pensando)

Acabo:
Lo que me chirría es la palabra "arquitecto" en todos y cada uno de los niveles técnicos necesarios en una empresa. No un menosprecio a la labor de la gente de sistemas, extremadamente necesaria en el despliegue, pero que pueden inducir a errores y suposiciones en la etapa de diseño.

Mi mantra: diseña pensando en el despliegue, no en el hardware concreto.

Salu2

Enviado por Ibon Urrutia en julio 28, 2009 a las 08:48 AM CDT #
----

Hombre, leyendo lo que dice yo no creo que "reniegue" de los "safety factors", de lo que reniega es de que se calculen sin la más mínima base ni metodología, que es en muchos casos lo que se hace.

Y por mi parte considero que ha de haber un equilibrio, ni debes basarte en el hardware en concreto hasta el último detalle para diseñar tu aplicación, ni debes diseñarla pensando que vives en un mundo feliz donde todos los recursos serán infinitos y luego ya veremos como lo instalamos en el mundo real.

No, escalar no es tan fácil como echar mano a la cartera y cascar más servidores/RAM o lo que sea, y aunque no creo que para diseñar buenas aplicaciones haya que saber diseñar puertas logicas a base de colocar trozos de semiconductores, tampoco creo que se pueden diseñar buenas aplicaciones ignorando la capa física sobre la que han de correr, si tendrán que ir en cluster.

Para mí no es únicamente parte del deploy, es parte del análisis y como todos los factores, hay que tenerlo en cuenta en su justa medida. Si prevees andar corto de RAM pero tu maquina es un PC y la RAM es barata, pues sin problemas, si tu maquina es un hardware específico donde pedir más RAM no sólo es caro sino que puede tardar tiempo, pues mejor ir con ojo.
Al igual que si tienes una máquina con un S.O. donde la JVM no pasa, ni pasará, de 1.4. Diseñar tu aplicación con Java 5/6 y luego llevarte la sorpresa significa que no has hecho bien tu trabajo.

Y la aparición del "hardware architect" es por lo que les mola asignar distintas tareas con distintos nombres a distintas personas, a los americanos, ya que tienden a la formación especializada. Yo creo que es más un "hay que tener en cuenta también el hardware/comunicaciones y si el diseñador/programador no sabe, que busque a alguien que si sepa para trabajar con el".

Para mi esa es una de las "Leaky Abstractions" (Joel Spolsky) en las que la gente cae.

Enviado por GreenEyed en julio 29, 2009 a las 03:40 AM CDT #
---
Señores, me disculpo por apenas comentar sus opiniones, pero, he tenido un par de semanas, algo, ejem.. extremas.

Inicio confirmando lo que decía al final del post....sus comentarios son los que enriquecen cada axioma ;)

Creo que, como mencionaba en el post, buena parte de los problemas que intenta superar este axioma se evitarían si nos enfocamos en primer plano a construir una aplicación como decimos en México para decir que algo esta BIEN hecho: "con todas las de la ley" y le damos la justa atención al "ecosistema de despliegue".

Seguramente el tema seguirá dando mucho de que hablar ahora que, todo se esta pasando a la "nube" y que "todos" queremos (y tenemos la oportunidad un tanto más cercana de) construir aplicaciones "con alto nivel de escalabilidad"

Ya veremos que ocurre, mientras tanto:
Saludos a todos!!!

RuGI

Enviado por RuGI en agosto 09, 2009 a las 11:31 PM CDT #


------------------------------------------
Créditos:
La foto es de: Jua Kay
http://www.flickr.com/photos/jaukay/284641554/
Dilbert marca registrada de Scott Adams
-----------------------------------------

No hay comentarios:

Publicar un comentario