Добрый день.
Проводили нагрузочное тестирование SuiteCRM (30-700 пользователей) на связке:
-APP
OS Debian 9
Web Apache 2.4
PHP 7.1
-BD MS sql server
По итогам анализа результатов нагрузочного тестирования выявили одну проблему – описание проблемы ниже.
Выявленная проблема:
При переходе на список клиентов ФЛ получаем долгий отклик (1-15 секунд) от SuiteCRM на ~ 70 пользователях, при 160 и более пользователях (от 20 секунд до 5 минут) что средство генерации нагрузки воспринимает как обрыв сессии.
Выяснили причину данной проблемы, это запросы вида:
SELECT TOP (21) *
FROM
(
SELECT <набор полей>
, ROW_NUMBER() OVER (ORDER BY <условие сортировки>) AS row_number
FROM contacts
where contacts.deleted=0
) AS a
WHERE row_number > 0
Далее выяснили, что данный запрос генерируется автоматически – точнее Suite CRM хочет выполнить запрос «SELECT <набор полей> FROM contacts where contacts.deleted=0 ORDER BY <условие сортировки>» для отображение первой «странице» списка клиентов, для этого вызывает процедуру из пакета для работы с MS SQL server limitQuery. В limitQuery передает запрос, количество записей на странице (21) и начальную строку на страницу 0. Внутри процедуры limitQuery текст запроса меняется:
• к запросу добавляется функция получения номера строки
• внутри сервера БД происходит выполнение запроса выделенного курсивом
• Сервер внутри себя делает выборку всех строк возвращаемых запросом (в нашем случае всех записей о клиентах, которых сейчас более 2 млн)
• Внешний запрос из всех записей выбирает записи с номером строки более начального (в нашем случае 0)
Проблема также заключается в том, что функция limitQuery используется для получения данных по всем спискам в системе – это все списки (включая результаты поисков), все субпанели и все списка в дашлетах на стартовой странице. Соответственно, при росте количества записей в каком либо модуле, гарантированно будет проблема с открытием его списка.
Есть ли кто-то на форуме, кто сталкивался с подобными трудностями и/или знает как это можно обойти?