Огромная разница в производительности между двумя веб-серверами, странное поведение при использовании монитора процессов
У нас есть два сервера Coldfusion, которые имеют огромную разницу в производительности и работают с одинаковым кодом на тех же самых входных данных. Код в вопросах создает большое количество CFC (компонентов Coldfusion, которые похожи на объекты в языках ООП).
Я сравнил два сервера, запустив Process Monitor и затем вызвав проблемный код на обеих машинах. Я узнал две вещи. Во-первых, Coldfusion открывает CFC-файлы каждый раз, когда создает экземпляр объекта. Это делают оба сервера, поэтому это не может быть причиной разницы в производительности. Во-вторых, быстрый сервер открывает файлы CFC напрямую, в то время как сервер с проблемой производительности, кажется, перемещается по пути, пока не достигнет желаемого файла CFC. Он делает это для каждого файла, даже для того, который был загружен ранее, и, поскольку код создает много экземпляров CFC, он становится очень медленным. Смотрите ниже частичные следы Promon, которые показывают это поведение. Для медленного сервера может потребоваться более 60 секунд, чтобы сделать то, что быстрый делает за 2 секунды.
Может кто-нибудь сказать мне, что вызывает такое поведение? Это установка Coldfusion? Поскольку Coldfusion работает поверх Java, это настройка Java? Это вариант ОС? Быстрый сервер работает под управлением Windows XP, и я думаю, что медленный сервер - это Windows Server 2003.
Дополнительный вопрос: Coldfusion, похоже, не выполняет никаких операций READ FILE над файлами CFC или CFM. Как это может быть?
Пример быстрого сервера, открывающего файлы CFC:
11:25:14.5588975 jrun.exe QueryOpen C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5592758 jrun.exe CreateFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5595024 jrun.exe QueryBasicInformationFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5595940 jrun.exe CloseFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5599628 jrun.exe CreateFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5601600 jrun.exe QueryBasicInformationFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
11:25:14.5602463 jrun.exe CloseFile C:\CF\wwwroot\APP\com\HtmlUtils.cfc
Эквивалентный пример медленного открытия файлов CFC на сервере:
11:15:08.1249230 jrun.exe CreateFile D:\
11:15:08.1250100 jrun.exe QueryDirectory D:\org
11:15:08.1252852 jrun.exe CloseFile D:\
11:15:08.1259670 jrun.exe CreateFile D:\org
11:15:08.1260319 jrun.exe QueryDirectory D:\org\cli
11:15:08.1260769 jrun.exe CloseFile D:\org
11:15:08.1269451 jrun.exe CreateFile D:\org\cli
11:15:08.1270613 jrun.exe QueryDirectory D:\org\cli\cpn
11:15:08.1271140 jrun.exe CloseFile D:\org\cli
11:15:08.1279312 jrun.exe CreateFile D:\org\cli\cpn
11:15:08.1280086 jrun.exe QueryDirectory D:\org\cli\cpn\APP
11:15:08.1280789 jrun.exe CloseFile D:\org\cli\cpn
11:15:08.1291034 jrun.exe CreateFile D:\org\cli\cpn\APP
11:15:08.1291709 jrun.exe QueryDirectory D:\org\cli\cpn\APP\com
11:15:08.1292224 jrun.exe CloseFile D:\org\cli\cpn\APP
11:15:08.1300568 jrun.exe CreateFile D:\org\cli\cpn\APP\com
11:15:08.1301321 jrun.exe QueryDirectory D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1301843 jrun.exe CloseFile D:\org\cli\cpn\APP\com
11:15:08.1312049 jrun.exe CreateFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1314409 jrun.exe QueryBasicInformationFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1314633 jrun.exe CloseFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1315881 jrun.exe CreateFile D:\
11:15:08.1316379 jrun.exe QueryDirectory D:\org
11:15:08.1316926 jrun.exe CloseFile D:\
11:15:08.1330951 jrun.exe CreateFile D:\org
11:15:08.1338656 jrun.exe QueryDirectory D:\org\cli
11:15:08.1339118 jrun.exe CloseFile D:\org
11:15:08.1526468 jrun.exe CreateFile D:\org\cli
11:15:08.1527295 jrun.exe QueryDirectory D:\org\cli\cpn
11:15:08.1527989 jrun.exe CloseFile D:\org\cli
11:15:08.1531977 jrun.exe CreateFile D:\org\cli\cpn
11:15:08.1532589 jrun.exe QueryDirectory D:\org\cli\cpn\APP
11:15:08.1533575 jrun.exe CloseFile D:\org\cli\cpn
11:15:08.1538457 jrun.exe CreateFile D:\org\cli\cpn\APP
11:15:08.1539083 jrun.exe QueryDirectory D:\org\cli\cpn\APP\com
11:15:08.1539553 jrun.exe CloseFile D:\org\cli\cpn\APP
11:15:08.1544126 jrun.exe CreateFile D:\org\cli\cpn\APP\com
11:15:08.1544980 jrun.exe QueryDirectory D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1545482 jrun.exe CloseFile D:\org\cli\cpn\APP\com
11:15:08.1551034 jrun.exe CreateFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1552878 jrun.exe QueryBasicInformationFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
11:15:08.1553044 jrun.exe CloseFile D:\org\cli\cpn\APP\com\HtmlUtils.cfc
Спасибо
3 ответа
В дополнение к ответу Адама Кэмерона я бы предложил сравнить C:\ColdFusion8\lib\neo*.xml на обеих машинах и проанализировать различия, особенно neo-runtime.xml и neo-debug.xml - вот где Конфиг для ColdFusion сохранен. Опубликуйте любые интересные отличия здесь.
Если у вас нет инструмента сравнения, используйте пробную версию BeyondCompare, так как он будет работать с целыми каталогами и хорошо поддерживает XML.
Мне кажется, что на медленном сервере у вас не установлен флажок "Кеш компонента" в CFAdmin ("Настройки сервера"> "Кэширование").
Другая возможность заключается в том, что между двумя серверами установлены разные сопоставления CF (Настройки сервера> Сопоставления) и / или пути пользовательских тегов (Расширения> Пользовательские пути тегов).
Это, скорее всего, будет первым, хотя.
Вы также можете установить "Кэширование шаблона в запросе" ("Настройки сервера"> "Кэширование"), чтобы запретить поиск файлов для того же CFC после первого для данного запроса, а если это рабочий сервер, установите флажок "Доверенный кеш" (Сервер Настройки> Кэширование), что предотвратит любые обращения к файловой системе, если файл уже был загружен один раз.
ColdFusion также будет поддерживать только определенное количество скомпилированных файлов в памяти за один раз, установленное параметром "Максимальное количество кэшируемых шаблонов" ("Настройки сервера"> "Кэширование"), и вам следует попытаться установить это, чтобы охватить общее количество файлов CFML (и Методы CFC, каждый из которых компилируется в свой класс) в вашем приложении. Очевидно, это обусловлено наличием достаточного объема ОЗУ, доступного для JVM, чтобы справиться с этим. Это может быть немного уравновешивающим действием.
Попробуйте проверить:
- Настройки JVM, особенно настройки памяти
- Убедитесь, что режим отладки выключен
- Настройки проверки на вирусы. Проверьте, пропущены ли файлы Java
- Проверьте где
cfdump
используется.