11 ene 2010

Problemas de sincronización entre varios procesadores - Linux SMP & VmWare Timekeeping

Este ultimo tiempo, me he encontrado "repentinamente" con problemas en un servidor virtualizado,  despúes de 250 días de actividad interrumpida el host invitado (guest) como se le suele llamar en la gerga de la virtualizacion entra en un estado inconsistente, se congela (hang) y es imposible accederlo remotamente e inutil hacerlo por la consola. Son varios los errores que he detectado en los logs tales como:

  •  ACPI: Looking for DSDT in initramfs... error, file /DSDT.aml not found.
  •  ifconfig[2844]: segfault at xxxxx error 4
  • Dec 21 13:55:05 hosting2-front02 kernel: Clocksource tsc unstable (delta = 4688700040 ns)
  • kernel: checking TSC synchronization [CPU#0 -> CPU#1]: passed.                              kernel: checking TSC synchronization [CPU#0 -> CPU#2]: passed.                                                  kernel: checking TSC synchronization [CPU#0 -> CPU#3]:                                                                kernel: Measured 6 cycles TSC warp between CPUs, turning off TSC clock.                                                       kernel: Marking TSC unstable due to: check_tsc_sync_source failed.                                                                                                         kernel: Brought up 4 CPUs
  • Haciendo vmstat o top: Floating point exception.
  • Al hacer df -h                                                                                                 overflow              1.0M  4.0K 1020K   1% /tmp
He googleado por semanas, tratando de atar cabos, y de encontrar el por que de este comportamiento aleatorio e inesperado. En la busqueda encontre indicios de DDoS (Denegación de servicio) mediante syn flooding, algo que corregi por medio de mod-evasive,iptables e tunning TCP en el kernel de Linux.
A pesar de haber hecho los ajustes necesarios, el comportamiento se sigue repitiendo, el sistema operativo se congela una vez al día, durante la madrugada donde las cargas son menores. Mi ambiente  de producción es el siguiente:
  • Linux 2.6.24-19-virtual #1 SMP Thu Aug 21 00:52:59 UTC 2008 i686 GNU/Linux
  • Ubuntu JeOS Server 8.04.3 LTS 
  • Servidor de aplicaciones web Apache 2.2.8 Server.
  • Cuatro procesadores Intel(R) Xeon(R) CPU X5450  @ 3.00GHz
  • 3805 Mb de RAM.
En uno de los mensajes anteriores del kernel.log, ya me estaba dando la pauta que algo extraño sucedia con la sincronizacion de los procesadores  y su clocksource
  • kernel: Marking TSC unstable due to: check_tsc_sync_source failed.
Al investigar al respecto, descubro que existe problemas de sincronizacion entre el host de virtualizacion (ESX 3.5 en mi caso) y los huespedes (Linux guest), existen salto de reloj o desincronización entre ambos, el clock real de las interrupciones y la BIOS virtual proporcionada al sistema invitado. En los kernel 2.6.X la correcciones se basan en algoritmos mejorados que pueden producir saltos hacia delante o hacia a tras en el Linux guest, lo que proboca descontinuidad en le sistema huesped. Estas versiones de kernels introducen la temporización y metodos de correccion mediante la API ACPI del kernel, el clocksource. Estas correcciones son las que provocan que nuestro servidor proporcione inexactitud a nuestras aplicaciones y hanging del servidor.
Como solucionarlo, esta documentado por vmeware aqui por lo que no voy a perder tiempo en explicarlo. En las recomendaciones de este documento esta la utilización del servicio NTP, lo cual en mi caso fue necesario para poder solucionar el problema, ya que al pasarle al kernel el clocksource=acpi_pm, no fue suficiente. Aclaro que la comunicación NTP es bidireccional en el puerto UDP 123, es decir nuestros firewalls deben dejar entrar y salir estos puertos para que la sincronización tenga efecto. Los comando NTP lo trate en un entrada anterior.

"La formulación de un problema, es más importante que su solución."
 EINSTEIN, Albert                


Referencias: