Оригинал на GitHub
Вопрос
Столкнулись с проблемой когда пользователей онлайн стало более 10. В этом случае система начинает тормозить (крутиться шестеренка более 1 минуты ). Как возможно решить эту проблему?
Ответ
Есть несколько направлений оптимизации проектов на totum.
Соответсвующий по мощности сервер. Чем сложнее решение и чем больше вычислений производится при каждом действии, а также чем больше пользователей работает одновременно, тем больше должно быть доступный ядер CPU и оперативной памяти. Для PRO версии минимальной конфигурацией для системы с 10 пользователями является 4 ядра и 4GB оперативной памяти.
Когда вы переходите к эксплуатации разработанного решения на предприятии, мы рекомендуем вам провести настройку PHP и PostgreSQL на вашем сервере. Инструкции по оптимизации вы можете найти на сайте документации Totum.
Оптимизация архитектуры решения. Есть несколько подходов, которые могут очень сильно замедлять работу системы:
Подход к вычислениям "взять все строки" и "поделить на все строки". При такой организации вычислений система сожет нормально функционировать на этапе разработки, но когда она нанет наполнятся данными - производительность резко упадет.
Отслеживание одновременных действий в таблицах, в которые ведется активная запись с долгими вычислениями в результате работы нескольких пользователей. Totum по умолчанию отслеживает одновременные действия пользователей, но в некоторых случаях — это логично выключить, например для таблицы Циклов, так как множество пользователей активно работающих каждый со своим циклом будут друг-другу мешать через общую для их циклов таблицу Циклов.
Очень большие цепочки действий, особенно с вызовом сторонних серверов. Надо стараться ограничивать длинну цепочек действия и быть уверенным, что сторонний сервер отвечает с достаточной скоростью. Если это не так, то стоит сделать асинхронную отправку и получение данных в фоне.
Для выборки из больших таблиц стоит поставить индексы на те поля, по которым ведется выборка в where-параметрах функций.
Если в кодах форматирования вы используете большие вычисления, одинаковые для каждой строки — стоит закешировать их при расчете первой строки, через создание процессной переменной.
Нежелательно использовать поля типа Селект с индивидуальным рассчетом в больших таблицах, особенно это актуально, когда Селект с индивидуальным расчетом берется через поле типа Ярлык в таблице Циклов. В этих случаях стоит сделать обыкновенный Селект и взять значение изнутри цикла Кодом.
Стоит оптимизировать коды в больших рассчетных таблицах, так-как они рассчитываются в каждом поле таблицы при каждом действии в этой таблице.
Везде где осуществляется большое количество действий изменения, вставки строк и удаления, стоит использовать массовые функции setList, insertList, deleteList и так далее, для осуществления одного действия, вместа множества через перебор в listReplace.