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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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);
?>