web-dev-qa-db-fra.com

Optimiser Apache / PHP / MySQL en cours d'exécution sur VPS pour une charge lourde

Question sur l'optimisation d'un serveur Apache/MySQL sur un VPS avec 512m de RAM. Sous la charge normale, tout fonctionne vite, aucun décalage de connexion. Cependant, lorsque nous obtenons nos lourde jours de trafic (50k + visites), le site rampe et il faut 30 secondes + pour récupérer le contenu de Apache.

Le site est en cours d'exécution sur le moteur d'expression (CMS) (en PHP) et j'ai suivi leur guide d'optimisation de la charte. J'ai googlé et j'ai suivi assez de quelques-uns là-bas pour Apache avec une chance, obtenez-la à l'endroit où il est maintenant, mais j'ai besoin d'obtenir des temps de réponse constants.

Je suppose que cela est différent de la question "Optimiser pour la mémoire faible" ici, car j'en ai assez RAM (pour ce que j'essaie de faire), j'ai juste besoin d'obtenir le serveur étrangler sous charge lourde.

Des recommandations?

17
Parrots

Pour PHP Il y a 2 choses importantes qui augmenteront la capacité:

  1. Advanced PHP (APC) Comme mentionné. C'est ce que nous utilisons à Yahoo! Il existe d'autres projets similaires, mais celui-ci est le bébé de Rasmus.
  2. fastcgi au lieu de mod_php. Il y a un débat sur cette question car Mod_PHP est généralement le plus rapide. Cependant, je supposerais que vous avez un seul serveur Apache fournissant à la fois dynamique PHP et actifs statiques (JS, CSS, Flash, images, PDF, etc.). Les demandes de ces actifs statiques N'ayez pas besoin de consommer autant de mémoire, mais parce que PHP est un module dans tous les fils Apache.

Pour Apache:

  1. Utiliser Worker MPM
  2. Activer Keepalive

Vous pouvez également aller jusqu'à prendre pour envisager de passer d'Apache à Lightpd , ou nginx . J'aime Apache. J'utilise le fou de nombreuses fonctionnalités avancées. J'accepte ses frais généraux parce que j'ai besoin de ce qu'il offre. Pour la pile commune de la lampe, il est plus que nécessaire et un gaspillage de ressources.

Pour MySQL:

  1. Vos efforts d'optimisation vont payer 10 fois lorsqu'il est passé à analyser et à corriger les requêtes, au lieu de modifier vos valeurs My.cnf. Je ne dis pas qu'il n'est pas important d'obtenir votre mise en cache, vos connexions, etc. Correct ... mais pour la plupart des gens, ce n'est que 9% du problème.
  2. Pendant votre QA, allumez le journal de requête générale sur votre stadification/Dev MySQLD pour capturer toutes les requêtes envoyées. (Ne faites pas cela sur votre serveur de production MySQL!)
  3. Utilisez [~ # ~] expliquer [~ # ~ ~] Pour analyser les requêtes. Surtout si vous utilisez un cadre avec un orme (abstraites loin de la base de données et vous empêche de rédiger votre propre SQL), vous devrez nettoyer les jointures extrêmes, sélectionne sans autre clause, commandez des parts qui induisent "Utilisation de Filtrice" et des requêtes. qui n'utilisent aucun index.
  4. Si vous utilisez MySQL 5.1 Profitez du profileur de requête .

D'autres outils qui méritent d'être envisagés sont MK-Visual-Expliquez

J'ai cité 10 bonnes références. Ces choses devraient vous faire bourdonner. S'il vous plaît nous permet de savoir comment il s'avère.

18
Bruno Bronosky

Déplacez votre PHP fichier de session sur a TMPFS, utilisez APC (ou autre) et supprimez tout PHP modules que vous n'avez pas besoin. Supprimer Tout Modules Apache Vous n'avez pas besoin/utilisation.

Pour créer un TMPFS (un répertoire en RAM!)

mkdir /tmpfs; chmod 777 /tmpfs
mount -t tmpfs -o size=256M tmpfs /tmpfs

Dans / etc/fstab Ajoutez la ligne ci-dessous pour le créer sur le redémarrage!

tmpfs     /tmpfs    tmpfs   size=256m,mode=0777    0       0

Dans / etc/apache2/php.ini Ajustez pour stocker vos sessions dans RAM (TMPFS)!

session.save_handler = files
session.save_path = "/tmpfs"

Remarque: avec votre PHP et fichiers de session in RAM vous touchez à peine le disque!

Utilisez expire_module à Apache afin que les navigateurs se cachent la plupart des choses.

ExpiresActive On
ExpiresDefault "access plus 90 days"
ExpiresByType image/gif "access plus 90 days"
ExpiresByType image/ico "access plus 90 days"
ExpiresByType image/png "access plus 90 days"
ExpiresByType image/jpeg "access plus 90 days"
ExpiresByType image/x-icon "access plus 90 days"
ExpiresByType text/css "Access plus 90 days"
ExpiresByType text/html "Access plus 90 days"
ExpiresByType application/x-shockwave-flash "Access plus 90 days"
ExpiresByType application/x-javascript "Access plus 90 days"

N'utilisez pas .htaccess fichiers! Au lieu de cela, les codes durs dans le fichier de configuration de Vhost! Éliminer/réduire considérablement les chèques de disque par toutes les demandes HTTP ... Cela ajoute vraiment.

Options FollowSymLinks 
AllowOverride None

Exemple de .htaccess utilisé dans votre fichier vhost.conf ...

<Directory /home/user/www/site.com/secure>
    Order Allow,Deny
    Deny from All
</Directory>
6
Nulled

Couple de choses viennent à l'esprit.

Le cache OPCODE est toujours une bonne idée. Je préfère http://eaccelerator.net/ sur APC. Si vous ne développez pas avec APC en cours de route, essayez de l'ajouter est presque toujours douloureux. EACCELERATEUR Bien que la fantaisie semble simplement fonctionner.

Un proxy inverse est également une bonne idée, mais vous devez regarder RAM Utilisation. Je trouve Apache 2.2 avec le travailleur MPM pour occuper une quantité juste de RAM = sur c'est propre. Dans votre cas, je recommanderais quelque chose de briquet comme Nginx et exécutez Apache avec PHP comme FastCGI ou simplement le laisser comme selon le processus. L'idée avec l'utilisation de vernis, calmar, nginx, etc est de les faire servir de contenu statique, de traiter les connexions utilisateur et uniquement de passer PHP Demandes à Apache que vous traitez en tant que serveur d'applications.

Si vous exécutez une version assez récente de MySQL 5.1, comme au moins 5.1.24, vous avez maintenant accès à une sous-deuxième journaux lents. Je démarrerais long_query_time à 1 ou 2 puis le ramène à 0,5 lorsque vous obtenez une poignée sur les très longs. Il y a aussi beaucoup d'informations générales de réglage sur le Net pour MySQL, mais vous n'avez pas le RAM = faire beaucoup. Avez-vous augmenté l'un des paramètres de défaut? MOS DEFAULT MY.CNF Les fichiers sont configurés pour utiliser environ 64 Mo de RAM. C'est le moins que je soutiens la clé_buffer de 16 Mo à 64 Mo.

En outre, utilisez-vous des tables MyISAM ou INNODB? Si vous gardez la session dans la DB, vous voudrez modifier la table de session en InnoDB (ou le faire cookie à la place) plutôt que de la laisser une table mysiam qui le verrouille de niveau de table plutôt que le verrouillage du niveau de rangée. Fondamentalement, toute table de plus de 20% d'écriture à 80% est un candidat pour passer à InnoDB. N'oubliez pas que vous aurez besoin d'équilibrer la quantité de RAM entre les tables MyISAM et les tables InnoDB car les tampons pour chacun sont configurés séparément.

Et enfin un autre autre de 512 Mo de RAM J'irais un long chemin dans votre configuration ou même un autre VPS de 512 Mo de 512 Mo pour exécuter MySQL dans si c'est moins cher ou à peu près le même prix. Je me pencherais réellement vers une seconde instance. Parce que ça va doubler le disque disponible io. L'un des problèmes avec les serveurs VPS est votre IO n'est pas protégé des autres personnes sur le même serveur physique.

Hmmm mon message Tout Sorta ScatTrailahed, mais vous donne beaucoup d'endroits à regarder. Bonne chance.

5
kashani
  • Utilisez un cache OPCODE pour PHP comme APC.
  • Utilisez un accélérateur HTTP comme le calmail ou le vernis.
2
wittwerch

Au-delà des grandes suggestions ici, il convient de noter que tous les VPS "ne sont pas créés égaux. Dans mon expérience PHP s'est avéré être un processeur lourd.

A Wordpress AB Benchmark (AB -N 500 -C 25 http://domain.com/index.php ) de nginx/apc/phpfpm/mysql (local ) Sur l'EC2 a entraîné environ 2 demandes/seconde au niveau de leur entrée "2GB RAM/1 Compute Unit Server".

Le même point de référence exécuté contre la même pile exact (déployé par le script sur un système d'exploitation identique) sur un cloudser de 312 Mo de racksServer retourne ~ 80 req/seconde. Donc, 4 fois moins de RAM, 40x performances dans cette expérience rudimentaire.

Affichage du haut pendant l'AB, vous voyez que EC2 ne pouvait tout simplement pas gérer la concurrence et touchera immédiatement 100% de la charge de la CPU et verrouillait. Affichage du haut sur le serveur de 512 Mo (CPU quadrial virtualisé) fréquentant la même référence, les cœurs toucheraient environ 60% de charge et manipulaient sans heurts la référence.

Les VPS sont extrêmement faciles à tourner et à désactiver sans engagement, il ne fait pas de mal de mettre l'infrastructure que votre VP/VPS réside dans le test!

Modifier 1: En outre, le "High CPU" de EC2 n'a également été capable de produire ~ 10/req deuxièmement, avec la CPU étant toujours le goulot d'étranglement. Ma conclusion était que vous sacrifiez la performance de la stabilité/de la robustesse avec les EC2, et il existe bien sûr de nombreux cas d'utilisation appelant un tel environnement.

1
iainlbc

Dans une situation de mémoire basse (512 Mo est faible, pour un serveur de trafic élevé), il convient de prendre en compte votre choix de serveur Web et de DB Moteur.

LightTP est plus léger hors de la boîte que Apache peut généralement être fabriqué après de nombreuses modifications, et il y a des options plus légères que cela même. Ceci n'est évidemment pas possible s'il ya des fonctionnalités Apache que vous dépendez de cela ne supporte pas d'autres serveurs.

sQLite est beaucoup plus serré que MySQL et plus vite dans de nombreuses conditions. Vérifiez si le moteur que vous utilisez prend en charge cela aussi bien que et si cela lui donne un essai.

L'autre option, l'option facile, est d'obtenir plus RAM dans VM si vous pouvez vous le permettre.

1
David Spillett