Configurar el Recycling de los Application Pools en un horario no productivo

September 27, 2011 Leave a comment

Dejar por default esta configuración (1740 minutos) puede afectar el aplicativo cada 29 hrs, ya sea que se cumpla está condición en un horario de producción o no, se reciclará el Application Pool, perdiendo sesiones y liberando memoria y procesamiento. Lo recomendable es colocar un horario espécifico que no afecte a producción.

Recomendación para (IIS 6.0)

- Seleccione el Application Pool – Click derecho Properties

image

Se ha colocado por ejemplo un valor de 02:00 A.M., si existen más de un Application Pool, puede configurar un rango de 5 o 10 mins entre cada uno. Ejemplo:

  • · DefaultAppPool – 2:00 a.m
  • · WCFAppPool – 2:10 a.m
  • · AnotherAppPool – 2:20 a.m

Recomendación para (IIS 7.0 / 7.5)

- Seleccione el Application Pool y de click en la opción de Recycling…

image

Saludos.

EG.

Categories: IIS 7, IIS6 Tags:

Demasiados errores de crypt32 en tu servidor

September 6, 2011 Leave a comment

Uno de los errores más frecuentes en servidores web es el siguiente:

EventVW-1

Error:

Tipo de suceso: error
Origen del suceso: crypt32
Categoría del suceso: ninguna
Id. de suceso: 8
Fecha: fecha
Hora: hora
Usuario: nombre de usuario
Equipo: nombre de equipo
Descripción:
Error de recuperación de actualización automática del número de secuencia de la lista raíz de terceros de: <http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootseq.txt> con el error: Esta operación ha regresado debido a que el tiempo de espera ha caducado.
Para obtener más información al respecto, vea el Centro de ayuda y soporte técnico en http://support.microsoft.com.

La causa de este tipo de error es cuando el componente de Actualización de certificados raíz está activado y el server no se puede conectar con el servidor de Windows Update en internet, para actualizar automaticamente las entidades emisores de estos certificados. Si se tiene un servidor web con aplicativos que ocupan certificados y si se requiere actualizar las definiciones, entonces lo más recomendable es conectarse a internet, de lo contrario es mejor desactivarlo.

Para desactivar el componente Actualización de certificados raíz, siga estos pasos:

  1. En el Panel de control, haga doble clic en Agregar o quitar programas.
  2. Haga clic en Agregar o quitar componentes de Windows.
  3. Desactive la casilla de verificación Actualización de certificados raíz y continúe con el Asistente para componentes de Windows.

image

Referencia Web: http://support.microsoft.com/kb/317541/es

Saludos!.

No habilites el debugging en producción (ASP.NET)

September 5, 2011 Leave a comment

Tu jefe se queja de que tu aplicación esta lenta en producción y en tu PC vuela sin límites. Antes de colocar tu aplicación web en Producción, deshabilita el debugging en todos los webconfigs que tengas. Si no lo haces, esto provoca que tu aplicativo se degrade y exista un bajo rendimiento. Es muy recomendable para ambientes de desarrollo pero no para productivos.

Cuando el debugging está habilitado, las peticiones de ASP.NET nunca terminan. Es decir cuando lo ocupamos en un ambiente de desarrollo podemos realizar un buen debugging con Visual Studio por que sabemos que dicha petición tiene un timeout definido por nosotros y que desaparecerá cuando hayamos realizado otra operación o terminemos el debugging por puntos. Pero en ambientes productivos eso es fatal, las peticiones no pueden tener timeouts infinitos.

Cuando el debugging está habilitado podemos crear mas de 100 dlls compiladas (Librerias), como es esto posible?

Bien. Cuando una página .aspx, asax o ascx es solicitada por primera vez, ASP.NET las compila dentro de un assembly. Este assembly tiene un nombre de 8 caracteres como 3ks0rnwz.dll o similar y guarda las clases de la página actual (No guarda el Code Behind). Esta dll se guarda en una carpeta llamada:

C:\WINDOWS\Microsoft.NET\Framework\NoVersion\Temporary ASP.NET Files

El code behind es compilado aparte en una librería principal, independiente de las dlls que se copiaron en la carpeta anterior.

Entonces si tenemos habilitado el debugging, se creará una dll por cada página que sea solicitada por primera vez y estará en modo debug. Si tenemos 100 paginas web, tendremos 100 dlls.

En cambio si tenemos deshabilitado el debugging cuando se realice alguna petición en cualquier página de nuestro aplicativo web, ASP.NET compilará todo dentro de un gran assembly. Las páginas ascx se compilarán en un emsamblado diferente de las páginas .aspx y estas páginas .aspx son compiladas en grupos basados en otros archivos si incluyen UserControls. Si tu aplicativo tiene diferentes subdirectorios, la compilación se llevará acabo en cada uno de ellos de manera separada. Es decir al final de tener 100 dlls, podrás tener solamente de 3 a 4, de acuerdo a lo que te comenté anteriormente.

Es muy fácil de detectar con un memory dump que aplicaciones (App Domains, librerias) están siendo utilizadas en modo debug.

0:016> !finddebugtrue
Debug set to true for Runtime: 61b48dc, AppDomain: /MyDebugApplication
Debug set to true for Runtime: 1f50e6d8, AppDomain: /MemoryIssues
Total 16 HttpRuntime objects

En un ambiente productivo es recomendable deshabilitar el debugging en todos los web.configs, lo podemos hacer manual por cada web.config

<compilation  debug="false"/>

o de forma general a nivel servidor.

<configuration>
    <system.web>
          <deployment retail=”true”/>
    </system.web>
</configuration>
    Saludos!.

Mostrando los IDs de los Procesos en el Perfomance Monitor

September 5, 2011 Leave a comment

Cuando nos disponemos a realizar un análisis con contadores de perfomance, nos encontramos con procesos que vienen enumerados (#1 ,#2….) en el momento en que realizamos la captura el log se registrará dichos procesos y realmente no vamos a poder conocer el id del proceso para realizar un buen troubleshooting.

image

Solo basta crear un nuevo valor DWORD en el registro de Windows.

Para habilitar o deshabilitar el PID en nombres de los procesos, siga estos pasos:

  1. Haga clic en Inicio , haga clic en Ejecutar , escriba regedit y, a continuación, haga clic en Aceptar .
  2. Busque y haga clic en la siguiente subclave del Registro:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance

  3. En el menú Edición , haga clic en nuevo y, a continuación, haga clic en Valor DWORD .
  4. Haga clic con el botón secundario en nuevo valor # 1 , haga clic en Cambiar nombre y, a continuación, escriba ProcessNameFormat para nombrar el nuevo valor.
  5. Haga clic con el botón secundario del mouse en ProcessNameFormat y, a continuación, haga clic en Modificar .
  6. En el cuadro valor , escriba uno de los valores siguientes y, a continuación, haga clic en Aceptar :
    • 1 : deshabilita el datos de PID. Este valor es el valor predeterminado.
    • 2 : permite el PID de datos.

    image

Saludos!.

Referencia KB:  http://support.microsoft.com/kb/281884

Procesos en C#

September 2, 2011 1 comment

Como ingenieros de troubleshooting en aplicaciones funcionales, uno de los problemas más comunes son los hangs de las mismas ( No responde, muy lento, crasheó ). Lo primero que debemos revisar es que proceso está consumiendo demasiada memoria. Existe un producto de Microsoft que se llama ProcessExplorer, el cual te ayuda a visualizar estos valores de memoria fisica, virtual, paginación, etc por proceso.

En este post es muy fácil sacar dicha información desde C# .NET, veamos como:

Código:

Se crea una clase para guardar la info de cada proceso.

public class ProcessData
    {
        public Int32 Id { get; set; }
        public String Name { get; set; }
        public Int64 WorkingSet { get; set; }
        public Int32 HandleCount { get; set; }
        public Int32 Threads { get; set; }
        public Int64 PrivateMemory { get; set; }
        public Int64 VirtualMemorySize { get; set; }
        public Int64 NonpagedSystemMemorySize { get; set; }
        
    }

Utilizamos la libreria using System.Diagnostics para realizar consultas de todos los procesos que estén en el servidor o PC.

private void button1_Click(object sender, RoutedEventArgs e)
        {
            var processes = new List<ProcessData>();
            foreach (var process in Process.GetProcesses())
            {
                var data = new ProcessData();
                data.Id = process.Id;
                data.Name = process.ProcessName;
                data.WorkingSet = process.WorkingSet64;
                data.HandleCount = process.HandleCount;
                data.PrivateMemory = process.PrivateMemorySize64;
                data.VirtualMemorySize = process.VirtualMemorySize64;
                data.NonpagedSystemMemorySize = process.NonpagedSystemMemorySize64;
                data.Threads = process.Threads.Count;
                processes.Add(data);
            }
            dataGrid1.DataContext = processes;
        }

Figura:

image

Saludos!

Contadores de Perfomance para ASP.NET y sus recomendaciones

August 17, 2011 Leave a comment

ASP.NET

Contadores Específicos de ASP.NET


Nombre Contador

Descripción

Recomendación

Application Restarts

Número de veces en que la aplicación se reinicia

Si este valor es constante dentro de la gráfica. Se debe de checar los siguientes puntos:

Si existió una modificación en el machine.config, web.config, global.asax.

Si existió una modificación en la carpeta Bin del aplicativo.

Cuando el número de compilaciones (ASPX,ASCX,ASAX) excede del límite especificado en el tag

<compilation numRecompilesBeforeAppRestart=/>.

Revisar si el antivirus no está reiniciando la aplicación.

http://support.microsoft.com/?id=820746

Requests Current

Número de peticiones ejecutándose.

Si este contador no baja del 100%. Se debe incrementar el número de la cola de peticiones. Por que si ASP.NET excede del número por default empezará a rechazar peticiones, mandando mensajes de 500 en el navegador.

IIS 7.0 – Incrementar la cola en el registro de Windows.

1. Ir al directorio: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0

2. Crear un valor de tipo DWORD (Decimal) con el nombre de MaxConcurrentRequestsPerCPU

3. Establecer el valor de 5000

4. Reiniciar el IIS (iisreset).

IIS 7.0 – Establecer un límite de peticiones concurrentes a nivel aplicación.

1.- Ir a la línea de comandos, ejecutar como Administrador.

2. – Ir al directorio the C:\Windows\System32\InetSrv

3.- Colocar el siguiente commando en lugar de “Sitio Web” será el nombre del sitio web

appcmd.exe set config "SitioWeb" -section:system.webServer/serverRuntime /appConcurrentRequestLimit:"5000" /commit:apphost

IIS 6.0 – Establecer un límete de cola de peticiones en el Application Pool

1.- Seleccionar el aplicación Pool click derecho Propierties.

2.- Ir al tab Perfomance, editar la opción Request queue limit cambiar el valor a 5000

Request Execution Time

Número de milisegundos que se tomaron para ejecutar la última petición.

Si este contador está muy elevado, checar el web.config de la aplicación en el tag compilation, colocarlo en FALSE. Tener el modo debug habilitado tiene un gran impacto en el rendimiento de una aplicación ASP.NET, y sólo se debe utilizar en etapas de desarrollo.

No se recomienda su utilización en aplicaciones en producción, o cuando se quieren tomar mediciones de rendimiento.

<compilation debug=FALSE/>

Requests Queued

Número de peticiones que están actualmente en cola.

Si este contador está muy elevado se recomienda aplicar las mismas recomendaciones que el contador Requests Current

Requests Rejected

Número de peticiones que están siendo rechazadas.

Cuando rebasa el límite de cola permitido por ASP.NET puede ser por varias razones:

Bajo rendimiento de SQL Server

Cuando se incrementa el número de instancias de Pipeline (Buffers, Listas,Colas)

Cuando degrada la utilización del CPU.

El valor de este contador debe ser 0. Se debe revisar estos contadores, si tienen un número elevado:

· Process\% Processor Time

· Process\Private Bytes

· Process\Thread Count

· Web Service\ISAPI Extension Requests/sec

· ASP.NET\Requests Current

· ASP.NET\Requests Queued

· ASP.NET\Request Wait Time

· ASP.NET Applications\Pipeline Instance Count

· ASP.NET Applications\Requests in Application Queue

Se recomienda aplicar las mismas recomendaciones que el contador Requests Current y volver a realizar un trace de contadores.

Worker Process Restarts

Número de veces que el proceso aspnet_wp se reinicia.

Revisar si no existe un reinicio forzado dentro de las opciones de Reciclado del Application Pool. Revisar la configuración en el machine.config del tag ProcessModel.

http://msdn.microsoft.com/en-us/library/7w2sway1.aspx

Saludos!.

Contadores de Perfomance para .NET Framework y sus recomendaciones

August 17, 2011 Leave a comment

.NET Framework

Exceptions


Nombre Contador

Descripción

Recomendación

.NET CLR Exceptions(*)\# of Exceps Thrown / sec

Número de excepciones lanzadas por Segundo. Esto incluye excepciones de .NET y excepciones de código no administrado.

Administrar los errores con excepciones personalizadas try{}catch(Exception){}. Revisar si la aplicación no realiza demasiadas llamadas al método Response.Redirect, Server.Transfer o a Response.End

http://support.microsoft.com/default.aspx?scid=kb;[LN];312629

# of Exceps Thrown

Número de excepciones lanzadas desde que se inició la aplicación.

Administrar los errores con excepciones personalizadas try{}catch(Exception){}. Revisar si la aplicación no realiza demasiadas llamadas al método Response.Redirect, Server.Transfer o a Response.End

http://support.microsoft.com/default.aspx?scid=kb;[LN];312629

Referencia URL:

http://msdn.microsoft.com/en-us/library/kfhcywhs%28v=VS.90%29.aspx

CLR Loading


Nombre Contador

Descripción

Recomendación

Current AppDomains

Número de AppDomains que el CLR está cargando en procesamiento.

El valor recomendado debe ser el mismo que el número de Aplicaciones Web + 1. Este valor no debe de sobrepasar este límite.

Current Assemblies

Número ensamblados cargados en el CLR.

Si existe un gran número de sitios web hospedados en el IIS, este número de contador debe ser normal. Pero de lo contrario si es un rango pequeño de aplicaciones y este contador está elevado, la recomendación es dividir el número de aplicaciones en Application Poolsen o colocarlos en otro servidor web.

Total # of Load Failures

Muestra elpico de clases que han fallado en cargar desde que se inició la aplicación.

Si este contador se encuentra elevado, se requiere revisar las llamadas a librería, si se registro algun evento dentro del event viewer que no encuentra ciertos métodos o dlls. Rectificar en desarrollo el cargado de las mismas.

Referencia URL:

http://msdn.microsoft.com/en-us/library/ekec01h3.aspx

.NET CLR Memory


Nombre Contador

Descripción

Recomendación

# Bytes in all Heaps

Número de bytes comprometidos por objetos administrados.

Este valor tiene que ser siempre menor que el contador Process\Private Bytes. Si está elevado checar los siguientes contadores. # Gen 0, # Gen 1, etc. Revisar en código si no existen variables de tipo String que estén concatenándose, si hay ciclos en donde existan variables que no sé estén liberando con null, algun proceso o método que esté sobrecargando la memoria.

# Gen 0 Collections

Colección creada por el Garbage Collector

Cuando el garbage collector llena su colección por default se crea una instancia más de GC, para colocar los objetos para posteriormente liberarlos de la memoria, cuando se crean varias colecciones, es por que el GC está siendo excesivamente utilizado por las aplicaciones. Utilizar sentencias Using, para mandar a llamar al método Dispose(), no llamar directamente al GC desde código. La misma recomendación que el primero.

.NET CLR Memory(*)\% Time in GC

Tiempo de Gargabe Collector, Utilización en memoria.

Este contador es muy notorio cuando se utiliza demasiado el GC para la liberación de recursos. La recomendación es estar debajo de un 30% en la gráfica.Una aplicación saludable tiene un 5% de utilización en GC. Volver con null los buffers creados.No guardar grandes cantidades de datos en ASP.NET cache.Utilizar StringBuilders para concatenar cadenas de caracteres.

Las mismas recomendaciones anteriores.

Referencia URL:

http://msdn.microsoft.com/en-us/library/x2tyfybc%28v=vs.80%29.aspx

Saludos!

Mover un objeto del directorio a un grupo de seguridad (C# Tip)

August 17, 2011 Leave a comment

Este método lo reutilizo demasiado en desarrollos para Active Directory, en el cual puedes agregar usuarios o computadoras a un grupo de seguridad para aplicar algunas políticas de la empresa. Veamos el método y la implementación.

Código:

public void AddToGroup(string CompDn, string groupDn, string User, string Pass, string ip)
        {
                DirectoryEntry dirEntry = new DirectoryEntry("LDAP://"  +ip+ "/" + groupDn, User, Pass);
                dirEntry.Properties["member"].Add(CompDn);
                dirEntry.CommitChanges();
                dirEntry.Close();
        }

Por ejemplo aquí tengo una lista de computadoras que agregaré a un grupo especial para asignarles políticias de Antivirus.

if (File.Exists(strFile))
                {
                    XDocument xDoc = XDocument.Load(strFile);
                    IEnumerable<XElement> computers = xDoc.Element("Computers").Element("Windows2000").Elements();
                    string path = String.Empty;

                    OuPath = GetOUs(txtOUWindows2000.Text) + "," + GetDomain(txtDomainName.Text);
                        foreach (var computer in computers)
                        {
                            path = computer.Element("Path").Value.ToString();
                            try
                            {
                                AddToGroup(path, OuPath, txtUserName.Text, txtPassword.Text, txtServerIP.Text);
                            }
                            catch (Exception ex)
                            {
                            }

                        }
                        MessageBox.Show("Proceso completado");
                }

Otro método es el de mover objetos a otra dirección en este caso puede ser una OU (Unidad Organizacional).

public void MoveComp(string objectLocation, string newLocation, string User, string Pass, string ip)
        {
            DirectoryEntry eLocation = new DirectoryEntry("LDAP://" +ip+ "/" +objectLocation, User, Pass);
            DirectoryEntry nLocation = new DirectoryEntry("LDAP://" +ip+"/"+ newLocation, User, Pass);
            eLocation.MoveTo(nLocation, eLocation.Name);
            nLocation.Close();
            eLocation.Close();
        }

Referencia: http://ewebmx.com/2011/08/mover-un-objeto-del-directorio-a-un-grupo-de-seguridad-c-tip/

Follow

Get every new post delivered to your Inbox.

Join 96 other followers