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 :
Quand je fait pour les ports ci dessus cités un
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
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
Dans my.cnf
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
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 Sleepc'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); ?>
Partager