Ho visto da vicino il consumo di memoria di Wordpress. Sul mio sito, sembra che per ogni pagina colpita vengano allocati 20 MB di RAM, solo per preparare un ambiente confortevole per l'esecuzione di tutti i plug-in.
Non esiste un singolo punto da ottimizzare, nessun singolo cattivo che mangia la maggior parte della memoria. Il consumo è distribuito su molti molti molti moduli php.
Come possiamo fare in modo che Wordpress inizializzi il suo ambiente in memoria solo una volta, e poi riutilizzalo più volte per ogni hit? Non voglio che PHP lento consumi 20 MB a ogni clic dell'utente - anche su un server con molta memoria, ci vogliono pochi secondi per fare tutto quel lavoro. Avresti sostanzialmente bisogno di blocchi di memoria di sola lettura che possono essere riutilizzati.
Inoltre ... perché 20 MB? Qualcuno può fornire spunti in questo?
Modifica: ecco l'output di WinCacheGrind su Wordpress in esecuzione sul mio computer di sviluppo (molto più veloce dell'hosting condiviso). Come puoi vedere, ci vuole un secondo di scricchiolio solo per produrre l'HTML della pagina principale. Rallenta l'hosting condiviso e hai una ricetta per i problemi. Ho scelto il metodo che richiede la maggior parte del tempo. Come vorresti ottimizzare questo?
Modifica: ecco le statistiche delle query da questo fantastico strumento di profilazione di Functions.php .
Caricamento: 12 query - 532 ms - 19,1 MB - 43 hit della cache / 53 Query: 15 query - 563 ms - 19,0 MB - 72 hit della cache / 86 Display: 21 query - 705 ms - 19,2 MB - 234 riscontri cache / 257
Modifica: vuoi vedere qualcosa garantito per farti impazzire? Inserisci queste righe alla fine di index.php:
echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";
Ho provato a contare quante volte il corpo del post corrente è archiviato nella memoria. Ho contato 20 casi. Poi ho capito che PHP ha il conteggio dei riferimenti, quindi la quantità di copie ridotta a soli tre: due sembrano essere in WP_Query, uno nella cache degli oggetti. Sto indagando ulteriormente.
Questo è il motivo per cui penso che WordPress abbia bisogno di refactoring mirato ai problemi di memoria. Non puoi più incolpare il suo consumo di memoria sulla pura complessità di ciò che fa. Fa semplicemente un sacco di cose sbagliate .
Modifica: dopo una giornata di tentativi per capirlo, ecco i miei risultati:
1) L'88% di tutta la memoria proviene dal tipo di chiamate richiesto o incluso o include_once:
2) Il file php include si verifica principalmente durante la prima parte di servire una richiesta (non a caso), che è anche dove tutta la memoria viene consumata:
3) È abbastanza interessante tracciare tutte le funzioni che vengono eseguite durante una richiesta. Ci sono oltre 12000 chiamate in totale. Li ho agitati per renderlo più visibile (l'asse Level è sostanzialmente la profondità di pila):
4) L'unica strada che mi viene in mente è minimizzare la quantità di file .php inclusi. Se divido le funzioni per file da cui provengono, puoi vedere che molti file vengono colpiti una o due volte al massimo. Abbiamo bisogno di un modo per saltare quelli quando non sono necessari. Ad esempio, il mio plug-in di backup del database remoto viene caricato e registrato, per non essere mai utilizzato. Ecco la trama sopra divisa per nome file:
Offro una taglia degna di tutta la mia reputazione :) per i refactoring che porterebbero a ridurre il footprint di memoria dei miei blog del 30% o più.
Modifica: ho installato WP 3.1, ecco il confronto con la vecchia versione.
Il blu è WP 3.1, il rosso è 3.0.4. Il nuovo WP è più veloce, ma consuma anche più memoria.
Ecco un elenco per includere file.
Questo mi permette di capire quanta memoria viene consumata da "All In One SEO pack" - una strada sarebbe quella di utilizzare solo una frazione delle funzionalità del plugin per ottenere ciò che voglio. Inoltre, i miei plugin sembrano essere piuttosto male.
Vorrei provare il caricamento condizionale, ad esempio comment.php (non autorizzo commenti sul mio blog) e molti altri. Ho eliminato tutto il codice obsoleto. Ho tagliato kses.php per caricare solo le sue tabelle globali su richiesta. Ho semplificato l10n (non faccio localizzazione), facendo in modo che le sue funzioni restituiscano immediatamente le stringhe, senza ricerche. Sono ancora lontano dal segno del 30% che ho impostato arbitrariamente.
Modifica: ho scaricato e abilitato APC con impostazioni predefinite (32 MB di cache del codice operativo). Ecco il confronto:
Puoi vedere che il caricamento del codice ha subito un'enorme accelerazione e che il codice occupa anche meno spazio in memoria (probabilmente perché abbiamo a che fare solo con i codici operativi, non con l'origine originale). Il consumo di memoria è comunque ancora piuttosto elevato.