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);
?> |