Скільки процесів слід вказати у WSGIDaemonProcess під час запуску Django через mod_wsgi?


23

Скажімо, у мене на одному вікні працює 2 сайти (Superuser та Serverfault) від власного віртуального хоста Apache. Дві сайти працюють від Django і працюють на Apache з mod-wsgi. Типовий файл конфігурації для одного із сайтів виглядатиме так:

WSGIDaemonProcess serverfault.com user=www-data group=www-data processes=5

Хост - це машина Linux з 4 Гб оперативної пам’яті під керуванням Ubuntu. Чи може хтось запропонувати кількість процесів, які я повинен вказати вище для своїх 2-х сайтів? Припустимо, вони мають той самий трафік, що і фактичні сайти Superuser та Serverfault.

Відповіді:


22

Ну, скільки трафіку мають фактичні сайти Superuser та Serverfault? Гіпотетики не дуже корисні, якщо вони не мають достатньо інформації, щоб полегшити відповідь ...

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

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

Дійсна верхня межа кількості процесів, які ви можете запустити на машині, продиктована верхньою кількістю пам'яті, яку займає кожен процес; спустіть один процес, а потім виконайте різні дії, які потребують пам'яті (ті, які отримують та обробляють багато даних, як правило) проти нього, реалістичним набором даних (якщо ви просто використовуєте набір даних про іграшки для тестування, скажімо, 50 або 100 рядків, то якщо одна з ваших дій витягує та маніпулює кожним рядком таблиці, це не буде хорошим вимірюванням, коли ця таблиця зростає до 10000 рядків), щоб побачити, до чого потрібні кулі для використання пам'яті. Ви можете штучно обмежувати використання пам’яті під час процесу за допомогою сценарію, який збирає працівників, які досягають певного порогу використання пам'яті, ризикуючи викликати неприємні проблеми, якщо встановити цей поріг занадто низький.

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

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

Ось ви, кількарічний досвід масштабування веб-сайтів, перероблених на одну невелику та просту SF посаду.


Ще один важливий фактор для кількості процесів / потоків - це тривалість обробки окремих запитів і загальний розподіл на всі можливі тривалості часу. Іншими словами, скільки запитів за один раз потрібно обробити, які займають більше, ніж середній час відповіді. Отже, це не так просто, як просто теоретичні запити / сек, оскільки вплив цих більш запущених запитів може бути значним і надмірно диктувати загальні параметри конфігурації. FWIW mod_wsgi 3.0 буде включати деякі вбудовані в збір статистики, щоб спробувати зафіксувати дані про це для сприяння налаштуванню.
Грем Дамплтон

@Graham: Прочитайте мою відповідь, я детально висвітлював це. Запити / сек - це лише зворотний час відповіді, і його простіше розділити на ціле число req / сек, ніж помножити на десяткове.
живіт

Ви не можете хоча б зосередитись лише на найгіршому випадку відповіді, а також не тільки на середньому для цього питання. Її потрібно зважувати способами, виходячи із відсотка запитів, що потрапляють у часові періоди, тобто, розподілу на всі можливі періоди часу. Якщо ви справді взяли час реакції на найгірший випадок, тоді ви поставили б нереальні вимоги. Проблема в тому, що насправді важко знати, яку формулу використовувати. Ось чому в mod_wsgi 3.0 буде збиратися вбудована статистика, яка вивчає використання потоку та на який відсоток за кількістю та часом, коли будь-яка кількість потоків використовується у будь-який час.
Грем Дамплтон

3
Проблема, мабуть, полягає в тому, що ви дивитесь на процеси лише там, де я переживаю, як нитки кожного процесу використовують фактор, і це не так просто. Іншими словами, директива WSGIDaemonProcess вказує на 5 процесів, де кожен процес за замовчуванням використовує 15 потоків. Скільки я читаю у вашому описі, це передбачає одинарні потокові процеси. Якщо ні, то вкажіть мені, як ваша модель обслуговує потоки, а також суперечки / масштабування навколо GIL. Отже, визначте, що ваш опис дійсний лише для однопотокових процесів, і я не буду сперечатися.
Грем Дамплтон

2
Чи не підхід "багатопотокова Apache + multiprocess-wsgi" найкращий варіант, поки ви не на 99% впевнені, що ваш код Python і всі залежності не є безпечними для потоків?
Томаш Зелінський

9

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

Немає багато матеріалу щодо встановлення різних випадків використання стосовно їх відповідної конфігурації mod_wsgi, тому я сподіваюся, що тут добре використовувати трохи прози.

A) CMS-сайти та мікросайти

Ми запускаємо декілька веб-сайтів клієнтів, більшість з яких в основному вміст-сайти або мікро-сайти, що розміщують Django CMS, деякі спеціальні форми, а іноді і селера для запланованих фонових завдань. Ці сайти не прагнуть ресурсів, декілька з них щасливо працюють паралельно на одному 4-ядерному Intel Xeon з 32 ГБ оперативної пам’яті. Ось конфігурація, яку ми використовуємо для кожного з таких сайтів:

WSGIDaemonProcess example.com user=www-data processes=2 maximum-requests=100

Я говорю про приблизно 40 сайтів на одному сервері, більшість із яких розміщують свій сайт, який працює в режимі очікування. З двома процесами (що мають 15 потоків у кожній за замовчуванням) сайти є добре забезпеченими, хоча й обмеженими можливостями розподілу серверних ресурсів. Чому така настройка є достатньою, можна виправдати простий характер програми (CMS): жоден запит не повинен зайняти більше ніж пару мілісекунд. Apache завжди залишатиметься розслабленим, і таким буде навантаження на процесор.

Б) Сайти електронної комерції

Більш складні веб-сайти, які ми робимо, характеризуються все ще недорогими локальними операціями, але зовнішніми залежностями (наприклад, веб-сервісами, що надають дані бронювання), які є дорогими з точки зору часу трансакції. Операції із зовнішніми запитами займають потоки набагато довший час, тому вам потрібно більше потоків, щоб задовольнити однакову кількість користувачів (порівняно з простим сайтом CMS зверху). Ще гірше, що потоки час від часу блокуються, коли зовнішня служба не може відповісти на запит негайно, іноді на пару секунд. Це може призвести до неприємного побічного ефекту від того, що потоки, що розміщують запити в ту саму чергу обслуговування, доти, поки всі наявні потоки mod_wsgi не будуть використані та заблоковані в очікуванні.

Для цих сценаріїв ми намагалися використовувати 6процеси, не бачачи великої різниці, і в кінцевому підсумку ми 12побачили незрівнянне підвищення продуктивності та стабільності роботи:

WSGIDaemonProcess example.com user=www-data processes=12 maximum-requests=100

Деякі прості навантажувальні тести на 150 і 250 паралельних користувачів легко обробляються сайтом, залишаючись добре чуйними (в той час як для 2процесів сайт непридатний для обслуговування 50 користувачів паралельно). 2-ядерний процесор 6-ядерний Intel Xeon з 32 ГБ оперативної пам’яті працює значно нижче 25% використання процесора при цьому навантаженні, також використання оперативної пам’яті майже залишається постійним і становить менше 25%. Зауважте, що ми використовуємо спеціалізовану машину лише для одного сайту, тому ми не будемо красти ресурси, які можуть знадобитися іншим сайтам.

Висновок

Використання більшої кількості процесів є компромісом між тим, чи дозволяти Apache використовувати доступні системні ресурси чи ні. Якщо ви хочете зберегти стабільну серверну систему (не веб-сайт!) В умовах "атаки", збережіть число низьким. Якщо ви хочете, щоб Apache допомогло вам використовувати системні ресурси (процесор, оперативну пам’ять), коли потрібно, виберіть більшу кількість. Наскільки високо ви можете підраховувати, дещо схоже на викладене у прийнятій відповіді вище, і в кінцевому рахунку обмежується наявною потужністю процесора та оперативною пам’яттю.

(PS: Я зберігаю розділ ConfigurationDirectives у вікі проекту modwsgi під подушкою для читання фоном Apache. Також не забудьте зрозуміти та відслідковувати відкриті підключення сервера Apache .)


Чудовий пост, але чому ви не встановите кількість потоків? Оскільки GIL Python заперечує безліч переваг потоків, я припускаю, що ви хочете мати більше процесів, ніж потоків, але чи є якась перевага у визначенні кількості потоків?
Серін

За замовчуванням число відповідно до документаціїthreads - 15 . Я не думаю, що є перевагою чітко вказати це. Насправді, я пам’ятаю, що це залишили з причини: Був якийсь пост на SO або частина якоїсь документації, яка рекомендувала опустити значення, щоб уникнути побічних ефектів (я знаю, це звучить дивно). На жаль, зараз я не знаходжу цього джерела. Що стосується решти запитань (GIL), ви, мабуть, більш експертні, ніж я, вибачте.
Петерино

Дякую за цю емпіричну конфігурацію. Однак майте на увазі, що згідно з цим постом You should never use maximum-requests in a production system unless you understand the implications and have a specific temporary need.
raratiru
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.