Перейти к содержимому

Долгий обмен и обрывы - шаг, память, время выполнения

Разбираемся, почему обмен идёт часами или обрывается на середине, и настраиваем его под возможности сервера.

Решение

Смотрим, сколько времени занимают шаги обмена:

Окно терминала
# каждый шаг - отдельный запрос к точке обмена, они видны в журнале веб-сервера
grep '1c_exchange.php' /var/log/nginx/access.log | tail -20 | awk '{print $NF, $7}'
grep -c '1c_exchange.php' /var/log/nginx/access.log # всего запросов обмена
# число таких строк за сеанс и есть число шагов обмена
# последнее поле - время ответа: растущее время означает подросший шаг

Обмен идёт порциями: учётная система шлёт запрос, сайт обрабатывает часть данных и отвечает «продолжай». Один долгий обмен - это десятки таких запросов, и разбирать нужно длительность шага, а не всего процесса.

Подбираем размер шага и пределы:

COption::SetOptionString('catalog', '1C_INTERVAL', '30'); // секунд на шаг
COption::SetOptionString('catalog', '1C_FILE_SIZE_LIMIT', '204800');
COption::SetOptionString('catalog', '1C_USE_ZIP', 'Y'); // сжатие файлов
// шаг должен завершаться быстрее, чем предел времени выполнения PHP

Шаг меньше времени выполнения PHP - главное правило. Тогда сайт успевает завершить порцию сам и отдать управление, а не упирается в предел и не теряет обработанное.

Проверяем пределы пула сайта:

Окно терминала
# память и время задаются пулу сайта, а не общей настройкой сервера
grep -E 'memory_limit|max_execution_time|request_terminate' /etc/php-fpm.d/bx0.conf
php -i | grep -E '^(memory_limit|max_execution_time)'

Предел времени в веб-сервере и в PHP - разные значения, и обмен обрывается по меньшему. Времени должно хватать на шаг с запасом, а памяти - на разбор самого большого файла выгрузки.

Смотрим, где именно остановился обмен:

Окно терминала
tail -40 /home/bitrix/www/upload/1c_catalog/1c_exchange.log 2>/dev/null
ls -lh /home/bitrix/www/upload/1c_catalog/ | tail -5 # что осталось необработанным

Журнал называет последний успешный шаг. Оставшиеся в папке файлы говорят о том же: обмен не дошёл до конца и при следующем запуске начнёт заново, если учётная система не поддерживает продолжение.

Полная выгрузка каталога тяжелее последующих в разы: приезжают все товары, свойства и картинки. Её ставят на ночное окно, а в рабочее время оставляют только выгрузку изменений - она короче и не мешает посетителям.

Обмен и посетители делят один и тот же сервер. Тяжёлый обмен в час пик отбирает процессы PHP у витрины, и сайт начинает отвечать медленно всем сразу. На нагруженных проектах обмен уводят на отдельный сервер приложений или хотя бы выделяют ему собственный пул процессов, не пересекающийся с витриной.

Типичные проблемы

Обмен обрывается на одном и том же месте.

Шаг не укладывается во время выполнения PHP. Порция обрабатывается дольше отведённого, и процесс убивается.

Приехала часть товаров из тысячи.

Обмен остановился на середине и начал заново. Без поддержки продолжения каждый запуск обрабатывает один и тот же первый кусок.

Обмен занимает всю ночь.

Слишком мелкий шаг: накладные расходы на запрос повторяются сотни раз. Шаг увеличивают до предела времени выполнения.

Во время обмена сайт отвечает медленно.

Обмен занимает процессы PHP наравне с посетителями. Тяжёлые выгрузки уводят в ночное окно.

Обмен падает по памяти на больших файлах.

Предел памяти пула меньше, чем нужно для разбора файла. Значение задают пулу сайта, а не общей настройкой.

Частые вопросы

Какой размер шага выбрать?

Такой, чтобы шаг завершался заметно быстрее предела времени выполнения. Обычно это десятки секунд, а точное значение подбирают по журналу.

Помогает ли сжатие файлов обмена?

Да, оно сокращает передачу и место на диске, но добавляет работы процессору при распаковке. На медленном канале выигрыш заметно больше потерь.

Можно ли обмениваться в рабочее время?

Выгрузкой изменений - да, она короткая. Полную выгрузку каталога в час пик не ставят: она отбирает ресурсы у посетителей.

Что делать, если сервер не тянет полный обмен?

Сузить состав выгрузки на стороне учётной системы: реже выгружать картинки, ограничить набор свойств. Наращивать пределы сервера бесконечно не получится.

Смежное

Первоисточник