Mostrando entradas con la etiqueta Rendimiento. Mostrar todas las entradas
Mostrando entradas con la etiqueta Rendimiento. Mostrar todas las entradas

SharePoint 2010: Añadir un nuevo servidor a una granja con soluciones desplegadas

24.1.12 / Comments (0) / by Unknown

Por mucho que sean nuestras hijas, las aplicaciones que hemos parido pueden no ser perfectas y un día, necesitar más infraestructura hardware para poder seguir rindiendo igual. Si una de estas aplicaciones es una solución WSP desplegada en una granja, uno de los escenarios posibles a encontrarnos a futuro es el de instalar un nuevo Web Front End a la granja para balancear carga. ¿Cómo proceder? Ante todo, no asustarse.
  • Instalar pre-requisitos de SharePoint 2010 y setup (binarios) de SharePoint 2010 en el nuevo servidor.
  • Instalar el nivel de parcheado y de language packs exactamente igual que en los frontales existentes.
    • Dudas:
    • ¿Cómo conozco el nivel de parcheado exacto? Central Administration > Upgrade and Migration > Check product and patch installation status (/_admin/PatchStatus.aspx)
    • ¿Cómo interpreto todo ese churro de información? Ahí están todos los componentes de SharePoint y para cada uno tenemos su número de build, que puede ser distinto según el componente. Importante: identificar si hay Service Packs (en 2010 básicamente SP1 a fecha de hoy) y Hotfixes, y si entre la jerarquía de componentes encontramos Language Packs. Habrá que descargar e instalar esos tres tipos de parches. ¿En qué orden? Bien, eso ya da para otro post y hay mucha información relacionada, solo dejo dos referencias muy útiles:
    • ¿Paso el Configuration Wizard después de cada parche o language pack? No. Al final de todo.
  • Ejecutar (ahora sí) el asistente SharePoint 2010 Products Configuration Wizard.
  • Abrir el SharePoint 2010 Management Shell desde el nuevo servidor y ejecutar, para cada solución WSP existente:
Install-SPSolution -Identity misolucion.wsp -WebApplication http://mihost -Local -Force -GACDeployment




  • Es importante especificar –Local para desplegar la solución solo en éste nuevo servidor y –Force para forzar el desplegado, ya que si no nos devolverá errores diciendo que las features ya se encuentran desplegadas en la granja:
Install-SPSolution : A feature with ID XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX has already been installed in this farm.  Use the force attribute to explicitly re-install the feature.
  • El atributo –GACDeployment es opcional dependiendo de si nuestra solución va a desplegar DLL’s al GAC o no. Lo mismo para –WebApplication dependiendo de si es solución global o no.
Listo. No fue tan difícil, ¿no?

Windows Media Load Simulator: configuración y referencia de errores

13.4.11 / Comments (0) / by Unknown

Al testear una plataforma de Windows Media Services 2008 disponemos de la herramienta Windows Media Load Simulator (conocida también como LoadSim y que no tiene versión específica para 2008 sino que sigue utilizándose la de WMS 9 Series). A continuación lanzo algunos tips de configuración y uso sobre ella.

image

image

  • Puede instalarse sobre Windows XP, Windows 7 o un sistema operativo de servidor como Server 2008.
  • Sirve para probar conexiones unicast RTSP o HTTP (publishing points on-demand), pero no multicast (publishing points broadcast).
  • Debe ejecutarse la herramienta siempre con el usuario con el que se instaló. El motivo es que durante la instalación se realizan algunos cambios sobre ficheros de configuración de Windows Media Player que dependen de usuario.
  • Para habilitar un servidor de Windows Media Services, es necesario:
        • Crear un fichero WMLoad.asf en la carpeta c:\wmpub\wmroot del servidor.
        • Permitir conexiones entrantes sobre el publishing point unicast <Default>.
        • En algunos foros se comenta la necesidad de crear un fichero wmloadsafe.txt en la carpeta c:\, pero por lo menos en las pruebas que he efectuado hasta ahora, la existencia o no de ese fichero no parece determinante.
  • Las URL’s de streams de video deben corresponder todas al mismo servidor (que debe coincidir con el que está configurado en “Default Server”).
  • Lo ideal antes de probar la herramienta de carga es verificar que desde ese mismo equipo con Windows Media Player es posible reproducir el video a testear (si somos capaces de verlo en el reproductor, nos descartará cualquier tipo de problema de conectividad con el servidor, de misspellings con URL’s o de servicios/puntos de publicaciones no iniciados).

 

Errores:

  • SERVER ACCESS DENIED,, Code 0x00000000, Description: The operation completed successfully.
    • Este error puede apuntar hacia varios motivos: no hay conectividad con el host del servidor de video, el servidor está parado, la herramienta no ha podido encontrar el fichero WMLoad.asf o bien el publishing point <Default> está parado.
  • Code: 0x80070002, Description: Error Description Not Found
    • Este error aparece al intentar ejecutar WMLS desde una sesión de un usuario distinto al que instaló la herramienta.
  • Code: 0xC00D2EE6, Description: Error Description Not Found
    • Este error puede aparecer cuando el publishing point del video a testear está parado o al superar el límite de conexiones simultáneas permitidas por el servidor o el publishing point.
  • Code: 0xC00D001A, Description: Error Description Not Found
    • Este error se produce al no encontrar el fichero de video referenciado en el servidor.

 

Para profundizar más sobre el tema:

Checking Server Performance with Windows Media Load Simulator

Libro: Microsoft Windows Media Resource Kit

Entity Framework 4 + WCF + lazy loading: toma solo lo necesario

12.4.11 / Comments (0) / by Unknown

Tema ya trillado en otros idiomas pero sobre el cual me apecete disertar en la lengua de Cervantes. Premisas: trabajamos en un proyecto con Entity Framework 4, que genera nuestro modelo de entidades (con relaciones entre ellas) a partir de nuestro repositorio (típicamente un SQL Server). Exponemos parte de ese modelo a través de una capa de servicios WCF utilizando como valores de retorno de los métodos del servicios las propias clases del modelo. Ningún problema puesto que WCF se encargará de serializar adecuadamente esas clases y las ofrecerá a los clientes del servicio como clases proxy.

Un buen día descubrimos que el aplicativo empieza a ofrecer un rendimiento más que discutible y nos preguntamos por qué. Acude al rescate una herramienta de pago con trial de 30 días que bien vale, por lo menos, evaluarla. Entity Framework Profiler (EFProf), de los conocidos Hibernating Rhinos, permite hacer un profiling de las SQL lanzadas contra nuestra base de datos por el engine de Entity Framework. Simplemente hay que incluir la siguiente llamada en la inicialización de nuestra aplicación (p. ej. en Application_Start de global.asax):

HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();

La herramienta EFProf monitorizará desde ese momento cada todo Object Context de EF y nos mostrará qué comandos SQL está utilizando para cargar datos:

image

Dos cosas: primero, hay un contexto que necesita 97 SQL queries?!?!? Esto es mucho comparado con el resto de contextos. Segundo, ese mismo contexto está lanzando advertencias Using a single object context in multiple threads is likely a bug, SELECT N+1 y Too many database calls per object context.

image

image

Bueno, ahí hay un problema, claramente. Pero esas alarmas es difícil que provengan de mi código. Al fin y al cabo, mi interacción con EF se limita a utilizar queries de LINQ-To-Entity Framework del estilo:

var result = myObjectContext.Reports
.OrderBy(r => r.Title);

¿Como puede generar eso tanta query SQL? Bien, pues desvelo el misterio sin más. Hay dos claves: la primera está en WCF, que juega un papel más importante del que podríamos pensar. WCF necesita devolver los objetos del modelo y para ello serializar sus propiedades y colecciones. El proceso de serialización no sabe lo que hay por debajo, simplemente accede a esas propiedades para obtener sus valores, y punto. La segunda clave es lo que hay realmente por debajo, que es la configuración de lazy loading del Object Context de EF. Por defecto en la versión 4 los contextos son creados con la propiedad LazyLoadingEnabled a true. Esto significa que al acceder a propiedades de un objeto del modelo, si esas propiedades son a su vez otros objetos relacionados, esos accesos van a generar queries de carga adicionales. WCF pide, y EF se lo da. Todo. Propiedad por propiedad. Prácticamente nos estamos trayendo la base de datos entera query a query, sin un solo join que agrupe un poquito las peticiones. Mal.

Lo primero: desactivar el lazy loading en el contexto que utiliza WCF (LazyLoadingEnabled = false). Pero ahora tenemos un problema. Esta configuración produce que la consulta de un objeto no devuelva los objetos relacionados, a menos que se lo especifiquemos manualmente.

Por ejemplo, imaginemos que nuestra entidad Reports tiene relacionados unos Users que deben estar disponibles al realizar la consulta LINQ anterior. Entonces esos users no se cargarán a menos que hagamos algo como lo siguiente:

myObjectContext.LazyLoadingEnabled = false;

var result = myObjectContext.Reports
.Include("Users")
.OrderBy(r => r.Title);

Este eager loading que estamos haciendo utilizando el método Include generará una query SQL con un join entre la tabla de Reports y la de Users, que es lo que buscábamos desde el principio. Vuelta a los clásicos. Y el Entity Framework Profiler contento, puesto que habremos reducido drásticamente la carga de queries.

Bibliografía para insomnes:

EF – Loading related objects