Capítulo 5. Solución de problemas

5.1. ¿Porque FreeBSD encuentra la cantidad incorrecta de memoria en hardware i386™?
5.2. ¿Por que mis programas ocasionalmente terminan con errores Signal 11?
5.3. Mi sistema falla con Fatal trap 12: page fault in kernel mode, o panic:, y escupe un monton de información. ¿Qué debo hacer?
5.4. ¿Cual es el significado del error maxproc limit exceeded by uid %i, please see tuning(7) and login.conf(5)?
5.5. ¿Por qué las aplicaciónes de pantalla completa en máquinas remotas se comportan mal?
5.6. ¿Porque le lleva tanto tiempo a mi computadora conectarse via ssh o telnet?
5.7. ¿Por qué file: table is full aparece repetidamente en dmesg(8)?
5.8. ¿Por qué el reloj de mi computadora tiene el tiempo incorrecto?
5.9. ¿Qué significa el error swap_pager: indefinite wait buffer:?
5.10. ¿Qué es un lock order reversal?
5.11. ¿Qué significa Called ... with the following non-sleepable locks held?
5.12. ¿Porque buildworld/installworld termina con el mensaje touch: not found?

5.1.

¿Porque FreeBSD encuentra la cantidad incorrecta de memoria en hardware i386™?

La razón más probable es la diferencia entre direcciones de memoria física y direcciones virtuales.

La convención para la mayoría del hardware de PC hardware es usar el área de memoria entre 3.5 GB y 4 GB para un propósito especial (usualmente para PCI). Este espacio de direcciones se usa para acceder a hardware PCI. Como resultado, la memoria real (física) no puede ser accedida en ese espacio de direcciones.

Lo que sucede con la memoria que debería aparecer en ese espacio es dependiente del hardware. Desafortunadamente, algunos equipos no hacen nada y la habilidad de usar los últimos 500 MB de RAM se pierde por completo.

Por suerte, la mayoría de los equipos de hardware remapean la memoria a una locación más alta de manera que pueda seguir siendo usada. No obstante, esto puede causar confusión al ver los mensajes de arranque.

En una versión de 32 bits de FreeBSD, la memoria parece perdida, dado que sera remapeado por encima de los 4 GB, que son imposibles de acceder para un kernel de 32 bits. En este caso, la solución es construir un kernel con PAE habilitado. Vea la entrada acerca de límites de memoria para más información.

En una versión de 64 bits de FreeBSD, o al correr un kernel con PAE habilitado, FreeBSD detectara y remapeara la memoria de manera correcta para que sea usable. Durante el arranque, sin embargo, puede parecer que FreeBSD este detectando más memoria de la que tiene realmente el sistema, debido al remapeo descrito anteriormente. Esto es normal y la memoria disponible sera corregida cuando el proceso de arranque termine.

5.2.

¿Por que mis programas ocasionalmente terminan con errores Signal 11?

Los errores Signal 11 son causados cuando un proceso intento acceder a una región de memoria cuyo acceso no fue concedido por el sistema operativo. Si algo como esto pasa a intervalos aparentemente aleatorios, comience a investigar la causa.

Estos problemas suele deberse a:

  1. Si el problema ocurre solo en una aplicación específica, probablemente sea un error en el código.

  2. Si es un problema con parte del sistema base de FreeBSD, también puede tratarse de código con errores, pero frecuentemente estos problemas suelen encontrarse y arreglarse mucho antes de que nosotros, los lectores usuales del FAQ lleguen a usar esas partes del código (para eso existe -CURRENT).

Probablemente no se trate de un error en FreeBSD si el problema ocurre al compilar un programa, pero la actividad que el compilador realiza cambia en cada iteración.

Por ejemplo, si make buildworld falla al intentar compilar ls.c a ls.o y, al correr de vuelta, falla en el mismo lugar, esto es una compilación fallida. Pruebe actualizar el código fuente e intentando nuevamente. Si la compilación falla en otro lugar, casi ciertamente es debido al hardware.

En el primer caso, use un debugger, tal como gdb(1) para encontrar el punto en el que el programa este intentando acceder a una dirección falsa y arreglarlo.

En el segundo caso, verifique la pieza de hardware que este fallando.

Causas comunes de esto incluyen:

  1. Los discos duros pueden estar sobrecalentándose: verifique que los ventiladores sigan funcionando, dado que el disco y otro hardware puede estar sobrecalentándose.

  2. El procesador que esta corriendo se esta sobrecalentando: esto puede ser porque el procesador fue overclockeado, o el ventilador del procesador murió. En cualquier caso, asegúrese de que el hardware este corriendo con la características de fábrica, al menos mientras intenta solucionar este problema. Si no lo esta, reviértalo a las características por defecto.

    Respecto al overclocking ¡Es mucho más barato tener un sistema lento que un sistema que necesita reemplazo! Además la comunidad no responde de manera simpática a problemas en sistemas overclockeados.

  3. Memoria defectuosa: si varias memorias SIMMS/DIMMS están instaladas, sáquelas todas e intente correr la máquina con cada SIMM o DIMM individualmente para reducir el problema a la DIMM/SIMM problemática o quizás incluso a una combinación.

  4. Ajustes excesivamente optimistas de la placa madre: las características del BIOS, y algunos jumpers de la placa madre, proveen opciones para ajustar varios timings. Los ajustes por defecto suelen ser suficientes, pero a veces ajustar los estados de espera de la RAM demasiado bajo, o activar la opción RAM Speed: Turbo pueden causar comportamiento extraño. Una idea posible es quedarse con los ajustes por defecto del BIOS, luego de haber previamente anotado los ajustes actuales.

  5. Poder sucio o insuficiente en la placa madre. Remueva las placas I/O , discos rígidos, o CD-ROMs sin usar, o desconecte el cable de encendido de ellos, para ver si el suministro eléctrico puede manejar una carga más pequeña. O intente otro suministro eléctrico, preferentemente uno con más poder. Por ejemplo, si el suministro actual esta registrado a 250 Watts, intente con uno registrado a 300 Watts.

Lea la sección acerca de Signal 11 para más explicaciones y una discusión acerca de como el software o hardware que verifica la memoria puede no detectar memoria defectuosa. Hay un extenso FAQ acerca de esto en el problema SIG11FAQ.

Finalmente, si nada de esto ayuda, es posible que sea un error en FreeBSD. Siga estas instrucciones para enviar un reporte de errores.

5.3.

Mi sistema falla con Fatal trap 12: page fault in kernel mode, o panic:, y escupe un monton de información. ¿Qué debo hacer?

Los desarrolladores de FreeBSD están interesados en estos errores, pero necesitan mas información que solo el mensaje de error. Copie el mensaje de fallo entero. Luego consulte la sección del FAQ acerca de fallos de kernel, compile un kernel de depuración y obtenga un backtrace. Esto puede sonar difícil, pero no requiere habilidades de programación. Tan solo siga las instrucciones.

5.4.

¿Cual es el significado del error maxproc limit exceeded by uid %i, please see tuning(7) and login.conf(5)?

El kernel de FreeBSD solo permite que exista un cierto número de procesos en un punto determinado del tiempo. El número esta basado en la variable de sysctl(8) kern.maxusers. kern.maxusers también afecta varios otros límites del kernel, tales como los buffers de red. Si la máquina esta bajo una carga intensiva, incremente kern.maxusers. Esto incrementara estos otros límites del sistema, además del número máximo de procesos.

Para ajustar el valor de kern.maxusers, vea la sección Límites de proceso/archivo del manual. Mientras que esa sección se refiere a archivos abierto, los mismos límites aplican para los procesos.

Si la máquina tiene una carga ligera pero esta corriendo número muy alto de proceso, ajuste la variable kern.maxproc definiendola en /boot/loader.conf. La variable no se ajustara hasta que el sistema se reinicie. Para más información acerca de ajustar variables, vea loader.conf(5). Si estos procesos están siendo corridos por un solo usuario, ajuste kern.maxprocperuid para que sea uno menos que el nuevo valor de kern.maxproc. Debe ser al menos uno menos porque hay un programa del sistema, init(8), que debe estar corriendo constantemente.

5.5.

¿Por qué las aplicaciónes de pantalla completa en máquinas remotas se comportan mal?

La máquina remota puede estar ajustando el tipo de la terminal a un valor que no sea xterm el cual es requerido por la consola de FreeBSD. Alternativamente el kernel puede contener los valores equivocados para el ancho y alto de la terminal.

Verifique que el valor de la variable de entorno TERM sea xterm. Si la máquina remota no soporta eso, intente vt100.

Corra stty -a para verificar que dimensiones cree el kernel que tiene la terminal. Si son incorrectas, pueden cambiarse corriendo stty rows RR cols CC.

Alternativamente, si la máquina del cliente tiene x11/xterm instalado, entonces correr resize consultara a la terminal las dimensiones correctas y las ajustara.

5.6.

¿Porque le lleva tanto tiempo a mi computadora conectarse via ssh o telnet?

El síntoma: hay un largo retraso entre el tiempo en que se establece la conexión TCP y el tiempo en el que el software del cliente pide una contraseña (o, en el caso de telnet(1), cuando aparece una pantalla de autenticación).

El problema: lo más probable, es que el retraso haya sido causado por el software del servidor intentando resolver la dirección IP del cliente a un nombre de host. Muchos servidores, incluyendo los servidores Telnet y SSH que vienen con FreeBSD, hacen esto para guardar el hostname en un archivo de log para referencias futuras del administrador.

La solución: si el problema ocurre siempre que se conecta la computadora cliente a cualquier servidor, el problema esta en el cliente. Si el problema ocurre solo cuando alguien se conecta a la computadora servidor, el problema esta en el servidor.

Si el problema esta en el cliente, la única solución es reparar el DNS de manera que el servidor pueda resolverla. Si esto ocurre en una red local, considerelo un problema del servidor y siga leyendo. Si esto ocurre en Internet, contacte a su ISP.

Si el problema es con el servidor en una red local, configure el servidor para resolver consultas de dirección a hostname para el rango de direcciones local. Vea hosts(5) y named(8) para más información. Si esto ocurre en la Internet, el problema puede ser que el resolver local del servidor no esta funcionando correctamente. Para verificar, intente buscar otro host tal como www.yahoo.com. Si esto no funciona, ese es el problema.

Luego de una instalación de cero de FreeBSD, también es posible que la información del dominio y servidor de nombres no exista en /etc/resolv.conf. Esto frecuentemente causara un retraso en SSH, dado que la opción UseDNS esta ajustada a yes (si) por defecto en /etc/ssh/sshd_config. Si esto esta causando el problema, llene la información faltante en /etc/resolv.conf o ajuste UseDNS a no en sshd_config como solución temporal.

5.7.

¿Por qué file: table is full aparece repetidamente en dmesg(8)?

Este mensaje de error indica que el número de descriptores de archivo disponibles en el sistema se agoto. Vea la subsección kern.maxfiles de la sección Ajustando límites del kernel del manual para una discusión y una solución.

5.8.

¿Por qué el reloj de mi computadora tiene el tiempo incorrecto?

La computadora tiene dos o más relojes, y FreeBSD eligió usar el incorrecto.

Corra dmesg(8), y verifique las líneas que contengan Timecounter. El del valor de calidad más alto que eligio FreeBSD.

# dmesg | grep Timecounter
Timecounter "i8254" frequency 1193182 Hz quality 0
Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
Timecounter "TSC" frequency 2998570050 Hz quality 800
Timecounters tick every 1.000 msec

Confirme esto verificando el sysctl(3)kern.timecounter.hardware.

# sysctl kern.timecounter.hardware
kern.timecounter.hardware: ACPI-fast

Puede tratarse de un timer ACPI roto. La solución más simple es deshabilitar el timer ACPI en /boot/loader.conf:

debug.acpi.disabled="timer"

O el BIOS puede modificar el reloj TSC quizás para cambiar la velocidad del procesador cuando se agonten las baterías, o al cambiar al modo de ahorro de engería, pero FreeBSD no sabe nada de estos ajustes y parece estar perdiendo o ganando tiempo.

En este ejemplo, el reloj i8254 también esta disponible, y puede ser seleccionando escribiendo su nombre en el sysctl(3) kern.timecounter.hardware.

# sysctl kern.timecounter.hardware=i8254
kern.timecounter.hardware: TSC -> i8254

La computadora debería empezar a medir el tiempo de manera más correcta a partir de ahora.

Para que este cambio corra automáticamente en tiempo de arranque, agregue la siguiente línea a /etc/sysctl.conf:

kern.timecounter.hardware=i8254

5.9.

¿Qué significa el error swap_pager: indefinite wait buffer:?

Esto significa que un proceso esta intentando paginar memoria al disco, y el intento de paginación se colgó intentando acceder al disco por más de 20 segundos. Puede estar causado por bloques defectuosos en el disco rígido, cableado del disco, cables, o cualquier otro tipo de hardware de E/S relacionado. Si el disco en si mismo esta defectuoso, los errores de disco aparecerán en /var/log/messages y en la salida de dmesg. En otro caso, verifique los cables y las conexiones.

5.10.

¿Qué es un lock order reversal?

El kernel de FreeBSD usa un número de primitivas de sincronización para manejar la contención de ciertos recursos. Cuando múltiples hilos de kernel intentan obtener múltiples primitivas de sincronización, existe el potencial para un interbloqueo, en donde dos hilos obtuvieron cada uno una primitiva y se bloquean eternamente esperando que el otro hilo libere la otra. Este tipo de problema de bloqueo puede evitarse si todos los hilos obtienen las primitivas en el mismo orden.

Un sistema diagnóstico en tiempo de ejecución llamado witness(4), habilitado en FreeBSD-CURRENT y deshabilitado por defecto para ramas stable y lanzamientos, detecta el potencial para interbloques debido a errores de bloque, incluyendo errores causados por la obtención de múltiples primitivas de sincronización con un orden diferente de distintas partes del kernel. El framework witness(4) intenta detectar este problema mientras ocurre y lo reporta imprimiendo un mensaje en la consola del sistema acerca de un lock order reversal (también conocido como LOR).

Es posible obtener falsos positivos, dado que witness(4) es conservativo. Un reporte que realmente sea positivo no significa que el sistema sufrió un interbloqueo; en su lugar, debería ser entendido como una advertencia que un interbloqueo podría haber ocurrido en ese lugar.

Nota:

Los LOR problemáticos tienden a arreglarse rápidamente, asi que verifique la lista de correo de FreeBSD-CURRENT antes de postear allí.

5.11.

¿Qué significa Called ... with the following non-sleepable locks held?

Significa que una función que puede dormirse fue llamada mientras un mutex (u otra primitiva de sincronización que no duerme) estaba bloqueado.

La razón por la que esto es un error es que los mutexes no fueron concebidos para ser tenidos por largos períodos de tiempo; se supone que solo se tengan para mantener durante períodos cortos de sincronización. Este contrato de programación permite que los controladores de dispositivo usen mutexes para sincronizarse con el resto del kernel durante las interrupciones. Las interrupciones (bajo FreeBSD) pueden no dormirse. Luego es imperativo que ningún subsistema en el kernel se bloquee por un período extendido de tiempo al mantener un mutex.

Para atrapar tales errores, pueden agregarse aserciones al kernel para interactuar con el subsitema witness(4) y emitir una alerta o un error fatal (dependiendo de la configuración del sistema) cuando una llamada potencialmente bloqueante es hecha mientras que se mantiene un mutex.

En resumen, estas alertas no son fatales, no obstante errores de coordinación pueden causar efectos indeseables variando desde un mínimo retraso en la respuesta del sistema a un completo bloqueo del mismo.

Para información adicional acerca de los bloqueos en FreeBSD vea locking(9).

5.12.

¿Porque buildworld/installworld termina con el mensaje touch: not found?

Este error no significa que la utilidad touch(1) este faltante. En su lugar el error probablemente se debe a que las fechas de los archivos están ajustadas a una fecha futura. Si el reloj CMOS esta ajustado a tiempo local, corra adjkerntz -i para ajustar el reloj del kernel al arrancar en modo de un solo usuario.

Puede descargar éste y muchos otros documentos desde ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

Si tiene dudas sobre FreeBSD consulte la documentación antes de escribir a la lista <questions@FreeBSD.org>.

Envíe sus preguntas sobre la documentación a <doc@FreeBSD.org>.