Home Cloud

Тюнинг производительности Nextcloud на скромном железе

· 2 мин. чтения

Мой первый Nextcloud работал на двухъядерном Celeron с 4 ГБ памяти, и папка с тысячей фотографий открывалась секунд десять. Сейчас на похожем железе всё летает. Вот изменения, которые дали заметный эффект, в порядке пользы.

1. Фоновые задачи через системный cron

По умолчанию Nextcloud выполняет фоновые задачи в режиме AJAX, то есть при загрузке страниц пользователями. Это медленно и ненадёжно. Переключаю на cron:

occ background:cron
*/5 * * * * php -f /var/www/html/cron.php

В Docker это либо отдельный контейнер с тем же образом и командой cron.sh, либо задача на хосте через docker exec.

2. OPcache

PHP без OPcache каждый раз заново компилирует скрипты. В официальном образе он включён, но буфер по умолчанию маловат. Я ставлю opcache.memory_consumption=256 и opcache.interned_strings_buffer=16. Предупреждение про interned strings на странице «Обзор» как раз об этом.

3. Redis для кэша и блокировок

APCu я использую как локальный кэш, а Redis для распределённого кэша и, главное, для блокировок файлов. Без Redis блокировки хранятся в базе, а это множество мелких запросов на каждую операцию с файлом. После перехода на Redis синхронизация большого каталога ускорилась у меня примерно в два раза.

4. Настройки PHP-FPM

Если используется FPM, параметры pm.max_children по умолчанию рассчитаны на крохотный сервер. Считаю так: свободная память под PHP, делённая на средний размер процесса (для Nextcloud это 60–100 МБ). На 4 ГБ у меня получилось около 20 процессов.

5. Превью

Генерация миниатюр на лету — главная причина медленных галерей. Приложение Preview Generator заранее создаёт превью по cron. Ещё я ограничиваю максимальный размер превью в config.php: preview_max_x и preview_max_y по 2048. Огромные миниатюры никому не нужны, а место и время они съедают.

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

PostgreSQL на SSD и пара параметров (shared_buffers около четверти памяти, effective_cache_size около половины) решают большинство проблем. После мажорных обновлений не забываю про occ db:add-missing-indices: без нужных индексов некоторые запросы деградируют на порядок.

Чего не стоит делать

Не стоит отключать проверку целостности или функции безопасности ради скорости: выигрыш копеечный, а риск реальный. И не стоит гнаться за синтетическими тестами. Лучший показатель — насколько быстро открывается ваша обычная папка с фотографиями.

← Все статьи