J'ai examiné de près la consommation de mémoire Wordpress. Sur mon site, il semble que pour chaque page consultée, 20 Mo de RAM soient alloués, afin de préparer un environnement confortable pour l'exécution de tous les plug-ins. Je l'ai tracé ainsi:
Il n'y a pas de point unique à optimiser, pas de méchant qui mange la plus grande partie de la mémoire. La consommation est répartie sur de nombreux modules php.
Comment pouvons-nous obliger Wordpress à initialiser son environnement en mémoire une seule fois, puis à le réutiliser plusieurs fois pour chaque résultat? Je ne veux pas que PHP lent consomme 20 Mo à chaque clic d'utilisateur - même sur un serveur disposant de beaucoup de mémoire, il faut quelques secondes pour que tout ce travail soit effectué. Vous auriez essentiellement besoin de morceaux de mémoire en lecture seule pouvant être réutilisés.
Aussi ... pourquoi 20MB? Quelqu'un peut-il donner un aperçu de cela?
Edit: Voici la sortie WinCacheGrind sur le Wordpress en cours d’exécution sur ma machine de développement (beaucoup plus rapide que l’hébergement partagé). Comme vous pouvez le constater, il faut une seconde de travail pour produire le code HTML de la page principale. Ralentissez en hébergeant un hébergement partagé et vous aurez la recette du problème. J'ai choisi la méthode qui prend le plus de temps. Comment vous y prendriez-vous pour l'optimiser?
Edit: Voici les statistiques de requête de ce fantastique outil de profil functions.php .
Charge: 12 requêtes - 532 ms - 19,1 Mo - 43 occurrences dans le cache/53 Requête: 15 requêtes - 563 ms - 19,0 Mo - 72 occultations dans le cache/86 Afficher: 21 requêtes - 705ms - 19,2Mo - 234 résultats de cache/257
Edit: Voulez-vous voir quelque chose qui vous garantira la panique? Insérer ces lignes à la fin de index.php:
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
J'ai essayé de compter combien de fois le corps de la publication actuelle est enregistré dans la mémoire. J'ai compté 20 instances. Ensuite, j'ai réalisé que PHP avait un comptage de références. Le nombre de copies a donc été réduit à trois: deux semblent être dans WP_Query et un dans le cache d'objets. J'enquête plus loin.
C'est pourquoi je pense que WordPress a besoin d'un refactoring ciblant les problèmes de mémoire. Vous ne pouvez plus imputer sa consommation de mémoire à la complexité de son travail. Il fait simplement un tas de choses faux .
Edit: Après une journée passée à essayer de comprendre cela, voici mes conclusions:
1) 88% de la mémoire provient de types d'appels require, include ou include_once:
2) Les fichiers php inclus se produisent principalement pendant la première partie du traitement d'une requête (ce qui n'est pas surprenant), c'est également l'endroit où toute la mémoire est consommée:
3) Il est assez intéressant de tracer toutes les fonctions en cours d'exécution lors d'une requête. Il y a plus de 12 000 appels au total. Je les ai secoués pour les rendre plus visibles (l'axe Level est essentiellement la profondeur de l'empilement):
4) Le seul moyen d'avancer auquel je puisse penser est de minimiser le nombre de fichiers .php inclus. Si je divise les fonctions par fichier, vous pouvez voir que de nombreux fichiers sont consultés une ou deux fois au plus. Nous avons besoin d'un moyen de les éviter quand ils ne sont pas nécessaires. Par exemple, mon plug-in de sauvegarde de base de données distante est chargé et enregistré, juste pour ne jamais être utilisé du tout. Voici le tracé ci-dessus divisé par nom de fichier:
J'offre une prime qui vaut toute ma réputation :) pour des modifications qui conduiraient à une réduction de 30% ou plus de la mémoire de mes blogs.
Edit: J'ai installé WP 3.1, voici une comparaison avec l'ancienne version.
Le bleu est WP 3.1, le rouge est 3.0.4. Le nouveau WP est plus rapide, mais consomme également plus de mémoire.
Voici une liste par fichier d'inclusion.
Cela me permet de comprendre à quel point "All In One SEO Pack" consomme de la mémoire. Une solution serait d'utiliser une fraction des fonctionnalités du plugin pour obtenir ce que je veux. De plus, mes propres plugins semblent être assez mauvais.
Je voudrais essayer le chargement conditionnel, par exemple. comment.php (j'autorise les commentaires sur mon blog) et plusieurs autres. J'ai supprimé tout le code obsolète. J'ai réduit kses.php pour ne charger que ses tables globales à la demande. J'ai simplifié l10n (je ne fais pas de localisation), rendant ses fonctions renvoyer les chaînes immédiatement, sans recherches. Je suis encore loin des 30% que j'ai arbitrairement établis.
Edit: J'ai téléchargé et activé APC avec les paramètres par défaut (32 Mo de cache opcode). Voici la comparaison:
Vous pouvez voir que le chargement du code s’est considérablement accéléré et que le code prend moins d’espace en mémoire (probablement parce que nous ne traitons que des opcodes et non de la source originale). La consommation de mémoire est cependant encore assez élevée.
Ne vaut pas la peine. WordPress ne consomme pas beaucoup de mémoire simplement parce que. Il consomme beaucoup de mémoire car il exécute beaucoup de fonctionnalités sous le capot.
Il est beaucoup plus facile et efficace de mettre en cache les résultats (page générée) avec le plugin cache statique et de les diffuser. De cette façon, la plupart des visiteurs ne toucheront même pas WP.
Et c’est la raison pour laquelle je pense que WordPress a sérieusement besoin d’une réécriture. Vous ne pouvez plus imputer sa consommation de mémoire à la complexité de son travail. Il fait simplement les choses mal.
Quelle conclusion naïve. Lire Ce que vous ne devriez jamais faire, Partie I .
Merci pour les parcelles d'utilisation de la mémoire, cependant.
Beaucoup plus tard, éditez: Autommatic a publié une bibliothèque appelée prefork qui semble faire ce que vous demandez: charger le code WordPress dans RAM une seule fois.
À partir de WordPress 3.2, PHP 5.2 sera la configuration minimale requise. Je pense qu'avec ce qui se passe sous notre ceinture, des fragments du noyau peuvent commencer à être restructurés et à utiliser des classes avec chargement automatique. Cela nous éviterait de charger des morceaux de code à moins qu'ils ne soient réellement nécessaires. Par exemple, si aucune page ne contient d'incorporation ou de galerie, nous pourrions peut-être éviter de charger une grande partie du code multimédia.
Cependant, même s'ils décidaient de suivre cette voie, je m'attendrais à ce qu'il s'agisse d'une évolution lente (comme la plupart des autres changements imprévus qui se sont produits). Cela nécessiterait de mélanger l'emplacement de beaucoup de fichiers et de codes, ce qui risquerait de faire basculer la compatibilité en arrière pour certains plugins.
Une partie du problème (si on peut vraiment l'appeler ainsi) réside dans le fait que sans ce type de chargement conditionnel, le cadre de base ne peut pas savoir à l'avance quelle fonctionnalité il aura besoin ou non pour générer la vue du contenu. Donc, beaucoup de fonctions doivent être chargées juste au cas où elles sont nécessaires.
Comment pouvons-nous obliger Wordpress à initialiser son environnement en mémoire une seule fois, puis à le réutiliser plusieurs fois pour chaque résultat?
C'est ce qu'on appelle la mise en cache opcode.
vous ne réussirez probablement pas à réduire autant l’utilisation de la RAM. Mais si vous utilisez mod_php
, vous voudrez peut-être passer à mod_fcgid
à la place.
bien que mod_php soit légèrement plus lent, il charge php même lorsqu'il n'en a pas besoin, comme le traitement d'images, de fichiers statiques ou même la mise en cache. Si vous avez beaucoup de demandes, c'est beaucoup de bélier.
utiliser fcgid réduira beaucoup cela.
de plus, l'utilisation d'un cache statique (comme le cache w3total) évitera d'appeler php du tout ce qui est un avantage considérable: moins d'utilisation de RAM, moins de connexions à la base de données.
Ha. Je travaille sur une application Web maintenant que je compte bien surcharger les données et les utilisations au-delà de ce que mon compte d'hébergement partagé peut gérer, alors j'ai décidé - alors qu'il aurait été très facile de construire WP - essayer de travailler à partir de BackPress en tant que cadre et de ne générer que ce dont j'avais besoin pour mes cas d'utilisation spécifiques.
J'ai donc pu réduire mon environnement principal des centaines de PHP fichiers de WP à la vingtaine dont j'ai réellement besoin, tout en continuant à exploiter tous les db, HTTP, gestion des utilisateurs, mise en forme et fonctions cron que j'aime beaucoup dans WordPress.
Le problème est que cela demande beaucoup de travail et que je ne ferais jamais confiance à mon travail pour rien au-delà de mon usage personnel. Si vous souhaitez utiliser tout l'environnement WP, prenez-le tel quel. C'est aussi bon que cela grâce à des centaines de développeurs qui l'ont peaufiné au cours de plusieurs années. Comme tout le monde l’a dit, vous irez beaucoup plus loin en trouvant un meilleur plan d’hébergement et en recherchant des techniques de mise en cache que vous ne le ferez probablement en piratant le noyau.
quelques suggestions de base:
je gère un site wordpress bien connu avec un trafic énorme tous les jours .. je ne suis pas sur dédié même, très bien pour moi :)
Oui, WordPress charge tout en premier, puis fait ce que nous lui demandons de faire. Je peux rappeler quelque part que nous pouvons créer un pool virtuel dans RAM où nous pouvons placer des fichiers. J'ai eu l'idée de mettre tout le WordPress en mémoire (<10 Mo) et nous pourrions économiser beaucoup d'E/S, ce qui seul devrait donner un coup d'accélérateur. Mais je n'ai jamais eu la chance de l'essayer et de plus, je ne suis pas vraiment compétent dans la poursuite de ce genre de chose. Mais ça a l'air d'essayer.