Долгий обмен и обрывы - шаг, память, время выполнения
Разбираемся, почему обмен идёт часами или обрывается на середине, и настраиваем его под возможности сервера.
Решение
Смотрим, сколько времени занимают шаги обмена:
# каждый шаг - отдельный запрос к точке обмена, они видны в журнале веб-сервера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.confphp -i | grep -E '^(memory_limit|max_execution_time)'Предел времени в веб-сервере и в PHP - разные значения, и обмен обрывается по меньшему. Времени должно хватать на шаг с запасом, а памяти - на разбор самого большого файла выгрузки.
Смотрим, где именно остановился обмен:
tail -40 /home/bitrix/www/upload/1c_catalog/1c_exchange.log 2>/dev/nullls -lh /home/bitrix/www/upload/1c_catalog/ | tail -5 # что осталось необработаннымЖурнал называет последний успешный шаг. Оставшиеся в папке файлы говорят о том же: обмен не дошёл до конца и при следующем запуске начнёт заново, если учётная система не поддерживает продолжение.
Полная выгрузка каталога тяжелее последующих в разы: приезжают все товары, свойства и картинки. Её ставят на ночное окно, а в рабочее время оставляют только выгрузку изменений - она короче и не мешает посетителям.
Обмен и посетители делят один и тот же сервер. Тяжёлый обмен в час пик отбирает процессы PHP у витрины, и сайт начинает отвечать медленно всем сразу. На нагруженных проектах обмен уводят на отдельный сервер приложений или хотя бы выделяют ему собственный пул процессов, не пересекающийся с витриной.
Типичные проблемы
Обмен обрывается на одном и том же месте.
Шаг не укладывается во время выполнения PHP. Порция обрабатывается дольше отведённого, и процесс убивается.
Приехала часть товаров из тысячи.
Обмен остановился на середине и начал заново. Без поддержки продолжения каждый запуск обрабатывает один и тот же первый кусок.
Обмен занимает всю ночь.
Слишком мелкий шаг: накладные расходы на запрос повторяются сотни раз. Шаг увеличивают до предела времени выполнения.
Во время обмена сайт отвечает медленно.
Обмен занимает процессы PHP наравне с посетителями. Тяжёлые выгрузки уводят в ночное окно.
Обмен падает по памяти на больших файлах.
Предел памяти пула меньше, чем нужно для разбора файла. Значение задают пулу сайта, а не общей настройкой.
Частые вопросы
Какой размер шага выбрать?
Такой, чтобы шаг завершался заметно быстрее предела времени выполнения. Обычно это десятки секунд, а точное значение подбирают по журналу.
Помогает ли сжатие файлов обмена?
Да, оно сокращает передачу и место на диске, но добавляет работы процессору при распаковке. На медленном канале выигрыш заметно больше потерь.
Можно ли обмениваться в рабочее время?
Выгрузкой изменений - да, она короткая. Полную выгрузку каталога в час пик не ставят: она отбирает ресурсы у посетителей.
Что делать, если сервер не тянет полный обмен?
Сузить состав выгрузки на стороне учётной системы: реже выгружать картинки, ограничить набор свойств. Наращивать пределы сервера бесконечно не получится.
Смежное
-
Обмен: выгрузка товаров - оглавление подтемы
-
Не выгружаются товары из 1С - когда товары не приезжают вовсе
-
Allowed memory size exhausted: причины по убыванию частоты - вторая причина обрыва выгрузки
-
nginx и PHP-FPM: статика, пулы, медленные ответы - откуда берутся пределы пула
-
MySQL server has gone away: причины по убыванию частоты - обрыв соединения с базой при обмене
-
Обмен с 1С и HTTP - устройство обмена целиком
-
Журнал обмена: как читать и что означают его сообщения - как выглядит обрыв в журнале
-
Свой агент и задание по расписанию: создание, шаг, защита - вынос долгой работы в расписание
-
Своя логика при обмене: обработчики, защита правок, журнал - цена обработчика на большом каталоге
-
Протокол обмена с 1С: шаги, параметры, ответы, отладка - как повторить долгий шаг запросами
-
Расписание обменов: частота, окна, конфликты, блокировка - ночные окна и блокировка повторного запуска