Gros problèmes depuis derniere mise à jour Mysql sous Debian !

Nouveau WRInaute
Bonjour à tous :)

Je viens vers vous pour vous soumettre un problème (gros problème) qui viens de me tomber sur la tête depuis mon dernier "apt-get upgrade"...

Notre site web est sous Debian 6 (mis en place par mes soins), avec a la fois Apache et Nginx (Nginx pour les statiques, Apache pour les requetes) et Mysql... Il s'agit d'un serveur dédié de chez OVH, relativement costaud (Bi-Xeon, 24 Go de ram et 2To de HDD)

Tout fonctionnais très correctement depuis pas mal de temps, jusqu'a ce que je décide de faire une mise à jour Debian de maintenance... Nous avons un site à très forte charge (entre 700 et 1500 visiteurs unique simultané par heures).

Depuis cette mise à jour (qui à donc, entre autre, mis à jour Mysql en dernière version) ce dernier n’arrête pas de tombé, et ce de manière totalement aléatoire ! (il peut y avoir simplement 500 visiteurs quand ça tombe, comme 1500...) Et là, c'est le drame : plus d'accès à la base SQL, conso mémoire serveur qui s'envole...

Ce que j'ai vérifié APRÈS cette fameuse mise à jour :

- Fichiers de configuration (Apache.conf, My.cf, Nginx) rigoureusement identique par rapport à avant la mise à jour.
- Espace disque LOIN d’être plein (il reste 1.2 To)
- Il n'y a que Mysql qui se fracasse... (pas Apache ni Nginx)
- Nous avons essayer de désactiver tous les plugins Wordpress suite à sa mise à jour (au cas ou un plugin balancerais des requêtes SQL à foison)

Voici à quoi ressemble mon Apache.conf :

Code:
#
# Based upon the NCSA server configuration files originally by Rob McCool.
#
# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.2/ for detailed information about
# the directives.
#
# Do NOT simply read the instructions in here without understanding
# what they do.  They're here only as hints or reminders.  If you are unsure
# consult the online docs. You have been warned.  
#
# The configuration directives are grouped into three basic sections:
#  1. Directives that control the operation of the Apache server process as a
#     whole (the 'global environment').
#  2. Directives that define the parameters of the 'main' or 'default' server,
#     which responds to requests that aren't handled by a virtual host.
#     These directives also provide default values for the settings
#     of all virtual hosts.
#  3. Settings for virtual hosts, which allow Web requests to be sent to
#     different IP addresses or hostnames and have them handled by the
#     same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path.  If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "foo.log"
# with ServerRoot set to "/etc/apache2" will be interpreted by the
# server as "/etc/apache2/foo.log".
#

### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE!  If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation (available
# at <URL:http://httpd.apache.org/docs/2.2/mod/mpm_common.html#lockfile>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
#ServerRoot "/etc/apache2"
ServerName localhost

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
LockFile ${APACHE_LOCK_DIR}/accept.lock

#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 2048

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 6

##
## Server-Pool Size Regulation (MPM specific)
## 

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    StartServers          64
    MinSpareServers       128
    MaxSpareServers       256
    ServerLimit		  512	
    MaxClients            512
    MaxRequestsPerChild   65536
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadLimit: ThreadsPerChild can be changed to this maximum value during a
#              graceful restart. ThreadLimit can only be changed by stopping
#              and starting Apache.
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

# event MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_event_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadLimit          64
    ThreadsPerChild      25
    MaxRequestsPerChild   0
</IfModule>

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

#
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives.  See also the AllowOverride
# directive.
#

AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being 
# viewed by Web clients. 
#
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

#
# DefaultType is the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value.  If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType text/plain


#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log

#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn

# Include module configuration:
Include mods-enabled/*.load
Include mods-enabled/*.conf

# Include all the user configurations:
Include httpd.conf

# Include ports listing
Include ports.conf

#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
Include conf.d/

# Include the virtual host configurations:
Include sites-enabled/

# Sécurisation du fichier de configuration de phpMyAdmin:
<Files config.inc.php>
	Order allow,deny
	Deny from all
</Files>



Et mon fichier de conf Mysql (My.cf) :

Code:
#
# The MySQL database server configuration file.
#
# You can copy this to one of:
# - "/etc/mysql/my.cnf" to set global options,
# - "~/.my.cnf" to set user-specific options.
# 
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# This will be passed to all mysql clients
# It has been reported that passwords should be enclosed with ticks/quotes
# escpecially if they contain "#" chars...
# Remember to edit /etc/mysql/debian.cnf when changing the socket location.
[client]
port		= 3306
socket		= /var/run/mysqld/mysqld.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket		= /var/run/mysqld/mysqld.sock
nice		= 0

[mysqld]
#
# * Basic Settings
#
user		= mysql
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
port		= 3306
basedir		= /usr
datadir		= /var/lib/mysql
tmpdir		= /tmp
language	= /usr/share/mysql/english
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address		= 127.0.0.1
#
# * Fine Tuning
#
key_buffer		= 16M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
max_connections        = 256
table_cache            = 512
#thread_concurrency     = 10
#
# * Query Cache Configuration
#
query_cache_limit	= 1M
query_cache_size        = 32M
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file        = /var/log/mysql/mysql.log
#general_log             = 1
#
# Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
#
# Here you can see queries with especially long duration
log_slow_queries	= /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id		= 1
#log_bin			= /var/log/mysql/mysql-bin.log
expire_logs_days	= 10
max_binlog_size         = 100M
#binlog_do_db		= include_database_name
#binlog_ignore_db	= include_database_name
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
#
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem



[mysqldump]
quick
quote-names
max_allowed_packet	= 16M

[mysql]
#no-auto-rehash	# faster start of mysql but no tab completition

[isamchk]
key_buffer		= 16M

#
# * IMPORTANT: Additional settings that can override those from this file!
#   The files must end with '.cnf', otherwise they'll be ignored.
#
!includedir /etc/mysql/conf.d/
log-slow-queries = /var/log/mysql/mysql-slow.log
long_query_time = 1

J'ajouterais que j'ai utiliser le fameux script Mysql Tunning Primer (après les 48h recommandé de mise en service) pour optimiser le tout il y a longtemps.

Ce qui est curieux, c'est qu'aucun de mes fichiers de config n'a apparemment bougé, mais la conso mémoire s'envole et mysql se vautre...

Si vous avez un coup de pouce ou un conseil à me donner (ma config ne doit pas être au top je suppose), ça n'est vraiment pas de refus :)

Enorme merci pour votre aide :wink:
Bonne journée à tous
 
WRInaute passionné
Une requête SQL qui ne fonctionne plus sur la nouvelle version ? La BDD est exactement configurée pareil ? Moteur, interclassement, etc ? Ce sont juste quelques pistes, ce n'est pas mon corps de métier...
 
Nouveau WRInaute
En fait, j'ai checké un à un tous mes fichiers de config... Et ils ont pas bougé par rapport à avant (quand ça marchais bien). :?

La seule chose qui a évidemment bouger, c'est la version de Nginx, Mysql et Apache. Leurs config à été conservé au poil de cul près.

La les symptômes sont :

- Plantage aléatoire de Mysql
- Consommation mémoire qui s’envole quand SQL est dans les choux.
- Plus d’accès en SSH quand c'est vautré... Ou alors il faut attendre genre 15/20 minutes avant d'avoir l'invite.
- Erreur 500 sur tout le site.

Le script Tuning Primer m'afficher un ratio de lock de 1 : 3000 parfois (ça il ne me le faisais pas avant)

J'ai calé un coup de FSCK au cas ou ça serait l'un des disque, ça change rien...
 
WRInaute passionné
Assez bizarre. il faudrait que tu regardes les logs.
Par contre tu dis "plantage depuis changement de version", SANS DONNER LA VERSION !!

Ce qui est très bizarre avec ton my.cnf, c'est qu'il ressemble à celui par défaut fourni avec Debian, pas du tout à un my.cnf configuré pour un serveur avec 24Go de RAM mais plutôt un petit..
 
Nouveau WRInaute
Julia41 a dit:
Assez bizarre. il faudrait que tu regardes les logs.
Par contre tu dis "plantage depuis changement de version", SANS DONNER LA VERSION !!

Ce qui est très bizarre avec ton my.cnf, c'est qu'il ressemble à celui par défaut fourni avec Debian, pas du tout à un my.cnf configuré pour un serveur avec 24Go de RAM mais plutôt un petit..


Il tournais bien en fait par défaut... Tu l'optimiserais comment pour un serveur avec 24Go toi ?
 
Nouveau WRInaute
J'avais le même problème que toi ,que j'ai pas réussi à corriger entièrement , Bon pour le maxclient d'apache , Considère à l'élever à 900 par ex ..
 
WRInaute passionné
Torlax a dit:
Il tournais bien en fait par défaut... Tu l'optimiserais comment pour un serveur avec 24Go toi ?
Bah il faudrait voir ce dont tu as réellement besoin et la gueule de tes bases.
Là comme ça tu me demandes de savoir lire dans une boule de cristal ;)
Regarde un peu du côté des outils comme "tuning primer" ou "mysqltuner" ça pourrait te donner pas mal d'idées.
 
Nouveau WRInaute
Julia41 a dit:
Torlax a dit:
Il tournais bien en fait par défaut... Tu l'optimiserais comment pour un serveur avec 24Go toi ?
Bah il faudrait voir ce dont tu as réellement besoin et la gueule de tes bases.
Là comme ça tu me demandes de savoir lire dans une boule de cristal ;)
Regarde un peu du côté des outils comme "tuning primer" ou "mysqltuner" ça pourrait te donner pas mal d'idées.


Heuu, comme dis dans mon premier message, j'utilise Tuning Primer...
Comme je l'ai déjà dit également, j'ai entre 1000 et 1800 visiteurs unique et simultanés, par heures.

J'ai deux bases Mysql, l'une de 150 Mo, celle du site (Wordpress).
L'autre de 30 Mo, celle du forum (Invision Power Board).

j'ai migré toutes mes tables vers Innodb.

Le serveur est ENTIÈREMENT dédié au site, ce qui veut dire que le proç, la ram (les 24 Go) et les 2.3 To de disque sont entièrement dédié au site. Je suis sous Debian Squeeze, j'utilise Apache 2, Mysql en dernière version. Je pense qu'avec ces éléments, il est possible de me conseiller au moins vers quel type d'optimisation je pourrais faire sur un serveur de cette trampe :)

Grand merci :wink:
 
WRInaute passionné
Bah déjà tu pourrais suivre ce que te dis tuning primer ;)
Généralement ça suffit amplement à faire des bonnes modifications dans un premier temps.

Attention à ne pas parler de "visiteurs simultanés" car ça ne veut rien dire.
Pour moi 1800 visiteurs simultanés veut dire qu'à un instant "t" (inférieur à la milliseconde) tu as 1800 personnes qui sont sur ton site.
Vu tes bases qui ont l'air petite, à mon avis en suivant rapidement les conseils de Tuning Primer, ça devrait fonctionner sans soucis.
 
Nouveau WRInaute
Hello :)

Donc, ce que me dit Tuning Primer (après 48h de mise en service donc) je l'ai déjà suivi, tout est clean de ce côté, je n'est pas d'erreurs :)

Au sujet des 1800 visiteurs simultané, c'est bien à un instant "T"... ça peu même passer de 500 visiteurs, à 2100 visiteurs en moins de 20 secondes, et ça arrive très régulièrement le soir, aux alentours de 19h00 quand les gens rentre chez eux.

Hier j'ai éliminé toutes les éventuelles erreurs que je pouvais avoir sur le serveur :

J'ai recompilé "eAccelerator", car après la mise à jour de Mysql, je me suis aperçu qu'il me générais une erreur dans mes logs apache suite à la mise à jour du serveur. Donc tout va bien de se coté maintenant.

J'avais mon raid 5 (celui de 2,3 To) qui s’emballait sous ESX (message de perte de performance) J'ai donc demandé à OVH de checké si a tout hasard il n'y aurais pas un des disques du Raid 5 qui serait monté au plafond... Ce n'est pas le cas.
 
Discussions similaires
Haut