
Cuando una aplicación es instalada en una red, cualquier problema o debilidad en el
sistema operativo o red, son heredados por la aplicación. Como resultado,
cuando ocurren problemas de red, afectan el software de la aplicación. Como el
problema se manifiesta a través de la aplicación, suele culparse a la misma por
los daños ocasionados. Sin embargo, la corrupción de datos y otros problemas
manifestados en la aplicación son generalmente causados por problemas del
software de red e inclusive por problemas de hardware. A medida que el número
de usuarios de una red aumenta, el tráfico en la misma y la frecuencia
con que estos problemas se suceden. Debido a la complejidad de los sistemas de red,
cuando ocurre una corrupción de los datos, resulta muy difícil diagnosticar
dichos problemas, incluso para el personal especializado.
Información del artículo
He aquí una recopilación de entradas de configuración del Registro de Windows,
para redes Windows, Netware y Samba, que ayudan a comprender ciertos parámetros
útiles a la hora de prevenir errores. La mejor solución para estos problemas
suele ser la instalación de todas las actualizaciones, parches y service packs
disponibles para el sistema operativo. Inclusive es recomendable instalar los
controladores de hardware provistos por el mismo fabricante de la placa de red,
y no el provisto por Microsoft, como así también el Cliente de Redes Novell
provisto por la firma y no el de Microsoft.
Esta recopilación se basa en artículos publicados en las bases de conocimiento de
Microsoft, Borland, Netware y Samba, como así también algunos artículos
aislados publicados en foros de discusión, y en parámetros de configuración
recomendados en las FAQ y Help de algunos programas, en Ingles y español, que
he traducido a nuestra lengua para facilitar su comprensión. Si bien existen
versiones en español de varios de los artículos utilizados de la base de
conocimientos de Microsoft, la mayoría han sido interpretados y traducidos por
mi de su versión en Ingles, ya que los traductores automáticos utilizados
suelen ser bastante poco precisos y brindar resultados confusos.
Esta configuración debe ser implementada en cada maquina que compone una red, a
pesar de que algunos puedan ser específicos de un sistema operativo en
particular, no causará daño si se aplican en cualquier otro, y deben
reaplicarse cada vez que se instale el sistema operativo o un cliente de red, y
posteriormente reiniciar el equipo en cuestión.
Esta
configuración es útil para bases de datos TopSpeed, Paradox, Clarion para DOS y
puede que algunas otras.
Lamentablemente, no puedo hacerme responsable por los daños que pueda ocasionar la
implementación de estos parámetros de configuración. Nunca es recomendable
editar el registro de Windows, debido los potenciales problemas que pueden
surgir si no se hace correctamente. La versión de Microsoft de esta advertencia
es la siguiente: “Using Registry Editor Incorrectly can cause serious problems
that may require you to reinstall your operating system. Microsoft cannot
guarantee that problems resulting form the incorrect use of Registry Editor can
be solved. Use registry editor at your own risk”, o sea ellos tampoco se hacen
cargo.
Algunos conceptos teóricos a modo de glosario
MKB: Microsoft Knowledge Base o Base de
Conocimientos de Microsoft. (http://support.microsoft.com)
RAS: Remote Access Service o Servicio de
Acceso Remoto
Redirector: Es el software que
permite a las estaciones de trabajo clientes de la red, comunicarse con el
servidor a través de la misma. Este software es un componente crítico de la
red. Cada estación de trabajo en una red, tiene instalado un redirector. Para
redes Windows VREDIR.VXD, para redes Netware NWREDIR.VXD.
SMB: Server Message Block o Bloque de
Mensaje del servidor
Oportunisitic Locking u OpLock: Es un mecanismo para
realizar en la maquina local, un caché de datos a los cuales accede una
aplicación, en vez de leer la información mas reciente en ellos del servidor
Windows NT/2000/XP, a los fines de mejorar el tiempo de respuesta a peticiones
realizadas por usuarios de la red. En la MKB traducen Oportunisitic Locking
como Bloqueo
Oportunista. Este bloqueo suele ocasionar problemas cuando no funciona
correctamente. Se explica en detalle en el articulo de la base de conocimientos
de Microsoft Nº 129202 “Explanation of Opportunisitic Locking on Windows NT”.
Vale recalcar que el mismo artículo aclara “El
OpLocks mejora notablemente el rendimiento, pero tiene el potencial de causar
perdida de datos en caché en algunas redes…”
Funcionamiento: Con un OpLock exclusivo,
si un archivo es abierto de modo NO exclusivo (deny none), el redirector
solicita un bloqueo oportunista sobre todo el archivo. Mientras ningún otro
proceso tenga el archivo abierto, el servidor garantiza este OpLock, dando al
redirector acceso exclusivo a ese archivo específico. Esto le permite al
redirector realizar un buffer de lectura y escritura y un caché del mismo
mientras ningún otro proceso intente
abrir el archivo. Cuando un segundo proceso intenta abrir el archivo, se le
solicitará al propietario original que detenga el bloqueo oportunista o se pase
a un nivel II del mismo. En ese momento, el redirector debe invalidar los datos
en caché, quitar los bloqueos estándar, y liberar el bloqueo oportunista o
cerrar el archivo.
El nivel II del bloqueo oportunista (OpLock Level II), provee un método que
garantiza a más de una estación de trabajo, el acceso de lectura para un
archivo. Esto le permite a estas estaciones cachear datos localmente para
realizar un buffer de lectura. Mientras ninguna estaciones escriba en el
archivo, todas pueden tener el archivo abierto con este bloqueo de nivel II.
Ejemplo paso a paso del funcionamiento:
cabe aclarar que cuando menciono Clientes, me refiero a estaciones de trabajo, clientes de un servidor en una
red:
El cliente 1 abre el archivo solicitando un bloqueo oportunista.
Como ninguna otra estación tiene el archivo abierto, el servidor le garantiza al cliente 1 un OpLock exclusivo.
El cliente 2 abre el archivo, solicitando un OpLock.
Como el cliente 1 aun no ha escrito en el archivo, el servidor le solicita al mismo que se pase a un oplock de nivel II.
El cliente 1 acepta la petición invalidando la información cacheada del bloqueo y tomando los datos actualizados del servidor.
El cliente 1 informa al servidor que se ha pasado a un opclock nivel II (alternativamente podría haber cerrado el archivo).
El servidor responde a la solicitud de apertura del archivo realizada por el cliente 2, garantizándole un bloqueo oportunista de nivel II. De igual modo, otros clientes pueden abrir el archivo y obtener el mismo nivel de bloqueo.
El cliente 2 (o cualquier otro cliente que tenga el archivo abierto) envía un pedido de escritura SMB. El servidor devuelve la respuesta al pedido de escritura.
El servidor le solicita a todos los clientes que tienen el archivo abierto que se pasen a un bloqueo Oportunista None, o sea ningún cliente tiene un oplock sobre el archivo. Debido a que los clientes pueden tener escrituras en el buffer o bloqueos estándar en ese momento, necesitan no responder a la solicitud, todo lo que necesitan hacer es declarar como NO válidos todos los datos de su buffer de lectura.
RFCB: Bloques de control de archivos
remotos.
LFCB: Bloques de control de archivos locales.
La causa de la corrupción de datos en pocas palabras
Los redirectores intentan mejorar el rendimiento de la red poniendo en un caché de
memoria de la maquina local, parte de los archivos de la base de datos en vez
de leer la información mas reciente del servidor de la red. Desafortunadamente
los algoritmos utilizados para realizar el caché, suelen ocasionar problemas
que interfieren con el correcto funcionamiento de programas de bases de datos
multiusuarios. Generalmente los proveedores de los redirectores (Microsoft,
Novell, etc.), publican actualizaciones o parches que corrigen estas fallas una
vez que han sido reportadas.
Claves y valores del Registro de Windows
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem]
DriveWriteBehind = 0
Esta opción determina la utilización del caché de escritura en segundo plano. En
Windows 9x puede configurase desde el panel de control, Sistema, seleccionando
la pestaña Rendimiento, Sistema de archivos, Solución de problemas, y activar
la opción Desactivar la caché de escritura en segundo plano.
Se recomienda activarla (valor 1 o checkbox desmarcada), únicamente en sistemas
que disponen de menos de 64 Mb de memoria RAM.
SoftCompatMode = 0
Esta opción permite desactivar la “Nueva semántica de bloqueo y uso compartido de
archivos".
Puede encontrase en la misma pestaña especificada anteriormente.
AsyncFileCommit = 0
Esta opción permite desactivar las grabaciones sincronizadas de buffer. Puede
encontrase en la misma pestaña especificada anteriormente, bajo la etiqueta
“Deshabilitar operaciones sincronizadas de búfer”.
Otras opciones interesantes de esta rama, que no aconsejo sean modificadas ya que no he encontrado mayor
información, son DisableLowDiskSpaceBroadcast y ContigFileAllocSize.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]
AutoShareWks = 0
Esta opción deshabilita los recursos compartidos iniciados por defecto para tareas
administrativas en una estación de trabajo, que por más que uno los elimine,
serán recreados al reiniciar la máquina a menos que esta opción tenga valor 0.
El valor por defecto de la misma es 1. Estos recursos pueden ser accedidos conectando
a \\NombreEquipo\Disco$. (Ej.: \\PC1\c$). Windows establece esta opción a los
fines de que los usuarios con derechos de administrador en el servidor de la
red, realicen tareas de mantenimiento sobre los clientes. Se aconseja poner en
0 esta opción (**). También puede deshabilitarse en el servidor estableciendo
el valor AutoShareServer = 0.
CachédOpenLimit = 0
Establece el máximo de RFCB que pueden cachearse. El valor por defecto es 5.
En algunas aplicaciones que se ejecutan desde un cliente Windows se produce error
cuando se intenta escribir en un archivo contenido por un servidor Windows NT.
La aplicación puede informar de este error de varias formas tal como una
infracción al compartir, o reportar que el tamaño del archivo es cero.
Existe una optimización en Windows NT que controla si un archivo es realmente cerrado
o no en el servidor cuando el cliente realiza una petición para hacerlo. Si el
servidor tiene un oplock sobre el archivo cuando el cliente lo cierra, por mas
que el servidor reporte un Close SMB indicando que el archivo ha sido cerrado,
lo mantendrá abierto localmente (Remueve RFCB pero mantiene el LFCB y no
ejecuta el pedido local NtClose()), asumiendo que el cliente va a reabrir el
archivo. Si el cliente reabre el archivo, esta opción reduce notablemente el
tiempo requerido para responder al pedido.
Esta opción puede funcionar incorrectamente dependiendo de cómo haya sido abierto el
archivo por la aplicación.
El Servidor almacena en caché los handles (identificadores) de archivos (RFCB) que
ha abierto debido a una solicitud del cliente. Aunque la solicitud de escritura
se ejecuta normalmente, el pedido de cierre es respondido por el servidor pero
guardado en el buffer del sistema de archivos. Esta opción intenta optimizar el
tiempo de respuesta a repetidas operaciones de apertura y cierre realizadas por
el cliente. En consideración al oplock, esta optimización es una extensión lógica
de la forma que el cliente almacena (cachea) su propia solicitud de cierre de archivo y
de cómo el servidor procesará las próximas solicitudes de clientes para
acceder a archivos.
Por cuestiones de compatibilidad, a veces oplock se debe deshabilitar. También el cacheo
de RFCB.
EnableOplocks = 0
Esta opción con el valor 0, especifica que los clientes no tienen permitido utilizar
los bloqueos oportunistas en el servidor. Los oplocks mejoran notablemente el
rendimiento, pero tiene el potencial de causar la pedida de datos en caché, en
algunas redes particularmente WAN.
Las aplicaciones de bases de datos para DOS, pueden manifestar errores como “El
archivo está en uso”, “El archivo ya está abierto”, “No se puede escribir en el
disco X:\”, “El dispositivo de red X:\ no se encuentra disponible” o reportar
un tamaño de archivo igual a 0.
Esto puede ocurrir e redes NT o Small Business Server, ya que los motores de bases
de datos de las aplicaciones basadas en DOS, no han sido desarrollados para
soportar el mecanismo de bloqueo oportunista de estos tipos de redes, que esta
por defecto activado.
Si no se deshabilita la opción anterior, pueden usarse las mencionadas a continuación configurar mas en
detalle el bloqueo oportunista.
MinLinkThroughput = 0
El valor por defecto para esta opción es 0, osea infinitos bytes por
segundo, ya que esta opción especifica el mínimo link throughput permitido por
el servidor, antes de deshabilitar bloqueos oportunistas y directos (raw) para
esta conexión.
MaxLinkDelay = 60
El valor por defecto es 60, pero puede especificarse uno entre 0 y 100000 segundos,
ya que esta opción especifica el tiempo máximo permitido para una demora en el
enlace. Si la demora excede este número, el servidor deshabilita la entrada/salida
directa y el bloqueo oportunista para esta conexión.
OplockBreakWait = 35
El valor por defecto es 35, pero puede especificarse una valor entre 10 y 180 segundos,
ya que esta opción especifica el tiempo que el servidor espera por una
respuesta del cliente a un pedido de bloqueo oportunista.
Los valores pequeños pueden facilitar la detección de clientes que no están
respondiendo, pero puede causar la perdida de datos almacenados en caché.
UtilizeNTCaching = 0
Esta opción le indica al redirector si debe utilizar el manejador del caché para
almacenar el contenido de archivos. El valor 0 deshabilita este parámetro con
el solo propósito de garantizar que toda la información se vuelca al servidor
inmediatamente después de ser escrita por la aplicación.
EnableOpLockForceClose = 1
El valor por defecto para esta opción es 0. Este parámetro determina uno de dos
comportamientos posibles cuando un cliente tiene un oplock y no responde a una
solicitud oplock break (finalización de bloqueo oportunista): Si tiene el valor
0, falla la segunda apertura por ende limita el acceso al archivo. Si tiene
valor 1, obliga el cierre de la instancia abierta del cliente que tiene el oplock,
arriesgándose a perder datos almacenados en el caché local.
Autodisconnect = ffffffff
Windows NT y Windows 2000 tiene dos tipos diferentes de auto desconexión, uno para
desconectar conexiones RAS y otro para desconectar conexiones LAN. El parámetro
para desconectar conexiones RAS se encuentra documentado en el artículo Q153944
de MKB. El utilizado para conexiones LAN no está documentado en MKB si no en el
archivo de ayuda del Kit de recursos para NT, en la sección Entradas del
Registro.
Este parámetro se utiliza para desconectar sesiones en estado IDLE después de una
cantidad especificada de minutos. Este tiempo también puede configurarse
utilizando desde la consola DOS el comando net config server (ej: Para
desconectar conexiones idle después de 30 minutos, ejecutamos net
config server /autodisconnect:30).
Este parámetro puede tomar un valor en un rango que va desde -1 a 65535 minutos
(equivalente a varios años). Para deshabilitar la desconexión, debe asignarse
el valor -1. En conexiones LAN el valor 0 no deshabilita la opción y puede
producir desconexiones muy rápidas, con apenas unos segundos de estado idle. En
conexiones RAS el valor 0, deshabilita la auto desconexión.
Como el registro no admite el valor -1, solo puede establecerse desde la línea de
comando, pero si vemos como se refleja dicho cambio en el registro, se verá que
automáticamente se le asigna el valor mas alto admitido.
Cuando se establece el valor anterior, se crean también dos claves en el registro:
Anndelta: REG_DWORD: 0xbb8
Es el valor Delta para el índice de anuncio en milisegundos. Este valor especifica
cuanta demora o anticipación debe tolerarse a la hora de recibir los anuncios
del servidor.
Announce: REG_DWORD: 0xf0
Este parámetro especifica el tiempo de anuncio de la red. Determina cuan
frecuentemente el servidor se reporta a las demás computadoras en la red.
(Ej.: si el valor del anuncio es 10 y el Delta es 1, el tiempo que debe esperase
un aviso debe ser uno entre 9.999 y 10.001 segundos)
Después de unos minutos de estado idle, su conexión a un recurso compartido puede
aparecer como desconectada, lo cual se indica con una “X” roja en el icono de la unidad.
[HKLM\SYSTEM\CurrentControlSet\Services\Lanmanworkstation\parameters]
UseOpportunisticLocking = 0
El valor por defecto de esta opción es 1 (Habilitado). Indica si el redirector
debe usar el método de bloqueo oportunista. Este valor debe estar en 0 para evitar problemas.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MRXSmb\Parameters]
OplocksDisabled = 1
Por defecto esta opción se encuentra en 0 (habilitado). Esta entrada del registro,
especifica a los clientes Windows de una red, si deben o no solicitar un
bloqueo oportunista sobre un archivo remoto.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rdr\Parameters]
UseWriteBehind = 0
Esta opción especifica si puede realizarse un caché de escritura local en las
estaciones de trabajo clientes de una red, con el sistema operativo Windows 9x
instalado. Estableciendo el valor 0, se deshabilita la utilización de este
caché.
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VREDIR]
DiscardCachéOnOpen = 1
Esta entrada se modifica en los clientes. Mediante la misma, le pedimos al redirector
de la red Microsoft que cuando abra un archivo en red, descarte cualquier
página que haya quedado en la memoria del cliente. De este modo garantizamos
que los datos sean siempre los actuales.
Para evitar cualquier problema con el redirector, se aconseja verificar que todos
los clientes de su red, tengan instalada una versión de VREDIR.VXD posterior al
11/09/97 y de VNETSUP.VXD posterior al 30/05/1997 y tengan esta opción con
valor 1. Caso contrario, la actualización no se tendrá en cuenta y continuará
el potencial problema.
Un problema originado por esta falla se evidencia cuando se encuentran archivos de
bases de datos dañados en clientes de una red Microsoft que tienen por sistema
operativo Windows 95 / 95 OSR2 / 95 OSR2.1. Se produce cuando una aplicación
utiliza la API GetFileSize() para obtener el tamaño de un archivo remoto
existente en un servidor. El Servidor puede no retornar correctamente el tamaño
del archivo y cuando intenta escribir información al final del archivo, puede
que se sobrescriba información existente.
(**) No he encontrado información acerca de cual es su función específica y como podría
la misma ser beneficiosa a la hora de prevenir la corrupción de datos.
Contacto
Agradeceré los comentarios, criticas, aclaraciones y posibles ampliaciones para este documento.
Aníbal Galdeano
anibal@xune.com.ar