Valeurs optimales pour les directives ServerLimit, MaxClients, MaxRequestsPerChild

29

J'exécute un site très fréquenté avec beaucoup de contenu dynamique, principalement généré par les utilisateurs.

Le serveur est un serveur dédié et dispose d'un total de 4 processeurs Intel (R) Xeon (R) CPU X3210 @ 2,13 GHz. J'ai besoin de connaître les valeurs optimales pour les directives de ServerLimit et MaxClients apache, étant donné que le serveur dispose de 4 Go de RAM et que la base de données MySQL s'exécute sur un serveur distinct. Le panneau est DirectAdmin avec CentOS.

Voici mes directives actuelles, mais pendant les heures de pointe avec plus de 5 000 utilisateurs, un retard important est remarqué - et ce n'est pas entièrement la faute de MySQL, car les pages semblent être générées rapidement (j'ai implémenté un compteur de temps de génération de page), mais il y a un long délai de connexion jusqu'à ce que la page commence à répondre et soit envoyée au navigateur.

<IfModule prefork.c>
    StartServers     800
    MinSpareServers   20
    MaxSpareServers   60
    ServerLimit      900
    MaxClients       900
    MaxRequestsPerChild  2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5

Je dois mentionner que la surveillance du serveur à l'aide de la commande supérieure, l'utilisation du processeur ne dépasse jamais 20% ~ 30% aux heures de pointe. Le serveur MySQL a également une utilisation de 30 à 50% à ce moment-là, et je travaille constamment sur la correction des requêtes lentes, mais c'est un problème différent. Je sais que ce n'est pas un goulot d'étranglement DB, car les pages statiques prennent également beaucoup de temps à se charger aux heures de pointe.

Tous les conseils pour optimiser ces valeurs seront grandement appréciés, merci.

andreszs
la source

Réponses:

24

Votre MaxClients est beaucoup trop élevé. Quelle est la taille actuelle de votre processus Apache? Multipliez cela par 900. Est-ce supérieur à 4 Go? Si tel est le cas, la machine est susceptible de basculer. Je commence généralement avec MaxClients = 2x vCPU dans la boîte (grep -c processor / proc / cpuinfo). Dans ce cas, ce serait environ 8. Assurez-vous que la taille du processus MaxClients x apache ne dépasse pas 4 Go.

Vous pouvez augmenter vos MaxClients à partir de là, selon le type de connexion de vos clients. (Les utilisateurs d'accès à distance doivent être alimentés à la cuillère, etc.) Mais assurez-vous de ne jamais vous mettre dans une situation d'échange.

Définissez ensuite vos serveurs Min, Max et Start sur MaxClients. Il n'est pas vraiment nécessaire de les différencier dans un environnement de serveur dédié.

Ensuite, faites quelques tests avec ab (comme des notes d'oie.)

chariot renversé
la source
Pour une raison quelconque, il semble que j'ai mal déterminé la taille du processus ... maintenant, je vois dans la commande supérieure que les processus apache RESIDENT SIZE vont de 10 à 15 Mo. J'ai lu quelque part que, puisque les bibliothèques partagées sont incluses dans ce nombre, la "vraie" taille est la moitié de cette taille. Compte tenu de cela, je devrais calculer que je peux accueillir 570 processus de 7 Mo chacun, pensez-vous que c'est correct?
andreszs
Je vous suggère d'utiliser 15 Mo pour les calculs, puis de commencer à vérifier les métriques: # processus http vs utilisation de la mémoire. Cela vous donnera une meilleure idée du nombre de MaxClients
hdanniel
1
Je l'ai abaissé à 400 et même avant l'heure de pointe, le résultat a eu l'effet inverse que souhaité: Toute valeur inférieure à l'original crée des délais d'attente et de longs retards. En fait, maintenant, je l'ai augmenté à 1500 clients et l'utilisation de la mémoire est désormais de 3 Go alors que l'utilisation moyenne du processeur est de 8%. Bien sûr, il y a plus de charge sur le serveur SQL maintenant et je vais devoir y travailler.
andreszs
Voici ma commande htop maintenant, 1500 processus apache et près de 100 processus système. Ceci avec 75% d'utilisation de la RAM. a.imagehost.org/0011/htop.png Devriez-vous reconsidérer votre formule? ;)
andreszs
1
C'est pourquoi vous devez effectuer des tests dans votre propre environnement. Nous avons des accélérateurs http devant nos apaches, donc ils ne sont pas des utilisateurs mobiles à la cuillère. Votre candidature semble également très légère. Si vous avez déplacé la charge vers votre base de données, cela m'indique que davantage de ces processus apache servent réellement des données vs assis et attendent une connexion mysql. Ce qui m'amène alors à vous demander combien de connexions autorisez-vous à votre base de données? Ce nombre dépasse-t-il vos MaxClients? Avez-vous 5 000 connexions simultanées? Si c'est le cas, vous voudrez peut-être examiner quelque chose comme perlbal en face.
toppledwagon
5

Vous devez obtenir la taille moyenne de votre processus Apache. Avec ce nombre et la taille totale de votre RAM, vous pouvez calculer la directive MaxClients. Rappelez-vous ceci: "Un serveur Web ne devrait jamais avoir à échanger" ( Apache Performance Tuning )

La surveillance avec top ou htop est ok mais vous avez besoin d'une meilleure vue de toutes les statistiques de vos serveurs (cpu, ram, E / S disque, demandes apache, requêtes lentes mysql, etc ...) avec un outil de surveillance comme ganglia ou munin pour trouver d'éventuels goulots d'étranglement.

hdanniel
la source
Pour le moment, je n'ai que les commandes top et htop, et je n'arrive pas à comprendre toutes ses informations de toute façon. C'est l'activité d'hier aux heures de pointe, il semble qu'il n'y ait pas d'échange; dites-moi si je me trompe: Tâches: 1043 au total, 2 en cours d'exécution, 1041 en sommeil, 0 à l'arrêt, 0 processeur (s) zombie (s): 13,8% us, 1,8% sy, 0,0% ni, 82,1% id, 0,8% wa, 0,0% hi, 1,5% si, 0,0% st Mem: 4138360k total, 3961276k utilisé, 177084k gratuit, 75016k buffers Swap: 2031608k total, 1484k utilisé, 2030124k gratuit, 1836600k mis en cache
andreszs
Oui, votre serveur ne change pas. Je préfère les métriques réelles, mais si vous le souhaitez, vous pouvez utiliser un outil de stress comme ab ou httperf pour vérifier la capacité de votre serveur. Pour les tests, prenez soin de MaxClients et commencez avec un nombre faible (basé sur l'hypothèse de 15 Mo).
hdanniel
4

Je recommande de jouer avec l'outil de référence (ab) d'Apache. Vous pouvez jouer avec les valeurs pour les faire correspondre à votre flux de trafic et voir quel type de réponses vous obtenez en ce qui concerne le temps de chargement moyen, etc. À ce stade, vous pouvez jouer avec les paramètres dont vous parlez pour essayer de les optimiser. Vous devriez être en mesure avec ab d'obtenir une idée des performances optimales pour chaque ajustement des performances.

Il ne serait pas vraiment prudent pour moi de parler de vos paramètres, mais vous devez également prendre en compte votre RAM car il semble que vous mangez beaucoup de RAM avec ces paramètres. Bien que ce ne soit que de la spéculation sans aucune donnée. htop vous donne une bonne lecture visuelle de vos ressources.

Votre moyenne de charge pourrait également en dire long. Je doute que votre utilisation soit beaucoup plus élevée que votre quantité totale de cœurs de 20 à 30% de processeur, mais c'est un autre indicateur de la puissance de votre serveur.

OIE
la source
Le problème est que je ne suis pas assez expérimenté dans l'administration du serveur, alors commencez à jouer avec les réglages et surveillez les résultats .. Je n'ai jamais utilisé l'outil ab pour être honnête. La modification des valeurs nécessite également de redémarrer HTTDP, ce qui cause des inconvénients à mes utilisateurs, je préfère donc éviter cela. Imaginez que vous envoyez un message à un autre utilisateur et après avoir cliqué sur "Envoyer", vous obtenez un problème de connexion au serveur. Sur l'utilisation du CPU, voir les informations de mon commentaire précédent: il ne dépasse pas 15% aux heures de pointe. Je pense que c'est tout à fait acceptable étant donné que j'avais 6 000 utilisateurs en ligne hier.
andreszs
Eh bien, je ne voudrais certainement pas que vous fassiez cela dans un environnement de production. Je recommande de le faire à votre temps de trafic le plus bas si un autre serveur (avec un matériel très similaire sinon identique) à tester. ab est assez facile à utiliser, mais je pense vraiment que toppledwagon a donné une bonne instruction sur le calcul de vos MaxClients. Une fois que vous avez cessé d'utiliser l'espace d'échange, vous constaterez une nette amélioration. consultez httpd.apache.org/docs/2.0/programs/ab.html et cyberciti.biz/tips/… pour AB
goose