Load testing

Найти предел

Ступенчатые лестницы нагрузки для БД, CPU и ОЗУ. Каждая ступень — отдельный запрос к /load.py?test=…, JSON-ответ рисуется столбиком. Ползём вверх, пока сервер не сдастся — таймаут, ошибка, OOM.

⚠ на shared-хостинге не запускай подряд, дай серверу подышать
Sysinfo · GET /load.py?test=sysinfo

Что мы вообще имеем

Загрузка…
Одной кнопкой

Прогнать всё

Последовательно запускает все лестницы. Останавливается на первом отказе внутри каждой.

Жёсткий режим: MAX_WALL 90 сек на запрос, лестницы до 300k COUNT'ов / 12 ГБ RAM / 6 млрд решето / 500 потоков MySQL. Полный прогон занимает 10-20 минут. Остановится сам, когда сервер сдастся.

1. База данных

Нагрузка на MySQL

db_count · индексный SELECT

Индексные COUNT’ы

Простой запрос по индексу ix_breed. Меряем, сколько таких успевает сервер за одну CGI-сессию.
db_agg · тяжёлые агрегаты

AVG + STDDEV по GROUP BY

Полная агрегация по всей таблице (~80k строк) — AVG, STDDEV, COUNT, MAX, MIN.
db_scan · full table scan

LIKE %x% (без индекса)

Форсированный full-scan: WHERE name LIKE '%а%'. Меряем throughput сканов.
db_threads · параллельные потоки

Конкурентные запросы

Из одного CGI-процесса открываем N MySQL-соединений в потоках и одновременно долбим GROUP BY.
2. Процессор

CPU-bound задачи

cpu_hash · SHA-256

Хеш-цепочки

N раз подряд sha256 от прошлого хеша. Проверяет чистый CPU без I/O и памяти.
cpu_prime · решето Эратосфена

Простые числа до N

Решето на bytearray. Тут вылезет и CPU, и лимит памяти под N + 1 байт.
3. Оперативная память

Аллокация памяти

ram · bytearray + touch every 4KB page

Сколько ОЗУ даст CGI

Аллоцируем массив bytearray(N * 1024 * 1024), обходим и трогаем каждую страницу — чтобы ядро не отложило выделение. Растём: 10, 50, 100, 200, 400, 800, 1200, 2000 МБ, пока не поймаем MemoryError или отвал CGI.
Итоги

Пределы, найденные тестами

Пусто
запусти прогон