Всичко започва с един въпрос: какво правят тези потребители? Хиляда души, влезли в едно приложение, не правят хиляда заявки в секунда, а страница, обслужена от кеш, струва сто пъти по-малко от изчислена страница. Това ръководство превръща потребителите в заявки, заявките в процесор и памет, след което показва как да проверите всичко с тест за натоварване.
„Едновременни потребители“ означава три различни величини в зависимост от това кой говори:
От едната величина към другата се преминава чрез закона на Литъл: броят на заявките в обработка е равен на пропускателната способност, в заявки в секунда, умножена по средната продължителност на една заявка.
Пример. 600 потребители, активни едновременно, всеки от които задейства заявка на всеки 20 секунди, правят 30 заявки в секунда. Ако всяка заявка трае 100 ms, сървърът има средно само 3 заявки в обработка. Предизвикателството е другаде: в пиковете и в бавните заявки.
Една заявка заема процесора, докато трае изчислението ѝ: изпълнение на кода, заявки към базата, изграждане на отговора. Затова един vCPU обработва най-много 1 000 ÷ t заявки в секунда, където t е времето за изчисление на една заявка в милисекунди. Времето, прекарано в чакане (на външно API, на диска), не заема процесора, но заема worker.
| Вид заявка | Типично време за изчисление | На vCPU, порядък |
|---|---|---|
| Статичен файл или страница, обслужена от кеш | Под 1 ms | Няколко хиляди заявки в секунда |
| WordPress страница, обслужена от кеш на страниците | 1 до 5 ms | Няколкостотин в секунда |
| JSON API (Node.js, Go, FastAPI) с индексирана SQL заявка | 5 до 20 ms | 50 до 200 в секунда |
| WordPress или Laravel страница, изчислявана при всяко посещение | 100 до 300 ms | 3 до 10 в секунда |
| Отчет, експорт, генериране на PDF | 500 ms до няколко секунди | Под 2 в секунда |
С тези порядъци 30 API заявки в секунда при 10 ms изчисление заемат 30 % от един-единствен vCPU. Същите 30 заявки в секунда към WordPress страници без кеш изискват 3 до 9 vCPU. Кешът на страниците служи точно за това: да премести една страница от четвъртия ред на таблицата към втория.
Всяка заявка в обработка се поема от worker, а worker процесите заемат памет, независимо дали работят или не. Често паметта, повече от процесора, определя броя на заявките, обработвани паралелно:
pm.max_children задава тавана: 20 процеса заемат от 800 MB до 1,6 GB.max_connections.Постоянните връзки (websockets, известия в реално време) се броят отделно: отворени непрекъснато, те заемат малко процесор и по няколко десетки килобайта памет всяка. Един Node.js сървър държи хиляди от тях в няколкостотин MB.
В реално приложение сървърът рядко се насища там, където го очаквате. Най-честите причини, в реда, в който да ги търсите:
pg_stat_statements в PostgreSQL или журналът на бавните заявки в MySQL я посочва.Порядъците дават първоначален размер; тестът за натоварване дава истинския. Принципът: симулирате все повече потребители върху копие на приложението и отбелязвате момента, в който времето за отговор рязко се влошава.
wrk -t2 -c50 -d30s --latency https://preprod.vashiyat-sayt.com/
За цялостен път на потребителя (вход, разглеждане, търсене) k6 описва сценарий на JavaScript и увеличава натоварването на стъпки:
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 300 },
{ duration: '5m', target: 300 },
{ duration: '2m', target: 0 },
],
thresholds: { http_req_duration: ['p(95)<500'] },
};
export default function () {
http.get('https://preprod.vashiyat-sayt.com/');
sleep(15);
}
htop за процесора, free -h за паметта, журналите за грешките.Редът, който струва най-малко и носи най-много:
Първите три стъпки покриват огромното мнозинство от бизнес приложенията, сайтовете и API: няколкостотин потребители, активни едновременно, се обслужват от един добре настроен сървър.
VPS Pro се предлага в шест размера, на процесори Intel Xeon, ECC памет и NVMe SSD в огледален режим, и преминава към по-голям размер по всяко време, без преинсталиране. Цялостната поддръжка е включена: кажете ни колко потребители очаквате при старта и след година и ще ви препоръчаме размера; а когато някоя страница се забави, поставяме диагноза и ви казваме какво да направите, от системата до кода на вашето приложение.
За API или приложение, чиито заявки изискват 10 до 20 ms изчисление, няколкостотин потребители, активни едновременно. За WordPress сайт без кеш на страниците около сто. Разликата идва от времето за изчисление на всяка заявка и от кеша, затова си струва да направите тест за натоварване.
Броят посетители на ден казва малко: важен е пикът. За да преминете от едното към другото, разделете посещенията за деня на часовете активност, умножете по разгледаните страници на посещение, след това по коефициент на пика от 3 до 5. 10 000 посещения за 10 часа, по 4 страници всяко, дават средно около 1 страница в секунда и 3 до 5 в пика.
Три признака: времето за отговор расте заедно с трафика, процесорът остава над 80 % в пиковите часове или наличната памет пада близо до нула. Тогава журналите на уеб сървъра показват грешки 502 или 504, а заявките чакат свободен worker.
Да: една websocket връзка остава постоянно отворена. Тя консумира малко процесор и няколко десетки килобайта памет. Един Node.js сървър държи хиляди такива връзки; процесора натоварват по-скоро изпратените съобщения, отколкото отворените връзки.
Simafri
Да поговорим за Вашия проект
Кажете ни с няколко думи от какво имате нужда: отговаряме Ви бързо.
Благодарим! Вашето запитване е изпратено. Ще се свържем с вас скоро.
Предпочитате имейл? Пишете ни на support@simafri.com.