Aller au contenu

MySQL utilise trop de mémoire


Thoranix

Sujets conseillés

Bonsoir

J'ai acheté récemment un serveur virtuel auprès de Nexlink et il est alloué 256 Mo de RAM. Tout était pré-installé (Apache, PHP 4, MySQL 3.23...)

Il n'y a qu'un site qui utilise pas mal de connexions à la base de données. J'ai optimisé de manière assez importante les scripts PHP pour réduire les requêtes vers la base de données (nombre divisé par plus de 2) mais la mémoire occupée par chaque processus MySQL est toujours la même.

Il y a constamment (jour et nuit, à toutes heures) 11 processus MySQL avec chacun 30 Mo de mémoire allouée (si ce sont bien des ko que donne la colonne RSS de la commande "ps aux"). 11*30 = 330 > 256 Mo donc je suppose qu'il swappe (la commande top n'est pas présente apparemment, distribution Fedora Core 2)

Il y a une semaine, MySQL s'est mis subitement à ne consommer que 10 Mo sans raison apparente mais j'ai du redémarrer le serveur hier et... la situation est revenue à 30 Mo par processus. Je précise que le site tournait aussi vite avec 10 ou 30 Mo pour MySQL.

Quelqu'un peut-il m'aider pour réduire le nombre de processus OU réduire la mémoire utilisée ?

Je vous montre le résultat de la commande sql "show variables" (j'ai aussi modifié le fichier etc/my.cnf pour réduire le key-buffer etc... sans conséquence)

 Variable_name    Value
back_log  50
basedir  /usr/
bdb_cache_size  8388600
bdb_log_buffer_size  32768
bdb_home  /var/lib/mysql/
bdb_max_lock  10000
bdb_logdir  
bdb_shared_data  OFF
bdb_tmpdir  /tmp/
bdb_version  Sleepycat Software: Berkeley DB 3.2.9a: (September...
binlog_cache_size  32768
character_set  latin1
character_sets  latin1 big5 cp1251 cp1257 croat czech danish dec8 ...
concurrent_insert  ON
connect_timeout  5
datadir  /var/lib/mysql/
delay_key_write  ON
delayed_insert_limit  100
delayed_insert_timeout  300
delayed_queue_size  1000
flush  OFF
flush_time  0
have_bdb  YES
have_gemini  NO
have_innodb  YES
have_isam  YES
have_raid  NO
have_openssl  NO
init_file  
innodb_additional_mem_pool_size  1048576
innodb_buffer_pool_size  8388608
innodb_data_file_path  ibdata1:10M:autoextend
innodb_data_home_dir  
innodb_file_io_threads  4
innodb_force_recovery  0
innodb_thread_concurrency  8
innodb_flush_log_at_trx_commit  1
innodb_fast_shutdown  ON
innodb_flush_method  
innodb_lock_wait_timeout  50
innodb_log_arch_dir  
innodb_log_archive  OFF
innodb_log_buffer_size  1048576
innodb_log_file_size  5242880
innodb_log_files_in_group  2
innodb_log_group_home_dir  ./
innodb_mirrored_log_groups  1
interactive_timeout  28800
join_buffer_size  131072
key_buffer_size  4190208
language  /usr/share/mysql/english/
large_files_support  ON
locked_in_memory  OFF
log  OFF
log_update  OFF
log_bin  OFF
log_slave_updates  OFF
log_long_queries  OFF
long_query_time  10
low_priority_updates  OFF
lower_case_table_names  0
max_allowed_packet  1048576
max_binlog_cache_size  4294967295
max_binlog_size  1073741824
max_connections  100
max_connect_errors  10
max_delayed_threads  20
max_heap_table_size  16777216
max_join_size  4294967295
max_sort_length  1024
max_user_connections  0
max_tmp_tables  32
max_write_lock_count  4294967295
myisam_max_extra_sort_file_size  256
myisam_max_sort_file_size  2047
myisam_recover_options  0
myisam_sort_buffer_size  4194304
net_buffer_length  16384
net_read_timeout  30
net_retry_count  10
net_write_timeout  60
open_files_limit  0
pid_file  /var/run/mysqld/mysqld.pid
port  3306
protocol_version  10
record_buffer  131072
record_rnd_buffer  131072
query_buffer_size  0
safe_show_database  ON
server_id  0
slave_net_timeout  3600
skip_locking  ON
skip_networking  OFF
skip_show_database  OFF
slow_launch_time  2
socket  /var/lib/mysql/mysql.sock
sort_buffer  2097144
sql_mode  0
table_cache  64
table_type  MYISAM
Variable_name  Value
thread_cache_size  0
thread_stack  65536
transaction_isolation  READ-COMMITTED
timezone  CET
tmp_table_size  8388608
tmpdir  /tmp/
version  3.23.58
wait_timeout  28800

Je vous remercie ;)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Les paramètres suivants allouent la mémoire pour chaque connections:

read_buffer_size

read_rnd_buffer_size

sort_buffer_size

myisam_sort_buffer_size

Si leur valeur est élevée, la consommation mémoire de mysql grimpe.

Peut-être peux-tu nous donner leurs valeurs pour t'aider à ajuster tout ça ?

Sinon, tu peux lancer la commande "free", qui va te donner l'état de ton swap.

D'autre part 11 processes mysql... peut-être que tu peux voir du côté des paramètres thread_concurrency et thread_cache_size, ou alors tu as énormément de connections.

Réduire le key-buffer size n'est pas forcément recommandé car c'est une zone mémoire partagée entre tous les threads mysql.

@+

Lien vers le commentaire
Partager sur d’autres sites

J'ai justement fourni le résultat de "show variables" pour vous montrer toutes les valeurs. D'ailleurs les valeurs "read" ne sont pas disponibles pour MySQL 3.23. J'ai demandé à un ami d'installer MySQL 5 mais ca a échoué, on réessayera mais on n'a pas fixé de date encore.

J'ai essayé de réduire les valeurs existantes que vous proposez mais ca semble légèrement ralentir l'affichage des pages sans pour autant réduire la mémoire allouée à chaque processus.

Fait "troublant", lorsque j'arrête Apache (il n'y a plus personne sur le site donc) et MySQL (plus de processus MySQL) et que je ne relance que MySQL, la situation de MySQL est quasiment identique (à 2-3 Mo près) à celle après plusieurs jours de fonctionnement : 11 processus.

Quant à la commande "free", elle semble retourner le swap de la machine elle-même (à moins que je n'utilise 7.32 Go ^^) et donc la somme de tous les serveurs virtuels installés.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...