Sitio Fuera de Servicio

Sitio Fuera de Servicio

de Sergio Zúñiga Sánchez -
Número de respuestas: 7

Tengo un problema con mi ISP, ya que mi sitio esta supendido temporalmente, debido al siguiente problema:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

En dattatango

Dominio: szsoft.org

Usuario: tgzuniga

Base de datos: tgzuniga_docencia

Por mantener conexiones persistentes a la base de datos, ocupando los
recursos indefinidamente. Deberá configurar el tipo de conexiones no
persitentes, o bien corregir las cadenas de conexión de su sitio/portal
de acuerdo a lo especificado en la sección MySQL del panel de control.

Notificarle por e-mail y desuspenderlo cuando se comunique para que
corrija la situación.

Log de las conexiones:

+------+------------------+-----------+-------------------+---------+------+-------+------------------+
| Id   | User             | Host      | db                | Command | Time |
State | Info             |
+------+------------------+-----------+-------------------+---------+------+-------+------------------+
| 3146 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 732  |      
|                  |
| 3147 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 741  |      
|                  |
| 3150 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 724  |      
|                  |
| 3154 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 724  |      
|                  |
| 3160 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 716  |      
|                  |
| 3183 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 685  |      
|                  |
| 3184 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 680  |      
|                  |
| 3185 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 684  |      
|                  |
| 3216 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 634  |      
|                  |
| 3218 | tgzuniga_szuniga | localhost | tgzuniga_docencia | Sleep   | 634  |      
|                  |
| 3722 | root             | localhost |                   | Query   | 0    |      
| show processlist |
+------+------------------+-----------+-------------------+---------+------+-------+------------------+

Alguién sería tan amble de explicarme que está sucediendo y que debo hacer.

Atte,

Sergio Zúñiga

Promedio de valoraciones: -
En respuesta a Sergio Zúñiga Sánchez

Re: Sitio Fuera de Servicio

de Sergio Alfaro -

Sergio este es un extracto que te explicará que sucedio y el por qué de la desición de tus proveeedores  de Host espero te sirva. 

Las conexiones persistentes son enlaces SQL que no se cierran cuando termina la ejecución del archivo de comandos. Cuando se pide una conexión persistente, PHP comprueba si hay ya una conexión persistente idéntica (que permanecía abierta desde antes) - y si existe, la usa. Si no existe, crea un enlace. Una conexión 'idéntica' es una conexión que se abrió hacia el mismo "host", con el mismo nombre de usuario y la misma contraseña (donde sea aplicable).

Nota: Existen otras extensiones que proporcionan conexiones persistentes, tal como la extensión IMAP

La gente que no está familiarizada con el modo como trabajan y distribuyen la carga los servidores "web" puede confundir que significa conexiones persistentes. En particular, no te dan la habilidad de abrir 'sesiones de usuario' en el mismo enlace SQL, no dan la habilidad de construir una transacción de forma eficiente, y no hacen un montón de otras cosas. De hecho, para ser extremadamente claros sobre el tema las conexiones persistentes no te dan ninguna functionalidad que no fuera posible con sus hermanas no-persistentes.

¿Por qué?

Esto tiene que ver con el modo como funcionan los servidores "web". Hay tres modos en que un servidor "web" puede utilizar PHP para generar páginas web.

El primer método es usar PHP como una capa CGI. Cuando corre de este modo, se crea y destruye una instancia del intérprete PHP por cada página solicitada (para una página PHP) a tu servidor. Debido a que se destruye después de cada petición, cualquier recurso que adquiera (como un enlace a un servidor de base de datos SQL) se cierra cuando es destruido. En este caso, no se gana nada si se intentan usar conexiones persistentes, ya que simplemente no persisten.

El segundo, y más popular, método es correr PHP como un módulo en un servidor web multiproceso, lo cual actualmente sólo incluye Apache. Un servidor multiproceso tiene típicamente un proceso (el padre) que coordina un conjunto de procesos (sus hijos) que realmente hacen el trabajo se servir las páginas web. Cuando entra cada petición de un cliente, es entregada a uno de los hijos que no esté ya sirviendo a otro cliente. Esto significa que cuando el mismo cliente hace una segunda petción al servidor, puede ser atendido por un proceso hijo distinto del de la primera vez. Lo que una conexión persistente hace por ti en este caso es hacerlo de tal modo que cada proceso hijo sólo necesita conectar a tu SQL server la primera vez que sirve una página que hace uso de una conexión así. Cuando otra página solicita una conexión a SQL server, puede reutilizar la conexión que el hijo estableció previamente.

El último método es usar PHP como un "plug-in" para un servidor web multihilo. En la actualidad es solamente teórico -- PHP no funciona aún como "plug-in" para ningún servidor web multihilo. Actualmente PHP 4 soporta ISAPI, WSAPI y NSAPI (en Windows), lo cual permite a PHP ser utilizado como "plug-in" para servidores web multihilo como Netscape FastTrack, Internet Information Server (IIS) de Microsoft, y O'Reilly's WebSite Pro. El comportamiento es exactamente el mismo que para el modelo de multiprocesador descrito anteriormente. Tener en cuanta que el soporte para SAPI no está disponible en PHP 3.

Si las conexiones persistentes no aportan ninguna funcionalidad añadida, ¿para qué son buenas?

La respuesta aqui es extremadamente simple -- eficiencia. Las conexiones persistentes son buenas si las cabeceras de control para crear un enlace a tu servidor SQL es alta. Que estas cabeceras sean o no realmente altas depende de muchos factores. Como, qué clase de base de datos es, si esta o no situada en el mismo PC que el servidor web, cómo está de cargada la máquina donde se encuentre el servidor SQL, y otras así. El hecho fundamental es que si la cabecera de conexión es alta, las conexiones persistentes te ayudan considerablemente . Ellas hacen que el proceso hijo simplemente conecte solamente una vez durante todo su intervalo de vida, en vez de cada vez que procesa una página que requiere conectar al servidor SQL. Esto significa que por cada hijo que abrió una conexión persistente tendrá su propia conexión persistente al servidor. Por ejemplo, si tienes 20 procesos hijos distintos que corran un archivo de comandos que cree una conexión persistente a tu servidor SQL, tendrías 20 conexiones diferentes a ti servidor SQL, una por cada hijo.

No obstante, hay que tener en cuenta que esto puede tener desventajas si estais utilizando una base de datos con límites de conexión, por debajo del numero de procesos hijo con conexiones persistentes. Si tu base de datos tiene un límite de 16 conexiones simultaneas y en el curso de una sesión de servidor, 17 procesos hijo intentan conectarse, uno de ellos no podrá hacerlo. Si existen errores en los scripts, que no permitan terminar la conexion (p.ej.bucles infinitos), una base de datos con solo 32 conexiones puede ser rápidamente hundida. Comprobar la documentacion de tu base de datos para obtener información sobre que hacer con conexiones abandonadas ó libres.

Atte,

Sergio Alfaro

En respuesta a Sergio Alfaro

Re: Sitio Fuera de Servicio

de David Delgado -
Una respuesta más sencilla:

1) Las conexiones a la base persistentes se reutilizan en nuevos accesos a la base de datos, evitando el tener que abrir una conexión cada vez, con lo que las páginas se han de ver más rápido.

2) Tenerlas abiertas consume recursos del servidor (memoria, CPU,...) y eso molesta a los administradores de los servidores de alojamiento compartido

3) Arreglar tu problema, que es lo importante, es sencillo: simplemente has de desactivar las conexiones persistentes a la base de datos de Moodle. Es es muy sencillo. Te vas al fichero ~/moodle/config.php y donde pone "$CFG->dbpersist = true;" lo cambias por "$CFG->dbpersist = false;". Creo que debería venir así por defecto, ya que tu situación es muy común.

Espero que esto solucione tus problemas. sonrisa
En respuesta a David Delgado

Re: Sitio Fuera de Servicio

de Sergio Zúñiga Sánchez -

David:

Muchas gracia, ayer descrubrí esta configuración en el archivo config.php y cambié el parámetro correspondiente.

¿Por qué Moodle trae por defecto el parámetro para las conexiones persistentes en true y no en false?

Atte,

Sergio Zúñiga

En respuesta a Sergio Zúñiga Sánchez

Re: Sitio Fuera de Servicio

de David Delgado -
Moodle trae por defecto el parámetro para las conexiones persistentes en true por cuestiones de eficiencia: así son las páginas más rápidas, pero se consumen más recursos y los administradores de los servidores se quejan.
En respuesta a Sergio Alfaro

Re: Sitio Fuera de Servicio

de Sergio Zúñiga Sánchez -

Sergio:

Muchasa gracias, justo ayer después de abrir el foro encontré el artículo en cuestión y lo leí detalladamente y  entendí el problema.

Ahora mi pregunta es que significa para Moodle trabajar con conexiones no persistentes, si por defecto en el archivo config.php, se declaran persistentes.

Atte,

Sergio Zúñiga

En respuesta a Sergio Zúñiga Sánchez

Re: Sitio Fuera de Servicio

de Mario Alejjandro -

hola sergio, yo tmb tengo el mismo problema, creeo que mis procesos estan muy a la alta, pero a diferencia yo no utilizo moodle, yo hice mi propia pagina web con PHP y me marcan lo mismo, muchas conexione spersistentes y la verdad no tengo idea de donde tenga el problema, alguien pudiera ayudarme?????????????

estos son mis procesos:

http://www.ruta52.com/procesos.php

la conexion la realizo con archivo un externo y posteriormente lo incluyo en el archivo ...

$host="localhost";


$user="usuario";

$pass="pass";


$bd="basededatos";

$link = mysql_connect("$host","$user","$pass");

mysql_select_db("$bd",$link);