Optimisation nouveau Xeon qui pose problème

WRInaute discret
Bonjour

J'ai un nouveau serveur: un xeon monoprocesseur :
Modèle CPU Intel® Xeon™ CPU 3.00GHz
Fréquence CPU 3000.67
Cache CPU 2048 KB
Bogomips CPU 11943.93

A priori pas trop mal sur le papier. Seulement voilà, je me retrouve avec les mêmes problèmes qu'avec mon ancien Pentium IV: pas trop de charge cpu (150 personnes en ligne sur le forum) mais un load average: 0.93 et aussi je trouve un nombre de tasks anormalement élevé.

4 à 5 fois chaque jour, alors que je n'ai pas plus de 250 personnes sur le forum, j'ai ce message d'erreur : "Sorry, SMF was unable to connect to the database. This may be caused by the server being busy. Please try again later."

Je demande votre aide pour des solutions d'optimisation. Le forum (SMF) est rapide, mais je ne m'explique pas les montée de load average.

Voici le résultat de mon TOP

top - 18:55:17 up 4 days, 4:25, 1 user, load average: 0.93, 0.61, 0.64
Tasks: 110 total, 1 running, 109 sleeping, 0 stopped, 0 zombie
Cpu(s): 9.5% us, 2.5% sy, 0.0% ni, 86.9% id, 1.0% wa, 0.0% hi, 0.2% si
Mem: 1035848k total, 528944k used, 506904k free, 11512k buffers
Swap: 2650684k total, 102108k used, 2548576k free, 294716k cached

Voici quelques uns de mes réglages:
apache 2 conf:

Timeout 30

# 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 1000

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

KeepAliveTimeout 15

##
## 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 prefork.c>
StartServers 15
MinSpareServers 5
MaxSpareServers 10
MaxClients 250
MaxRequestsPerChild 0
#StartServers 15
#MinSpareServers 10
#MaxSpareServers 15
#MaxClients 250
#MaxRequestsPerChild 200000
</IfModule>

# pthread MPM
# StartServers ......... initial number of server processes to start
# MaxClients ........... maximum number of server processes allowed to start
# 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 worker.c>
StartServers 10
MaxClients 250
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 100
MaxRequestsPerChild 100000
</IfModule>

# perchild MPM
# NumServers ........... constant number of server processes
# StartThreads ......... initial number of worker threads in each server process
# MinSpareThreads ...... minimum number of worker threads which are kept spare
# MaxSpareThreads ...... maximum number of worker threads which are kept spare
# MaxThreadsPerChild ... maximum number of worker threads in each server process
# MaxRequestsPerChild .. maximum number of connections per server process (then it dies)
<IfModule perchild.c>
NumServers 5
StartThreads 5
MinSpareThreads 5
MaxSpareThreads 100
MaxThreadsPerChild 100
MaxRequestsPerChild 100000


My?cnf

key_buffer = 16M
max_allowed_packet = 16M
thread_stack = 128K
#
# * Query Cache Configuration
#
query_cache_limit = 10485760
query_cache_size = 167772160
query_cache_type = 1

max_user_connections = 50
#


et dans php.ini (les réglages eaccelerator)

extension=mcrypt.so
extension=mysql.so
extension=gd.so
extension="eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/home/tmpfiles/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="0"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
 
Nouveau WRInaute
Bonsoir,

A première vue tu as une limite trop forte sur les connexions mysql.
Il faudrait dans my.cnf un max_user_connections = 100
Voir plus.

Il faudra relancer ton serveur mysql pour que cette modif soit prise en compte.
 
Nouveau WRInaute
Salut,

Remplace
MaxRequestsPerChild 0

par

MaxRequestsPerChild 8000

Ensuite, il faut revoir ta configuration mysql,

Sur mon Bixeon avec 2Go de ram j'ai adopté la suivante :

max_connections = 500
key_buffer = 32M
myisam_sort_buffer_size = 64M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
table_cache = 1800
thread_cache_size = 384
wait_timeout = 90
connect_timeout = 10
tmp_table_size = 64M
max_heap_table_size = 64M
max_allowed_packet = 64M
max_connect_errors = 10
read_rnd_buffer_size = 524288
bulk_insert_buffer_size = 8M
query_cache_limit = 3M
query_cache_size = 80M
query_cache_type = 1
query_prealloc_size = 163840
query_alloc_block_size = 32768

Essaie ça pour voir, ca devrait être mieux même si un peu costaud. Ceci dit je ne suis pas dieu en mysql ...

En ce qui concerne le load, ce n'est pas non plus affolant... voir largement raisonnable.

A 750 connectés sur mon forum il m'arrive vite de loader a 2 ou 3, pourtant le temps de generation des pages reste inférieur à 0.01 seconde.
 
WRInaute discret
Il semblerait que sous apache 2 on doive mettre un MaxRequestsPerChild élevé (8000), alors que pas mal de personnes conseillent de ne pas dépasser 200 ?
 
WRInaute passionné
En théorie 0 c'est très bien. En pratique, un chiffre entre 5000 et 10000 est "rassurant", juste pour s'assurer que les éventuelles fuites mémoire coté PHP ne s'éternisent pas. Mais de toutes façons Apache est relancé au moins une fois par jour pour la rotation des logs...

En tous cas j'ai vu des serveurs qui étaient loin d'être réactifs justement à cause d'un MaxRequetsPerChild bien trop bas... Si les processus ne sont pas relancés par défaut, c'est bien qu'il y a une raison...

Donc a moins d'avoir 128Mo de RAM sur la machine et des scripts très très mal codés (et encore :s), je déconseillerais de mettre moins de 5000 (ou dans ce cas 0).
 
Discussions similaires
Haut