Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Administration
Administration Forum d'entraide sur l'administration de MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/01/2011, 17h02   #1
Futur Membre du Club
 
Inscription : décembre 2003
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 86
Points : 17
Points : 17
Par défaut Administration de mysql sous linux

Je ne sais pas si je suis dans le bon forum pour ce post puisqu'il traite de mysql mais aussi de réseau et linux et php ...

Je me suis retrouvé 4 fois de suite avec un message d'erreur "too many connections"
et depuis j'investigue, mais je ne suis pas une brute en admin réseau/ mysql. C'est pourquoi j'aurais besoin de vos lumières.

Ma config machine
Plesk 9.5.4
OS Linux CentOS 5 32 bits 2.6.33.5-1ikl
CPU GenuineIntel, Intel(R) Xeon(R)CPU X3430 @ 2.40GHz (4 coeurs, 2.4 GHz)
8Go DDR3

J'ai d'abord fait :
Code :
1
2
3
4
5
6
7
8
mysqladmin -uadmin -p`cat /etc/psa/.psa.shadow` processlist
+-------+----------+---------------------+--------------+---------+-------+-------+------------------+
| Id    | User     | Host                | db           | Command | Time  | State | Info             |
+-------+----------+---------------------+--------------+---------+-------+-------+------------------+
| 11175 | user1 | xxx.xxx.xxx.xxx:44550 | mydatabase1      | Sleep   | 11677 |       |                  |
...
| 10810 | user2    | xxx.xxx.xxx.xxx:42421 | mydatabase2 | Sleep   | 23650 |       |                  |
...et 99% des lignes sont de ce type : Sleep  = pas de requête mais users bloqués
Quand je fait pour les ports ci dessus cités un
netstat -ntp
Code :
1
2
3
4
5
Proto Recv-Q Send-Q LOCAL Address               FOREIGN Address             State       PID/Program name   
tcp        0      0 xxx.xxx.xxx.xxx:44550         xxx.xxx.xxx.xxx:3306          ESTABLISHED 12611/httpd 
tcp        0      0 xxx.xxx.xxx.xxx:3306          xxx.xxx.xxx.xxx:44550         ESTABLISHED 4022/mysqld
tcp        0      0 xxx.xxx.xxx.xxx:3306          xxx.xxx.xxx.xxx:42421         ESTABLISHED 4022/mysqld  
tcp        0      0 xxx.xxx.xxx.xxx:42421         xxx.xxx.xxx.xxx:3306          ESTABLISHED 2717/httpd
...

et les PID asociés sont 4022 pour le mysqld, et un port à chaque fois différent pour httpd

Car si je fais un
ps aux
Code :
1
2
3
4
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
mysql     4022  0.0  0.4 143992 37292 ?        Sl   Jan08   1:33 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock
apache    2717  0.0  0.4  71456 41076 ?        S    06:05   0:03 /usr/sbin/httpd
apache   12611  0.0  0.5  74812 44604 ?        S    11:22   0:02 /usr/sbin/httpd
Dans my.cnf
j'ai augmenté max_connections=150 au lieu de 100 (par défaut)
j'ai diminué le wait_timeout=7200 au lieu de 28800
j'ai augmenté table_cache=128 au lieu de 64

Je viens de lire que ces processus en Sleep c'est surement la faute de mes connections à mysql : j'utilise mysql_pconnect au lieu de mysql_connect
mais je n'arrive pas à savoir à partir de quand (combien d'utilisateurs simultanés, combien de bases / tables ouvertes , ...) il faut mieux préférer l'une à l'autre.

Qu'est-ce que vous pourriez me conseiller d'autre comme modif de my.cnf ? Quel critères pour mysql_connect / pconnect ?

Merci d'avance.

PS : j'ai trouvé ce script php à mettre en cron. Il a l'air exactement ce que je cherche mais je ne suis pas sûr des conséquences potentielles (fermeture de mysql ? => déconnection autre...?) : qu'en pensez-vous ?


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/php -q
<?php
define('SERVER','localhost');
define('USER','root');
define('PASSWORD','');
define('UPTIME',1000);
 
$link = mysql_connect(SERVER, USER, PASSWORD);
 
$query = "show processlist;";
$result = mysql_query($query) OR die ("failed $query");
while ($row = mysql_fetch_array($result))
{
//	echo '<pre>'.var_dump($row).'</pre>';
	IF (($row['Time'] > UPTIME && $row['Command'] == "Sleep") && ($row['User'] != "root"))
	{
		$killed = 0;
		mysql_query("kill ".$row['Id']) OR ($killed = 1);
		IF ($killed = 1)
		{
			echo
			"Killed process number ".$row['Id'].", with a User of ".$row['User']
			." in database ".$row['db'].", which had a time of ".$row['Time']
			.", and a command of ".$row['Command']."\r\n\r\n";
		}
	}
}
@mysql_close($link);
?>
beyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 22h36   #2
Futur Membre du Club
 
Inscription : décembre 2003
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 86
Points : 17
Points : 17
A priori les modif que j'ai effectué ne sont pas suffisantes puisque j'ai toujours un nombre qui finit par croître :
actuellement le Max_used_connections est de 101

mais ce qui m'étonne c'est que je n'ai "seulement" que 46 processus (et pas 101 !) quand je fait
Code :
mysqladmin -uadmin -p`cat /etc/psa/.psa.shadow` processlist
je ne comprends vraiment pas le méandres de l'administration de mysql et des processus. Pouvez-vous éclairer ma lanterne ?

Et éventuellement changer le post de rubrique si le modo pense qu'il pourrait être plus regardé / répondu ailleurs.

Merci d'avance.
beyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 23h02   #3
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
EDIT : DESOLE GROSSE BETISE DITE !
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 14h35   #4
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 547
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 547
Points : 4 261
Points : 4 261
Salut,

http://be2.php.net/manual/fr/functio...l-pconnect.php

Citation:
mysql_pconnect() se comporte exactement comme mysql_connect(), mais avec deux différences majeures :

Premièrement, lors de la connexion, la fonction essaie de trouver une connexion permanente déjà ouverte sur cet hôte, avec le même nom d'utilisateur et de mot de passe. Si une telle connexion est trouvée, son identifiant est retourné, sans ouvrir de nouvelle connexion.

Deuxièmement, la connexion au serveur MySQL ne sera pas terminée avec la fin du script. Au lieu de cela, le lien sera conservé pour un prochain accès (mysql_close() ne terminera pas une connexion persistante établie par mysql_pconnect()).

C'est pourquoi ce type de connexion est dite persistante.
Citation:
Avertissement
L'utilisation des connexions persistantes requiert des paramétrages d'Apache et de MySQL pour vous assurer que vous n'atteindrez pas la limite maximale de nombre de connexions simultanées autorisée par MySQL.
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 18h37   #5
Futur Membre du Club
 
Inscription : décembre 2003
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 86
Points : 17
Points : 17
Oui, c'est ce que j'ai vu (récemment hélas). Ce qui m'intéresserais donc c'est

Citation:
Citation:
Avertissement
L'utilisation des connexions persistantes requiert des paramétrages d'Apache et de MySQL pour vous assurer que vous n'atteindrez pas la limite maximale de nombre de connexions simultanées autorisée par MySQL.
Comment paramétrer Apache et mysql dans ce cas ? Quelles valeurs ajuster/modifier... Dans quel sens ?

Citation:
Deuxièmement, la connexion au serveur MySQL ne sera pas terminée avec la fin du script. Au lieu de cela, le lien sera conservé pour un prochain accès
Quand la connection se coupe t'elle alors? quel est le(s) paramètre(s) qui en décide ?

J'ai actuellement environ 40 domaines installés sur ce serveur dont la fréquentation va de 10 visites/jour à 200 visites/jour (exceptionnellement 1500 visites/jours pour un domaine) mais tous ceux avec base mysql sont paramétrés avec un pconnect...
beyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h30.


 
 
 
 
Partenaires

Hébergement Web