# 🚀 ОПТИМИЗАЦИЯ NEXTCLOUD - 31 ОКТЯБРЯ 2025 ## 🔍 ПРОБЛЕМА ### Симптомы: - ⏱️ Медленное открытие документов из CRM - 🔥 Nextcloud CPU: **50.43%** (постоянно) - ❌ Database Deadlocks при работе с файлами - 📊 24,000+ файлов в папке crm2 ### Найденные проблемы: #### 1. **Database Deadlocks** ❌ ``` SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction ``` - Nextcloud постоянно сканирует папку crm2 (24K файлов) - Обновления таблицы `oc_filecache` создают блокировки - 404 блокировки (Innodb_row_lock_waits) #### 2. **Отсутствие Distributed Cache** ❌ - Был только `memcache.local` (APCu) - Не было `memcache.distributed` (Redis) - Кеш не переживал перезапуски #### 3. **Автоматическое сканирование** ❌ - `filesystem_check_changes = 1` (по умолчанию) - При каждом запросе Nextcloud сканировал все 24K файлов - Огромная нагрузка на БД #### 4. **Маленький InnoDB Buffer Pool** ❌ - Всего **128 MB** (должно быть минимум 512MB) - Не хватает памяти для кеширования запросов --- ## ✅ РЕШЕНИЕ ### 1. Distributed Cache (Redis) ```bash docker exec -u www-data nextcloud-fresh php occ config:system:set memcache.distributed --value='\OC\Memcache\Redis' ``` **Результат:** - ✅ Кеш между запросами - ✅ Меньше обращений к БД - ✅ Быстрее открытие файлов ### 2. Отключение автосканирования ```bash docker exec -u www-data nextcloud-fresh php occ config:system:set filesystem_check_changes --value=0 --type=integer ``` **Результат:** - ✅ Nextcloud НЕ сканирует 24K файлов при каждом запросе - ✅ Меньше Deadlocks - ✅ Меньше нагрузки на БД **Важно:** Файлы будут обновляться через: - Redis события (`crm:file:events`) - Ручное сканирование при необходимости - WebDAV уведомления ### 3. Оптимизация PHP ```bash # Увеличен memory_limit echo 'memory_limit=1024M' >> /usr/local/etc/php/conf.d/nextcloud.ini # Оптимизация OPcache opcache.interned_strings_buffer=16 opcache.max_accelerated_files=20000 opcache.memory_consumption=256 opcache.revalidate_freq=60 ``` **Результат:** - ✅ Больше памяти для PHP скриптов - ✅ Больше файлов в OPcache - ✅ Меньше компиляций ### 4. Оптимизация MySQL ```sql SET GLOBAL max_connections = 300; -- было 151 SET GLOBAL innodb_lock_wait_timeout = 120; -- было 50 ``` **Примечание:** `innodb_buffer_pool_size` требует изменения в docker-compose и перезапуск. --- ## 📊 РЕЗУЛЬТАТ ### До оптимизации: ``` CPU: 50.43% ❌ Memory: 1005 MiB Deadlocks: много Скорость: медленно ``` ### После оптимизации: ``` CPU: 5.29% ✅ (в 10 раз меньше!) Memory: 645 MiB Deadlocks: должны уменьшиться Скорость: быстрее ``` --- ## 🎯 ДОПОЛНИТЕЛЬНЫЕ РЕКОМЕНДАЦИИ ### 1. Увеличить InnoDB Buffer Pool (требует перезапуск) Найти docker-compose файл Nextcloud и добавить: ```yaml services: db: environment: MYSQL_INNODB_BUFFER_POOL_SIZE: 1073741824 # 1GB command: - --innodb-buffer-pool-size=1073741824 - --innodb-log-file-size=268435456 # 256MB - --innodb-flush-log-at-trx_commit=2 - --innodb-flush-method=O_DIRECT ``` **Ожидаемое ускорение:** +30-50% ### 2. Добавить индексы в oc_filecache ```sql -- Проверить существующие индексы SHOW INDEX FROM oc_filecache; -- Добавить если нужно CREATE INDEX idx_storage_path ON oc_filecache(storage, path(255)); CREATE INDEX idx_parent_name ON oc_filecache(parent, name(255)); ``` **Ожидаемое ускорение:** +20-40% ### 3. Настроить Chunked Upload для больших файлов ```bash docker exec -u www-data nextcloud-fresh php occ config:app:set files max_chunk_size --value=10485760 # 10MB ``` ### 4. Включить Preview Generation в фоне ```bash docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator squareSizes --value="256 512" docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator widthSizes --value="256 512 1024" docker exec -u www-data nextcloud-fresh php occ config:app:set previewgenerator heightSizes --value="256 512 1024" ``` --- ## 📈 МОНИТОРИНГ ### Проверка производительности: ```bash # CPU/Memory Nextcloud docker stats nextcloud-fresh --no-stream # Deadlocks MySQL docker exec nextcloud-db-fresh mariadb -u root -proot_password -e "SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%';" 2>&1 | grep -v insecure # Redis статистика redis-cli -h 127.0.0.1 -p 6380 -a 'Nextcloud_Redis_Pass_2025!' INFO stats 2>&1 | grep -v Warning | head -10 ``` ### Логи Nextcloud: ```bash docker logs nextcloud-fresh --tail 50 | grep -i "error\|warning\|deadlock" ``` --- ## ✅ ТЕКУЩИЕ НАСТРОЙКИ ### Nextcloud Config: ```php 'memcache.local' => '\OC\Memcache\APCu', // Локальный кеш 'memcache.distributed' => '\OC\Memcache\Redis', // Распределённый кеш ✅ НОВОЕ 'memcache.locking' => '\OC\Memcache\Redis', // Блокировки через Redis 'filesystem_check_changes' => 0, // Автоскан ОТКЛЮЧЕН ✅ НОВОЕ ``` ### PHP: ``` memory_limit = 1024M (было 512M) opcache.memory_consumption = 256 opcache.max_accelerated_files = 20000 opcache.interned_strings_buffer = 16 ``` ### MySQL: ``` max_connections = 300 (было 151) innodb_lock_wait_timeout = 120 (было 50) innodb_buffer_pool_size = 128MB (⚠️ НУЖНО 1GB) ``` --- ## 🚀 СЛЕДУЮЩИЕ ШАГИ ### Критично (сделать сегодня): 1. ✅ Distributed cache - **ГОТОВО** 2. ✅ Отключить автоскан - **ГОТОВО** 3. ✅ PHP оптимизация - **ГОТОВО** 4. ⏳ Проверить результат - **тестируем** ### Важно (сделать на неделе): 1. ⬜ Увеличить InnoDB buffer pool до 1GB 2. ⬜ Добавить индексы в oc_filecache 3. ⬜ Настроить chunked upload 4. ⬜ Preview generation в фоне ### Можно (если будет время): 1. ⬜ APCu увеличить (apc.shm_size=128M) 2. ⬜ Отключить ненужные приложения Nextcloud 3. ⬜ Настроить логи на rotation 4. ⬜ Мониторинг производительности --- ## 🎯 ОЖИДАЕМЫЙ РЕЗУЛЬТАТ **После всех оптимизаций:** - ⚡ Открытие документов: **в 3-5 раз быстрее** - 📉 CPU Nextcloud: **< 10%** (было 50%) - ❌ Deadlocks: **минимум** (было много) - 💾 Меньше нагрузки на БД --- **Статус:** ✅ Критичные оптимизации применены **CPU до:** 50.43% **CPU после:** 5.29% **Ускорение:** **~10x** 🚀 **Дата:** 31 октября 2025, 10:04 **Автор:** Фёдор + AI Assistant