Рефакторинг Wordpress для підвищення продуктивності пам'яті [закрито]


63

Я уважно ознайомився зі споживанням пам'яті Wordpress. На моєму сайті, здається, що на кожне звернення до сторінки виділяється 20 Мб оперативної пам’яті, просто підготувати зручне середовище для запуску всіх плагінів. Я склав це так:

Не існує жодного місця для оптимізації, немає жодного поганого хлопця, який їсть більшу частину пам'яті. Все споживання поширюється на багато-багато багатьох модулів PHP.

Як ми можемо змусити Wordpress ініціалізувати своє середовище в пам’яті лише один раз, а потім повторно використовувати його для кожного звернення? Я не хочу, щоб повільний PHP їв 20 Мб при кожному натисканні користувача - навіть на сервері з великою кількістю пам’яті потрібні секунди, щоб виконати всю цю роботу. В основному вам потрібні шматки пам’яті лише для читання, які можна використовувати повторно.

Також ... чому 20 Мб? Чи може хтось дати зрозуміти це?

Редагувати: Ось результат виходу WinCacheGrind на Wordpress, який працює на моїй розробній машині (набагато швидше, ніж на спільному хостингу). Як бачимо, для отримання HTML-адреси основної сторінки потрібна секунда розчавлення. Уповільнити це шляхом спільного хостингу, і у вас є рецепт проблем. Я вибрав метод, який займає більшу частину часу. Як би ви вирішили оптимізувати це?

Редагувати: Ось статистика запитів із цього фантастичного інструменту для профілювання function.php .

Завантаження: 12 запитів - 532 мс - 19,1 МБ - 43 звернення в кеш / 53
Запит: 15 запитів - 563ms - 19.0MB - 72 хіти кешу / 86
Відображення: 21 запит - 705 мс - 19,2 МБ - 234 хіти кешу / 257

Редагувати: Ви хочете побачити щось гарантоване, яке б вас змусило? Вставте ці рядки в кінці index.php:


echo "<pre>\n";
print_r(get_defined_vars());
echo "</pre>\n";

Я намагався підрахувати, скільки разів зберігається тіло поточної публікації в пам'яті. Я нарахував 20 екземплярів. Тоді я зрозумів, що PHP має підрахунок посилань, тому кількість копій зменшилася до трьох: дві, здається, є в WP_Query, одна - в об'єктному кеші. Я розслідую далі.

Тому я вважаю, що WordPress потребує рефакторингу, спрямованої на проблеми пам'яті. Ви більше не можете звинувачувати його споживання у великій складності того, що він робить. Це просто робить купу речей не так .

Редагувати: Після дня спроби розібратися в цьому, ось мої висновки:

1) 88% усієї пам’яті надходить з вимагають або включають або включають_once тип дзвінків:

2) Файл php включає в себе трапляються в основному під час першої частини подання запиту (не дивно), де також з'їдається вся пам'ять:

3) Досить цікаво побудувати всі функції, які виконуються під час подання запиту. Всього понад 12000 дзвінків. Я стрибав їх, щоб зробити його більш помітним (вісь рівня - це в основному глибина стека):

4) Єдиний шлях вперед, про який я можу подумати - це мінімізація кількості включених .php файлів. Якщо я розділити функції на файл, з якого вони вийшли, ви можете побачити, що багато файлів потрапляють максимум один або два рази. Нам потрібен спосіб, як пропустити тих, коли вони не потрібні. Наприклад, мій плагін для віддаленого резервного копіювання бази даних завантажується та реєструється, просто ніколи його не використовувати. Ось наведений вище сюжет, розділений на ім'я файлу:

Я пропоную винагороду, вартую всієї своєї репутації :) за оновлення, які призведуть до скорочення пам’яті моїх блогів на 30% або більше.

Редагувати: я встановив WP 3.1, ось порівняння зі старою версією.

Синій - WP 3.1, червоний - 3.0.4. Нова WP швидша, але також їсть більше пам’яті.

Ось список за включенням файлу.

Це дозволить мені зрозуміти, скільки пам’яті споживає «Все в одному SEO-пакеті» - одна дорога буде використовувати лише частину функціональності плагіна, щоб отримати те, що я хочу. Також мої власні плагіни здаються досить поганими.

Я хотів би спробувати умовне завантаження, наприклад, comment.php (я забороняю коментарі на своєму блозі) та декількох інших. Я видалив увесь застарілий код. Я обрізав kses.php, щоб тільки завантажувати його глобальні таблиці за запитом. Я спростив l10n (я не роблю локалізації), змушуючи його функції повертати рядки відразу, без пошуку. Я ще далекий від 30% позначки, яку я довільно встановив.

Редагувати: я завантажив і ввімкнув APC із налаштуваннями за замовчуванням (32 Мб кешу опкоду). Ось порівняння:

Ви можете бачити, що завантаження коду прискорилося масово, і код також займає менше місця в пам’яті (можливо, тому, що ми маємо справу саме з опкодами, а не з оригінальним джерелом). Однак споживання пам'яті все ще досить високе.


Не могли б ви десь завантажити сам файл cachegrind? Тільки зауважте, що я не пам'ятаю, якщо в нього включено щось, що варто зберігати приватне, якщо є - тоді не робити.
Рарст

@Rarst Це повинно бути добре. foxloft.com/files/mbala/cachegrind.out
Роман Зенка

1
хм, я згоден з вашим висновком - нічого насправді не вискакує, просячи виправити. Я скинув свіжий профіль на свій локальний тестовий стек (3.1, MS, двадцять десять, дані тестового модуля) та отримав 1,5s (велика різниця здається через користувацьке меню - справа slooow). Тож я гадаю, що нічого не виправити = кешування досліджень.
Рарст

@Rarst Дякую вам дуже за допомогу. Я думаю, що є щось для виправлення, але це потребує зміни архітектури Wordpress на якусь зовсім іншу філософію, і це надто багато роботи.
Роман Зенька

Відповіді:


25

Не варто біди. WordPress не їсть багато пам'яті просто тому, що. Він їсть багато пам’яті, тому що він працює багато функціоналу під кришкою.

Набагато простіше та ефективніше кешувати результати (створені сторінки) за допомогою статичного плагіну кешу та служити цьому. Таким чином більшість відвідувачів навіть не потраплять на WP.


2
Я вже використовую кеш, але у мене все ще є кілька сторінок, які мають справді динамічний характер (наприклад, кошик для покупок). І коли зірки не розташовані правильно, користувач може чекати 20 секунд - тобто, надано, на GoDaddy, але навіть якщо ні, я думаю, це було б принаймні 3 секунди. Я просто не можу надати справді спритний досвід, до якого люди звикли від Google.
Роман Зенка,

8
@Roman Zenka, якщо у вас є конкретні потреби в продуктивності, тоді вам краще шукати конкретні рішення, а не сподіватися, що сам WordPress магічно стане надшвидким і легким на ресурси. Перші речі, які я б запропонував переглянути, - це кеш-код коду і фрагмент статичного кешування ... Але перед цим вам потрібно порівняти хек з нього і визначити не тільки куди йде пам’ять, але і де витрачається час. WordPress - це середовище, а не вузьке місце. Пляшка - це те, що ти змушуєш це робити.
Рарст

@Rarst Я фактично зробив орієнтир використання процесора, і я не можу вказати пальцем на якесь конкретне місце, яке спричинить проблеми. Схожа на пам’ять - вона, здається, поширюється всюди. Однак моє тестування може бути виконано не оптимально - я використовую XDebug-провідник і Cachegrind - наприклад, досить важко розірвати затримку через дзвінки до бази даних. Буду вдячний покажчикам на кращі методи профілювання.
Роман Зенька

Додано скріншот @Rarst Profiling.
Роман Зенька,

4
Можливо, сервери GoDaddy можуть бути повільними. Вони відомі тим, що не володіють найбільшим обладнанням, і " скоріше платять за телевізійну рекламу, ніж оновлюють свої сервери "
Зак

23

І саме тому я вважаю, що WordPress дуже потребує переписування. Ви більше не можете звинувачувати його споживання у великій складності того, що він робить. Він просто робить не так.

Який наївний висновок. Прочитайте речі, які ви ніколи не повинні робити, перша частина .

Дякую за графіки використання пам'яті.

Набагато пізніше редагуйте: Autommatic випустив бібліотеку під назвою prefork, яка, здається, робить те, що ви просите: завантажуючи код WordPress в оперативну пам'ять лише один раз.


Щоправда, це наївно. Можливо, я мав би сказати «рефактор» замість «переписати», тоді це звучить набагато краще. Публікація оновлена.
Роман Зенька

2
Гаразд, якщо у вас є конкретні пропозиції (особливо патчі), ви можете опублікувати їх на trac: core.trac.wordpress.org
scribu

Я над цим працюю зараз. Я намагаюся побудувати в пам’яті карту об’єктів, тож я можу побачити, наскільки використовується чим. Чи є інструмент, який би прийняв дамп пам'яті та побудував його?
Роман Зенька

5
@scribu - +1 для посилання на пост Джоела!
MikeSchinkel

1
Гаразд, майте на увазі, що WP_Object_Cache можна замінити на
запам’ятовану

17

Починаючи з WordPress 3.2, PHP 5.2 стане мінімальною вимогою. Я думаю, що при цьому під нашими поясами, біти ядра можуть почати реструктуруватись і використовувати класи з автоматичним завантаженням. Це дозволить нам уникати завантаження деяких фрагментів коду, якщо вони насправді не потрібні. Наприклад, якщо в перегляді сторінки не було вбудовування або галереї, ми можемо уникнути завантаження багатьох медіа-кодів.

Однак, навіть якщо вони вирішать піти цим маршрутом, я б очікував, що це буде повільна еволюція (як і більшість інших змін, що відбулися під капотом). Знадобиться перетасування місця розташування безлічі файлів і коду, що, можливо, може зламати зворотний компат для деяких плагінів.

Частина проблеми (якщо це справді можна так назвати) полягає в тому, що без такого умовного завантаження основна рамка не може заздалегідь знати, яка функціональність вона буде потрібна чи не потрібна для створення перегляду вмісту. Тому багато функцій доведеться завантажувати на всякий випадок, якщо вони знадобляться.


@Dougal Campbell Я розпочав щедро це питання, щоб побачити, чи можемо ми зламати хоча б цей один екземпляр WordPress, щоб отримати принаймні 30% покращення споживання пам'яті зараз, порівняно безболісно. Це може надихнути на деякий розвиток у майбутньому.
Роман Зенька

Умовне завантаження, хоча потенційно зменшує витрату пам’яті, шкодить швидкості, коли задіяно кешування опкоду . Ми схильні віддавати швидкість.
scribu

Більше думок про автозавантаження: stackoverflow.com/questions/4788452 / ...
scribu

@scribu Коли ви говорите "умовне завантаження", ви говорите про автоматичне завантаження чи фактично завантаження коду на основі умови? Наскільки це шкодить швидкості?
Роман Зенька

1
Дякую! Як я вже говорив, я не знаю, чи буде ядро ​​WP коли-небудь піти цим маршрутом (необхідний рефакторинг може бути занадто екстремальним). Але мене дуже вразили зусилля, які ви доклали до аналізу цього, та створені вами графіки. Продовжуй гарно працювати!
Дугал Кемпбелл

16

Як ми можемо змусити Wordpress ініціалізувати своє середовище в пам’яті лише один раз, а потім повторно використовувати його для кожного звернення?

Це називається кешуванням опкодів.

http://en.wikipedia.org/wiki/PHP_accelerator


1
Я збираюся спробувати APC і подивитися, що відбувається. Коли я спочатку задав це питання, я мав на увазі більше, ніж просто кешування коду - я мав на увазі повторне використання всього середовища, яке створює WordPress - код + дані. Memcached допоможе отримати дані швидше, але ви все одно будете клонувати дані в пам'яті сервера. Зараз здається, що кешування опкоду потенційно може забезпечити ~ 90% всього споживання пам'яті.
Роман Зенька

Якщо у вас є ресурси для деяких експериментів, ви також можете спробувати створити середовище FastCGI. Мені було б дуже цікаво порівняння між mod_php та запуском під FastCGI.
Дугал Кемпбелл

5

вам, ймовірно, не вдасться настільки скоротити використання барана. Але якщо ви використовуєте mod_php, ви можете mod_fcgidзамість цього перейти .

в той час як mod_php трохи повільніше, він завантажує php навіть тоді, коли цього не потрібно, наприклад, подачі зображень, статичних файлів або навіть кешування. Якщо у вас багато запитів, це багато барана.

використання fcgid зменшить це значно.

Крім того , з допомогою статичного кеша (як w3total кеш) буде уникати виклику PHP взагалі , який є дійсно великою перевагою: використовувати менше оперативної пам'яті, менше з'єднань дБ.


4

Ха. Я працюю над веб-додатком зараз, коли я повністю маю намір перевантажувати дані та використання понад те, що може працювати мій обліковий запис спільного хостингу, тому я вирішив - хоча це було б дуже просто створити в WP - спробувати працювати з BackPress як рамки і створювати лише те, що мені потрібно для моїх конкретних випадків використання.

Тож я зміг скоротити своє основне середовище із сотень PHP-файлів у WP до лише двадцяти або близько того, що мені насправді потрібно, при цьому все ще в змозі використовувати всі db, HTTP, керування користувачами, форматування та cron функції, які я люблю в WordPress.

Проблема полягає в тому, що її багато працює, і я ніколи не довіряв би моєму хак-джею за що-небудь, крім власного особистого використання. Якщо ви хочете використовувати повне середовище WP, прийміть його таким, яким він є. Це настільки ж добре, як це через те, що сотні розробників доопрацьовували його протягом декількох років. Як і всі, хто тут сказав, ви отримаєте набагато далі, знайшовши кращий план хостингу та вивчаючи методи кешування, ніж ви, швидше за все, отримаєте, зламавши ядро.


1
Я погоджуюся, що WP давно налаштовується. Але я не думаю, що це було налагоджено для роботи над шаленим хостингом із певною сумішшю плагінів. Мені цікаво бачити, наскільки далеко я можу її натиснути. Навіть якщо зміни не перетворять його в ядро, добре мати документально підтверджений спосіб злому ядра, якщо ви вважаєте, що це потрібно.
Роман Зенька

3

Так, WordPress завантажує все спочатку, а потім робить те, що ми просимо. Я десь пригадую, що ми можемо створити віртуальний пул в оперативній пам’яті, куди ми можемо помістити файли. У мене виникла ідея помістити весь WordPress в пам'ять (<10 МБ), і тоді ми зможемо заощадити багато вводу-виводу, який поодинці повинен збільшити швидкість. Але я ніколи не мав шансу спробувати це, і більше того, я не дуже досвідчений у здійсненні чогось подібного. Але, схоже, варто спробувати.


І я погоджуюся з Rarst використовувати плагін статичного кешу, щоб взагалі не проводилася обробка. Але це можна використовувати і з хорошою динамікою. :)
Ashfame

Мені подобається ця ідея. Я не впевнений, наскільки ця проблема пов’язана із затримками вводу-виводу, а наскільки PHP повільно пережовує дані. Ви знаєте спосіб, як сказати?
Роман Зенька

Вибачте його просто ідею в моїй голові. Можливо, це не впливає на ефективність того, що багато чого, що може здатися, дані, як правило, читаються з жорсткого диска як блоки, тому багато інших необхідних даних, можливо, вже отримано. Я не надто впевнений.
Ашфаме

3

кілька основних пропозицій:

  1. w3 загальний плагін кешу для кешування ..
  2. встановіть та ввімкніть memcache, а також увімкніть із загальних параметрів кешу w3 (кеш опкод теж хороший варіант, але він не іде добре із загальним плагіном кеша w3)
  3. мінімізувати запити до прямих посилань у файлах тем ..
  4. Вимкніть всі додаткові невикористані плагіни та видаліть.
  5. оптимізувати базу даних.

Я запускаю відомий сайт WordPress із величезним трафіком щодня.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.