martes, diciembre 28, 2010

Azul Azul!!!!

Esa famosa pantallita que se ha hecho famosa y se asocia a Microsoft, pero según lo que me ha tocado ver, la gran mayoría de los casos se debe a otros culpables, tales como drivers o productos de terceros, pero el tema es lograr identificar quien fue el responsable de la caída inesperada y con ese dato, poder realizar las acciones necesarias para resolver la causa raíz.

Cuando ocurre la caída, el sistema guarda un DUMP de lo que estaba ocurriendo en ese momento, si es que la caída corresponde a un tema de software, en caso de un corte de energía el código de error es distinto y no queda DUMP.

Primero que nada debemos asegurarnos que estamos escribiendo un dump, si no lo tenemos difícilmente podremos realizar un análisis. Para validar esto vamos a My Computer, click con el botón derecho, Properties, en el tab Advanced, sección Startup and Recovery, click en el botón Settings. En la sección Write Debugging Information, asegurese que este seleccionado algun dump, ya sea el de Kernel o small y se encuentre el directorio donde será escrito el dump. También es buena practica que escriba un registro en el Log de Eventos, el cual será algo como lo siguiente:

Event Type:    Error
Event Source:    System Error
Event Category:    (102)
Event ID:    1003
Date:        12/20/2010
Time:        11:49:21 AM
User:        N/A
Computer:    SERVER

Description:
Error code 0000000a, parameter1 00000000, parameter2 d0000002, parameter3 00000001, parameter4 80828230.

NOTA: que para que pueda escribir el dump, es necesario que al menos una parte del archivo de paginación resida en la partición del sistema

Esto no nos dice mucho, el Error code nos ayudara a identificar si es problema de energía o de software, pero en el caso de software, nos queda el dump.

ok, ya tenemos el dump, como lo analizamos ahora??

Existe un juguetito llamado Windbg, el cual es parte de “Microsoft Debugging Tools”, el cual puede ser bajado desde Aquí. Al menos a mi me hizo también instalar el Framework .Net 4.0

Una vez instalado ejecutamos Windbg, antes de comenzar, debemos cargar los símbolos, esto es para ayudar al programa a identificar los distintos componentes que forman parte del dump. Para ello ir a File, Simbol File Path y agregar lo siguiente:

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

Click en OK.

Ahora estamos listos para leer nuestro dump, vamos a file, Open Crash Dump, seleccionamos el archivo de dump a analizar (Memory.dmp), nos pregunta si deseamos guardar la información en un workspace, le damos Yes, nos abre una pantalla blanca con información respecto al dump recién leído, esto es algo similar a lo siguiente:

Loading Dump File [C:\Users\xxxxx\Documents\dump\MEMORY.DMP]
Kernel Summary Dump File: Only kernel address space is available

WARNING: Whitespace at end of path element
Symbol search path is: SRV*c:\symbols*
http://msdl.microsoft.com/download/symbols

Executable search path is:
Windows Server 2003 Kernel Version 3790 (Service Pack 2) UP Free x86 compatible
Product: Server, suite: Enterprise TerminalServer SingleUserTS
Built by:
3790.srv03_sp2_gdr.100216-1301
Machine Name:
Kernel base = 0x80800000 PsLoadedModuleList = 0x8089ffa8
Debug session time: Sun Dec 19 14:41:05.155 2010 (UTC - 3:00)
System Uptime: 2 days 23:37:22.861
Loading Kernel Symbols
...............................................................
...............................................
Loading User Symbols
PEB is paged out (Peb.Ldr = 7ffd500c).  Type ".hh dbgerr001" for details
Loading unloaded module list
...
*********************************************
*                                                                             *
*                        Bugcheck Analysis                             *
*                                                                             *
*********************************************

Use !analyze -v to get detailed debugging information.

BugCheck A, {0, d0000002, 1, 80828230}

*** ERROR: Module load completed but symbols could not be loaded for fortimon2.sys
Probably caused by : fortimon2.sys ( fortimon2+4295 )

Followup: MachineOwner
---------

En BugCheck tenemos el error code entregado en el log de eventos y sus parámetros, y en Probably caused by: tenemos al sospechoso de la caída. Si queremos obtener mas detalles del problemas ejecutamos el siguiente comando en esa consola:

!analyze

**********************************************
*                                                                                        *
*                        Bugcheck Analysis                                    *
*                                                                                        *
**********************************************

IRQL_NOT_LESS_OR_EQUAL (a)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If a kernel debugger is available get the stack backtrace.
Arguments:
Arg1: 00000000, memory referenced
Arg2: d0000002, IRQL
Arg3: 00000001, bitfield :
    bit 0 : value 0 = read operation, 1 = write operation
    bit 3 : value 0 = not an execute operation, 1 = execute operation (only on chips which support this level of status)
Arg4: 80828230, address which referenced memory

Debugging Details:
------------------
WRITE_ADDRESS:  00000000

CURRENT_IRQL:  2

FAULTING_IP:
nt!KeWaitForMultipleObjects+280
80828230 8902            mov     dword ptr [edx],eax

DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0xA

PROCESS_NAME:  cidaemon.exe

TRAP_FRAME:  b8b00814 -- (.trap 0xffffffffb8b00814)
ErrCode = 00000002
eax=8a9c75b0 ebx=00000003 ecx=8721a3dc edx=00000000 esi=8a9c7508 edi=8a9c7580
eip=80828230 esp=b8b00888 ebp=b8b008b4 iopl=0         nv up ei ng nz na po nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010282
nt!KeWaitForMultipleObjects+0x280:
80828230 8902            mov     dword ptr [edx],eax  ds:0023:00000000=????????
Resetting default scope

LAST_CONTROL_TRANSFER:  from 80828230 to 80886ad1

STACK_TEXT: 
b8b00814 80828230 badb0d00 00000000 f760f69c nt!KiTrap0E+0x2a1
b8b008b4 f760b295 00000003 b8b008e8 00000001 nt!KeWaitForMultipleObjects+0x280
WARNING: Stack unwind information not available. Following frames may be wrong.
b8b008fc f76084c0 8b1a55f0 810443e2 e404c298 fortimon2+0x4295
b8b00950 f723bb73 88ce4a14 00b00974 8a9b7720 fortimon2+0x14c0
b8b009b8 f723dfc2 00ce49b8 00000000 88ce49b8 fltmgr!FltpPerformPostCallbacks+0x1c5
b8b009cc f723e4f1 88ce49b8 87e5b008 b8b00a0c fltmgr!FltpProcessIoCompletion+0x10
b8b009dc f723eb83 8ae64c80 87e5b008 88ce49b8 fltmgr!FltpPassThroughCompletion+0x89
b8b00a0c f724c5de b8b00a2c 00000000 00000000 fltmgr!FltpLegacyProcessingAfterPreCallbacksCompleted+0x269
b8b00a48 8081d5c3 8ae64c80 87e5b008 87e5b008 fltmgr!FltpCreate+0x26a
b8b00a5c 808f100b b8b00c04 8b139de8 00000000 nt!IofCallDriver+0x45
b8b00b44 8092f806 8b139e00 00000000 848ec4b0 nt!IopParseDevice+0xa35
b8b00bc4 8092b946 00000000 b8b00c04 00000040 nt!ObpLookupObjectName+0x5b0
b8b00c18 808e2ed7 00000000 00000000 79654b01 nt!ObOpenObjectByName+0xea
b8b00c94 808e4171 0007dda8 00120089 0007dd6c nt!IopCreateFile+0x447
b8b00cf0 808e6c00 0007dda8 00120089 0007dd6c nt!IoCreateFile+0xa3
b8b00d30 80883948 0007dda8 00120089 0007dd6c nt!NtCreateFile+0x30
b8b00d30 7c82860c 0007dda8 00120089 0007dd6c nt!KiFastCallEntry+0xf8
0007dd9c 00000000 00000000 00000000 00000000 0x7c82860c


STACK_COMMAND:  kb

FOLLOWUP_IP:
fortimon2+4295
f760b295 2bc7            sub     eax,edi

SYMBOL_STACK_INDEX:  2

SYMBOL_NAME:  fortimon2+4295

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: fortimon2

IMAGE_NAME:  fortimon2.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  4be9ce76

FAILURE_BUCKET_ID:  0xA_fortimon2+4295

BUCKET_ID:  0xA_fortimon2+4295

Followup: MachineOwner
---------

Con esto ya podemos ver cual fue la causa y el modulo que la provoco, en nuestro caso fue un acceso a una dirección de memoria que no correspondía, el detalle se puede observar en el stack text y el resto de la información.

Espero que les sirva como me sirvió a mi.

Saludos!!

Isa

lunes, diciembre 20, 2010

Problemas de Memoria 2

Aun existen muchas máquinas que están trabajando con 32 bits, ya vimos en artículos anteriores el como optimizar el uso de memoria en estas versiones para servidores de Bases de Datos (SQL Server y Exchange) a través del uso de los parámetros /3GB y /PAE en el archivo boot.ini

 

Parámetro /PAE

Este parámetro lo que hace es permitir al sistema operativo reconocer la memoria por sobre los 4GB de RAM, a continuación una tabla de las versiones de sistema operativo y la cantidad de RAM soportada.

Windows y PAE

Versión de Windows Soporte
Windows 2000 Profesional
Windows XP
AWE API y 4GB de RAM Física
Windows XP SP2 y Posterior AWE API y 4GB de Espacio de Direccionamiento Físico
Windows 2000 Server
Windows Server 2003, Standard Edition
AWE API y 4GB de RAM Física
Windows Server 2003 SP1, Standard Edition AWE API y 4GB de Espacio de Direccionamiento Físico
Windows Server 2003, Enterprise Edition 8 procesadores y 32GB de RAM
Windows Server 2003 SP1, Enterprise Edition 8 procesadores y 64GB de RAM
Windows 2000 Advanced Server 8 procesadores y 8GB de RAM
Windows 2000 Datacenter Server 32 Procesadores y 32GB de RAM
Windows Server 2003, Datacenter Edition 32 Procesadores y 64GB de RAM
Windows Server 2003 SP1, Datacenter Edition 32 Procesadores y 128GB de RAM

Fuente: http://www.microsoft.com/whdc/system/platform/server/PAE/pae_os.mspx

 

Parámetro /3GB

En circunstancias típicas y para cada proceso se asignan 2 GB de espacio de direcciones virtuales para el proceso de modo de usuario y se asignan otros 2 GB de espacio de direcciones virtuales para el sistema operativo. Cuando utiliza el modificador /3GB en Windows Server 2003, se asignan 3 GB de espacio de direcciones virtuales para el proceso de modo de usuario y sólo se asigna 1 GB de espacio de direcciones virtuales para el sistema operativo.

Este parámetro debe usarse con cuidado, ya que al cambiar la forma de direccionar la memoria puede obtenerse un efecto inverso al que se espera, en servidores por ejemplo que tienen el rol de Active Directory, Terminal Server (Remote Desktop) o Application Server los cuales hacen uso de memoria kernel, se ven estrangulados y su capacidad de direccionamiento disminuye, en Servidores como Exchange o SQL Server se puede apreciar su beneficio.

El problema.

Se tenían servidores con distintos roles los cuales necesitaban ser actualizados de 4GB a 32GB de RAM, eran 2 grupos de servidores, los primeros, Application servers los cuales trabajaban con IIS y los otros, Cluster SQL Server 2005.

Al realizarse el upgrade de memoria física, los servidores de Aplicación no tuvieron problemas, sin embargo los servidores de SQL Server comenzaron con un comportamiento extraño.

No se observaron errores en el log de eventos que nos indicara algún problema o la causa del problema, si aparecía un error pero al parecer era la consecuencia, este error es el Event ID 1053

Revisando mas, se observa que las tarjetas de red no presentan trafico, bytes enviados o recibidos estaban en cero.

Nada que nos indicara que podría estar ocurriendo y menos como resolverlo. El único cambio que se había realizado era agregar la memoria al servidor. Se vuelve atrás.

Se programa nuevamente la actividad pero esta vez se realiza una actualización completa del sistema operativo y los drivers correspondientes al hardware, muchos de los problemas se resuelven de esta forma, un sistema operativo actualizado tiene menor probabilidad de tener problemas relacionados con issues conocidos y con parches liberados.

Nuevamente se realiza la actualización y presenta el mismo efecto.

Que configuraciones relacionadas con la memoria tenemos en el servidor?? Pues /PAE y /3GB en el archivo boot.ini

Vamos a la configuración de booteo y duplicamos la línea donde están estos parámetros cambiándole a una de ellas la descripción y sacándole ambos.

Se reinicia el servidor y se valida la configuración de memoria. Solo reconoce 3.4Gb de los 32Gb.

Se repone el parámetro /PAE en archivo boot.ini, este parámetro esta presente en las maquinas de aplicación.

Se reinicia el servidor y se valida configuración de memoria, reconoce los 32Gb y los servicios funcionan bien.

El culpable era el parámetro /3GB, revisemos el siguiente articulo donde se explica con mas detalle que es 4GT y como funciona.

http://technet.microsoft.com/en-us/library/cc786709(WS.10).aspx

Quiero destacar de acá las siguientes líneas que describen nuestro escenario:

4GT should not be used if either of the following is true:

  • Greater than 16 GB of physical memory are available and PAE X86 is enabled on the server.

Nuestra situación era exactamente esa, mas de 16Gb y PAE habilitado.

Saludos!

Isa

pd: No olvidar cambiar los tamaños en el archivo de paginación cuando se realicen aumentos de memoria!!!!!

martes, diciembre 07, 2010

Identificando la Version de SQL Server Instalada.

En muchas oortunidades nos toca que necesitamos saber cual es la version instalada en nuestro servidor de SQL Server.

El siguiente KB es bastante completo para realizar esta operacion: http://support.microsoft.com/kb/321185/en-us

Como un resumen, aca dejo un listado de las versiones y a cual corresponden desde 6.5 hasta 2008 SP1

10.0.1600 - SQL Server 2008 release (RTM)
10.0.2531 - SQL Server 2008 Service Pack 1

9.00.1399 – SQL Server 2005 release (RTM)
9.00.2047 – SQL Server 2005 SP1
9.00.3042 – SQL Server 2005 SP2
9.00.4053 – SQL Server 2005 SP3

8.00.194 – SQL Server 2000 release (RTM)
8.00.384 – SQL Server 2000 SP1
8.00.534 – SQL Server 2000 SP2
8.00.760 – SQL Server 2000 SP3
8.00.2039 – SQL Server 2000 SP4

7.00.623 – SQL Server 7.0 release (RTM)
7.00.699 – SQL Server 7.0 SP1
7.00.842 – SQL Server 7.0 SP2
7.00.961 – SQL Server 7.0 SP3
7.00.1063 – SQL Server 7.0 SP4

6.50.201 – SQL Server 6.5 release (RTM)
6.50.213 – SQL Server 6.5 with Service Pack 1
6.50.240 – SQL Server 6.5 with Service Pack 2
6.50.258 – SQL Server 6.5 with Service Pack 3
6.50.281 – SQL Server 6.5 with Service Pack 4
6.50.415 – SQL Server 6.5 with Service Pack 5
6.50.416 – SQL Server 6.5 with Service Pack 5a
6.50.479 - SQL Server 6.5 with Service Pack 5a(Update)

Saludos!!

Isa

viernes, diciembre 03, 2010

Ultima Conexion ..........

No piensen que esta es la ultima conexion que hago, esta bien que hace tiempo no escriba en el blog y lo tenga un poco (bastante) abandonado, pero no habia encontrado algo interesante para publicar.

Ante una auditoria, necesitamos obtener para cada una de las cuentas del dominio, cuando fue la ultima conexion y validar tambien el estatus de la cuenta, si es que esta desabilitada, etc.

Este proceso tiene varios pasos, el primero de ellos es obtener la lista de los usuarios, esto lo podemos realizar de varias formas, usando algun programa ya hecho, usando scripts visual basic o power shell o usando algun comando que obtiene informacion de Active Directory. En esta ocasion, seleccione uno bien interesante y multiproposito: CSVDE

Este comando permite principalmente importar y exportar objetos en active directory, si quieres aprender mas sobre el puedes hacerlo en el siguiente link

Una vez seleccionado el comando esta la seleccion de los atributos que necesito, obtener una lista completa nos podria generar un archivo demasiado grande y engorroso de manipular, asi que mi lista reducida fue la siguiente: objectClass, userAccountControl, sAMAccountName, lastLogonTimestamp

objectClass me muestra el tipo de cuenta, me dice si la cuenta es user o computer.
userAccountControl me da el status de la cuenta mas adelante me explayo mas sobre este atributo.
sAMAccountName es el nombre de la cuenta.
lastLogonTimestamp es cuando fue la ultima conexion de la cuenta.

Este ultimo atributo, lastLogonTimestamp fue introducido en Windows Server 2003 para ayudar a identificar de forma mas certera los usuarios y equipos que se encuentran activos, cabe hacer notar que este datos tampoco es en tiempo real ya que la informacion debe ser actualizada por los demas domain controlers de la red pues a diferencia del atributo lastLogon, este es replicado.

El numero entregado por este atributo representa la intervalos de 100 nanosegundos transcurridos desde el 1ro de Enero de 1601, el codigo en vbs para transformar este numero a fecha es el siguiente:

set objLogon = objUser.Get("lastLogonTimestamp")
intLogonTime = objLogon.HighPart * (2^32) + objLogon.LowPart
intLogonTime = intLogonTime / (60 * 10000000)
intLogonTime = intLogonTime / 1440
WScript.Echo strADsPath & ";" & intLogonTime + #1/1/1601#

Si esa misma formula queremos usarla en excel usemos la siguiente:
Ingles: =IF(C2>0,C2/(8.64*10^11) - 109205,"")
Español: =SI(E2>0;E2/(8.64*10^11) - 109205;"")

ok! ya tenemos la lista de usuarios y tenemos el ultimo logon en formato de fecha :) nos esta faltando ahora saber si las cuentas estan desabilitadas o no o si ha expirado la password.

A traves del atributo userAccountControl podemos saber alguna informacion del estado de la cuenta, este atributo es una serie de bits que visualizamos como un numero en donde cada posicion representa una caracteristica que puede estar seteada en 1 o 0 el bit que en nuestro caso nos interesa es el segundo, ACCOUNTDISABLE, o sea, un usuario normal tendra el número 512 y si ese usuario esta desabilitado sera 514, si quieren saber mas detalle de este atributo pueden revisarlo en la siguiente link

Otro atributo que tambien nos puede ayudar y que nos indica si la cuenta esta con la password expirada o no es msDS-User-Account-Control-Computed pues el anterior aunque tiene la opcion de mostrar si tiene la password expirada no lo indica, para este caso, la columna representada por este atributo me mostrara un 8388608 que representa 0x800000 en hexadecimal y corresponde al status PASSWORD_EXPIRED

Bien, ya tengo identificados aquellos usuarios que no estan cumpliendo :)

Saludos!!

Isa