Сколько RAM нужно для LimeSurvey
LimeSurvey — не блог и не магазин, и его аппетит к памяти считается по другим правилам. Сама анкета лёгкая: страница с вопросами рендерится быстро и почти не грузит PHP. Память съедают две другие вещи — ветвящаяся логика (relevance-условия, пересчитываемые на каждом шаге) и статистика с экспортом результатов, где движок собирает весь массив ответов разом. Разберём, из чего складывается расход, как его измерить и какие цифры закладывать под опрос на 20 вопросов и под анкету на 300 с ветвлением.
Содержание
- Короткий ответ: сколько RAM закладывать
- Из чего складывается память LimeSurvey
- Ветвящаяся логика и ExpressionManager — где прячется нагрузка
- Экспорт результатов и статистика — главный потребитель памяти
- Как измерить свой расход, а не гадать по чужим цифрам
- Конфигурация PHP-FPM и MySQL под LimeSurvey
- Какой сервер взять в MAATRIX под LimeSurvey
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Короткий ответ: сколько RAM закладывать
Ориентиры для nginx 1.28 + PHP-FPM 8.3 + MariaDB 11.4 на Ubuntu 24.04, LimeSurvey 6.x. Официальный минимум разработчиков — 2 ГБ RAM и PHP memory_limit от 128 МБ, но это цифра для установки, а не для рабочей нагрузки с респондентами и экспортом.
| Сценарий | RAM | vCPU | Диск | Что случится на шаг ниже |
|---|---|---|---|---|
| Опрос до 30 вопросов, простая логика, до 500 ответов | 2 ГБ | 1–2 | 25 ГБ NVMe | экспорт всех ответов в Excel падает по memory_limit |
| Анкета 50–150 вопросов, ветвящаяся логика (relevance), 1000–5000 ответов | 4 ГБ | 2 | 40 ГБ NVMe | статистика с графиками зависает или отдаёт 502 |
| Корпоративное исследование 200–400 вопросов, вложенные условия, несколько опросов сразу | 8 ГБ | 2–4 | 60 ГБ NVMe | параллельный экспорт двух опросов кладёт PHP-FPM по OOM |
| Панель с массовым сбором: сотни одновременных респондентов, десятки тысяч ответов, интеграции по API/токенам | 16 ГБ | 4–6 | 100 ГБ NVMe | буферный пул InnoDB не вмещает таблицы _responses, каждый экспорт идёт на диск |
Главный вывод из таблицы: прохождение анкеты почти никогда не требует много памяти — тяжело не респондентам, а администратору, когда он открывает статистику или жмёт «Экспорт результатов» на опросе с тысячами ответов.
Из чего складывается память LimeSurvey
LimeSurvey написан на Yii2 — фреймворк тяжелее плоского PHP-скрипта: инициализация MVC, роутинг и ORM для десятков таблиц (lime_survey_*, lime_questions, lime_answers, lime_tokens_*) добавляют накладные расходы ещё до логики самого опроса.
| Компонент | RSS | Комментарий |
|---|---|---|
| Ubuntu 24.04 после загрузки | 190–260 МБ | вычитайте сразу из общего объёма |
| nginx 1.28 и мастер PHP-FPM | 35–55 МБ | почти не растёт с нагрузкой |
| Воркер: прохождение опроса респондентом (страница с вопросами) | 35–55 МБ | Yii2-роутинг + рендер шаблона |
| Воркер: страница с активной ветвящейся логикой (много relevance-условий) | 70–130 МБ | ExpressionManager пересчитывает выражения на каждый переход |
| Воркер: панель администратора, конструктор вопросов | 60–100 МБ | вложенные группы и условия тяжелее плоского списка |
| Воркер: статистика опроса с графиками (imageGraph/pChart) | 150–300 МБ | зависит от числа вопросов и объёма ответов |
| Воркер: экспорт результатов (VV, Excel, SPSS/CSV) | 200–900 МБ и выше | главный потребитель, разбор ниже |
MariaDB 11.4, innodb_buffer_pool_size = 256M | 320–420 МБ | таблицы ответов растут с каждым респондентом |
| Redis (опционально, под сессии и кеш) | 20–80 МБ | не обязателен, но снимает нагрузку с MySQL при большом трафике |
Ключевая разница с обычным сайтом на PHP: у LimeSurvey нет «типового» воркера — RSS процесса, отдающего анкету, и процесса, генерирующего статистику по ней же, различаются на порядок.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверВетвящаяся логика и ExpressionManager — где прячется нагрузка
Relevance-условия («показать вопрос 15, если в вопросе 3 выбран вариант B») обрабатывает ExpressionManager: он парсит уравнения и пересчитывает их при каждом переходе между группами вопросов. На простой анкете это незаметно. На опросе с сотнями вопросов и перекрёстными условиями (вопрос зависит от трёх других, те — ещё от пяти) ExpressionManager держит в памяти дерево зависимостей на весь опрос сразу, а не только на текущую страницу.
Отсюда практическое следствие: два опроса с одинаковым числом вопросов, но разной сложностью логики, требуют разной памяти на воркер — цифра «150 вопросов» в описании ничего не говорит о нагрузке сама по себе.
Что снижает нагрузку без переписывания логики: режим «Только один вопрос на странице» вместо «Вся анкета на одной странице» (тогда пересчитывается relevance не всего опроса разом, а только видимой группы); упрощение вложенных условий там, где хватает простого правила «покажи, если ответ = X» вместо трёхэтажной формулы с sum() и count(); отключённый предпросмотр логики в конструкторе на боевом сервере — он нужен на этапе разработки анкеты, а на проде лишь гоняет ExpressionManager вхолостую.
Экспорт результатов и статистика — главный потребитель памяти
Это узкое место, из-за которого сервер, спокойно держащий сбор ответов, падает в момент, когда администратор решает выгрузить результаты. При экспорте в VV (формат, совместимый с SPSS/R) или в Excel LimeSurvey собирает полную таблицу ответов и размечает её по типам вопросов в памяти PHP-процесса, а не потоково постранично.
Ориентировочно (сильно зависит от числа полей на ответ — считайте по своей анкете, это не универсальная константа): опрос на 100 вопросов с подвопросами даёт 200–400 колонок в выгрузке, и 5000 ответов на такой анкете — уже сотни мегабайт промежуточных данных в процессе. При memory_limit = 128M (дефолт многих сборок PHP) экспорт просто падает:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 20971520 bytes) in ExpressionManager.php on line ...
Та же логика — у статистики с графиками: чем больше закрытых вопросов и респондентов, тем тяжелее построение диаграмм на лету. На больших опросах статистику стоит смотреть отдельным запросом администратора в спокойное время, а не в пик сбора ответов.
Что помогает: отдельный, более высокий memory_limit для CLI и для пула администратора — респондентам столько не нужно; выгрузка результатов частями через фильтр по датам или токенам вместо одного экспорта «все ответы за всё время»; для регулярных больших выгрузок — RemoteControl API LimeSurvey с постраничным экспортом вместо веб-интерфейса. И не запускайте mysqldump одновременно с ручным экспортом результатов — оба тянут память с двух сторон разом; подробности бэкапа базы — в статье про бэкап MySQL на сервере.
Как измерить свой расход, а не гадать по чужим цифрам
free -m на работающем сервере с LimeSurvey и 4 ГБ RAM:
total used free shared buff/cache available
Mem: 3919 1450 280 90 2189 2201
Смотрите на available: буфер и кеш ядро отдаст под нагрузку, «свободно 280 МБ» — не повод паниковать сам по себе.
ps --no-headers -o rss -C php-fpm8.3 | awk '{s+=$1; n++} END {print n" воркеров, средний RSS "int(s/n/1024)" МБ"}'
apt install -y smem && smem -t -k -P php-fpm | tail -3
cat /sys/fs/cgroup/system.slice/php8.3-fpm.service/memory.peak
smem считает PSS — честную долю на воркер с учётом разделяемых страниц OPcache; сырой RSS завышает картину при большом числе воркеров. memory.peak в cgroup — исторический максимум с момента запуска сервиса, а не текущее значение: он подскажет, хватило ли памяти в момент экспорта или статистики, даже если сейчас всё выглядит спокойно.
Проверьте, не убивало ли ядро процессы раньше — это часто списывают на «глюки хостинга», хотя причина в памяти:
dmesg -T | grep -iE "killed process|out of memory"
grep -c "server reached pm.max_children" /var/log/php8.3-fpm.log
journalctl -u php8.3-fpm --since "-7d" | grep "exited on signal 9"
Если строка Out of memory: Killed process ... (php-fpm8.3) совпадает по времени с жалобой «экспорт не работает» — причина найдена, и это не баг LimeSurvey, а нехватка памяти под конкретный опрос. Общие сценарии нехватки памяти на VPS — в статье что делать при нехватке RAM.
Конфигурация PHP-FPM и MySQL под LimeSurvey
Разделяйте пулы PHP-FPM на «фронт» (респонденты проходят опрос) и «админку» (статистика, экспорт, конструктор) — им нужна разная память на воркер, и общий пул с одним лимитом либо душит экспорт, либо резервирует лишнее под лёгкие страницы анкеты.
/etc/php/8.3/fpm/pool.d/limesurvey-front.conf для 4 ГБ, респонденты:
[limesurvey-front]
listen = /run/php/limesurvey-front.sock
pm = dynamic
pm.max_children = 12
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500
php_admin_value[memory_limit] = 192M
/etc/php/8.3/fpm/pool.d/limesurvey-admin.conf — отдельный пул под статистику и экспорт:
[limesurvey-admin]
listen = /run/php/limesurvey-admin.sock
pm = ondemand
pm.max_children = 3
pm.process_idle_timeout = 30s
php_admin_value[memory_limit] = 768M
php_admin_value[max_execution_time] = 300
pm = ondemand для админского пула оправдан: экспорт запускают редко, и три воркера по 768 МБ не должны висеть в памяти постоянно — ondemand поднимает процесс под запрос и гасит его после простоя. В nginx маршрутизируйте /admin и /index.php/admin/* на сокет limesurvey-admin, остальное — на limesurvey-front.
Настройка MySQL/MariaDB — по размеру таблиц ответов, а не по проценту от RAM:
SELECT ROUND(SUM(data_length+index_length)/1024/1024) mb
FROM information_schema.tables
WHERE table_schema = 'limesurvey' AND table_name LIKE '%responses%';
Дальше — пул InnoDB с запасом на рост таблицы ответов (она копится с каждым респондентом, в отличие от статичных таблиц конструктора вопросов):
[mysqld]
innodb_buffer_pool_size = 512M
innodb_buffer_pool_instances = 1
max_connections = 40
performance_schema = OFF
Общие приёмы тюнинга MySQL под ограниченную память — в статье оптимизация MySQL под 1 ГБ RAM, а базовая установка — в MySQL на VPS.
Какой сервер взять в MAATRIX под LimeSurvey
Ключевой вопрос при выборе тарифа — не «сколько вопросов в анкете», а «кто и как часто открывает статистику и экспорт». Опрос на 300 вопросов без активной ветвящейся логики спокойно живёт на 4 ГБ. Тот же опрос с ежедневным экспортом всех накопленных ответов для аналитиков — уже кандидат на 8 ГБ, иначе экспорт будет падать именно тогда, когда данные особенно нужны.
Минимум: 1–2 vCPU, 2 ГБ RAM, 25 ГБ NVMe. Один опрос среднего размера без сложного ветвления, до нескольких сотен ответов, экспорт — небольшими выгрузками по фильтру, а не «всё сразу». Держите memory_limit фронтового пула на 128–192 МБ и не открывайте статистику в часы пиковой нагрузки.
Комфортный вариант: 2–4 vCPU, 4–8 ГБ RAM, 40–60 ГБ NVMe. Подходит для анкет с ветвящейся логикой, нескольких параллельных опросов и регулярных экспортов результатов без танцев с фильтрами по датам. Отдельный админский пул PHP-FPM с memory_limit = 768M укладывается свободно, буферный пул InnoDB вмещает таблицы ответов растущего опроса.
Локация выбирайте по географии респондентов, а не только по своей: RU — если опрос идёт для аудитории в России и важна скорость загрузки внутри страны, UK — для европейских исследований (плюс данные респондентов из ЕС логичнее держать в юрисдикции с понятными правилами GDPR), US — для американской аудитории. Apache с mod_php вместо связки nginx + PHP-FPM тоже работает с LimeSurvey, конфигурация применима с поправкой на два пула вместо одного.
LimeSurvey есть в каталоге apps.maatrix.io и разворачивается автоматически при заказе сервера на Ubuntu — база, PHP-FPM и панель настроены заранее, доступы приходят в личный кабинет. Оплата картами российских банков, по СБП или криптовалютой — иностранная карта не нужна вне зависимости от локации сервера.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Хватит ли 1 ГБ RAM для LimeSurvey?
Технически опрос запустится, но конфигурация рискованная: официальный минимум разработчиков — 2 ГБ, и на 1 ГБ первый же экспорт или статистика с десятками вопросов упрётся в память. Для короткого разового опроса без экспорта — работает, но не как постоянная схема.
Почему экспорт падает, а сама анкета работает нормально?
Разные профили нагрузки: прохождение опроса — лёгкий рендер, экспорт собирает всю таблицу ответов в памяти разом. Решение — отдельный PHP-FPM пул с повышенным memory_limit для админки и выгрузка частями по фильтру вместо «всё сразу».
Что сильнее влияет на память — число вопросов или число ответов?
По-разному на разных этапах. На сборе ответов главное — сложность ветвящейся логики, число ответов почти не влияет на воркер респондента. На экспорте и статистике наоборот: число ответов, умноженное на число полей анкеты, напрямую определяет объём данных в памяти.
Нужен ли Redis для LimeSurvey?
Не обязателен для среднего опроса, но полезен при большом потоке респондентов — снимает нагрузку на сессии с MySQL. Для сотен параллельных участников со сложной логикой добавьте 40–80 МБ под Redis в расчёт.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →