AxBuild для параллельной компиляции

AxBuild.exe — X++ в p-code

С помощью утилиты AxBuild.exe можно выполнить глобальную компиляцию всего кода Х++ в AX p-код, во много раз быстрее, чем традиционная компиляция, которая запускается из среды разработки. AxBuild.exe запускается на уровне AOS через командную строку (cmd.exe). Данная утилита предполагает компиляцию только в p-код.

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

Архитектура

    AxBuild.exe устанавливается в ту же папку, где развернут AOS. Утилита запускает несколько новых, но временных экземпляров AOS. Каждый временный AOS использует ту же конфигурационную информацию из реестра, которая используется постоянным AOS, который вы идентифицируете с параметром /aos.

Конфигурация сервера показывает номер экземпляра AOS, который необходимо использовать в параметре /aos.

    AxBuild.exe управляет работой каждого временного AOS, который он создал. Указывает каждому AOS с какой частью кода, тот будет работать. Собирает результаты выполнения от каждого AOS и выводит их на консоль и записывает в файл лога.

Архитектура компиляции Х++ на уровне AOS

Компиляция на уровне клиента

    В прошлом, чтобы выполнить глобальную компиляцию X++, нужно было запустить ее из меню клиента. Такая операция трехуровневая и поэтому происходит постоянный обмен данными между клиентом и AOS. Напротив, подход AxBuild.exe это двухуровневая операция. Одна из причин такого подхода, это исключение обмена данными по сети или через Local RPC между клиентом и AOS. Компиляция же на клиенте не позволяет разделить нагрузку между несколькими приложениями.

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

Архитектура компиляции X++ на уровне клиента

    На клиенте можно быстро компилировать отдельные методы Х++. Такая компиляция чрезвычайно эффективна для разработчика, который добавляет код посредством цикличного кодирования, а затем тестирования. В то же время AxBuild.exe не может компилировать какое-либо отдельное подмножество кода.

Также клиент остается единственным способом компиляции p-кода AX в .NET CIL.

Прирост производительности

    Каждая среда различна и поэтому производительность, полученная при тестировании пользователями будет конечно отличаться, от представленных здесь. В проведенных тестах производительности AxBuild.exe было получено 92% сокращение времени полной компиляции. AxBuild.exe завершил выполнение в 13 раз быстрее, чем клиент, при этом использовалось одинаковое «железо». Клиент и сервер были установлены на одном компьютере.

Программное обеспечение:

  • Microsoft Dynamics AX 2012 R2 with cumulative update 7.
  • Microsoft SQL Server 2012 SP1 Enterprise (no limit on memory).
  • Microsoft Windows Server 2012.

«Железо»:

  • 4 processor cores, at 3.7 gigahertz.
  • Hyper-threading enabled, which logically doubles the number of cores.
  • 32 gigabytes of active memory.
  • 6.0 gigabits SATA controller.
  • Virtual page caching disabled.

На данном компьютере AxBuild.exe запустил 9 временных AOS.

Результаты тестирования:

AxBuild.exe: 10.7 минут.

Клиент: 146.0 минут.

146.0 / 10.7 = 13.6

В другом измерении, был создан для работы только один AOS и он выполнил компиляцию на 28% быстрее, чем тот же самый процесс, запущенный с клиента, т.к. не было трансфера данных между клиентом и сервером.

Как запустить AxBuild.exe

    Произведем подготовку и проверим, что:

  • Имеется установленный CU 7 for Microsoft Dynamics AX 2012 R2.
  • Запуск AxBuild.exe будет производится под учетной записью, которая имеет не меньше прав, чем учетная запись из под которой работает реальный AOS.
  • Убедимся, что отключена опция «hot-swapping of .NET assemblies (горячее подключение сборок .Net)», которая настраивается в конфигурации AOS.
  • Проверить наличие каталога, который указывается в параметре /altbin

Пример командной строки:

axbuild.exe xppcompileall /s=01 /altbin=»C:\Program Files (x86)\Microsoft Dynamics AX\6.0\Client\Bin»

Вывод данных AxBuild.exe

    Вывод в консоль

    AxBuild.exe выводит процесс работы в консоль через дескриптор stdout. Дескриптор strerr не используется. Каждый элемент AOT отображается в момент компиляции. Некоторые элементы могут быть выведены несколько раз, в процессе компиляции. Эти повторения иногда необходимы, потому что полные метаданные не всегда доступны для удовлетворения всех зависимостей до более поздних этапов компиляции.

    Вывод в лог файлы

    AxBuild.exe создает два файла лога. Можно контролировать место, куда будут сохраняться лог файлы используя параметр /log. По умолчанию файлы сохраняются в подкаталог Server\…\Log\ каталога сервера, например:

C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\Log\

Рассмотрим лог файлы

AxCompileAll.html – содержит список всех ошибок в XML формат. Это позволяет импортировать его в среду разработки. Для этого в окне «Сообщения компилятора» на панели кнопок нажать «>>» и выбрать «Импорт». Откроется диалог выбора файла, необходимо перейти в папку, где находится файл лога, выбрать его и нажать «Открыть». После этого будет загружен список ошибок в «Сообщения компилятора», где можно уже удобно переходить к месту ошибки.

AOTCompile.log — содержит информацию, которая частично дублирует информацию, записанную на консоль

Временные файлы

AxBuild.exe хранить временные файлы в каталоге %TEMP%. Эти файлы содержат много деталей о процессе. По умолчанию эти файлы удаляются при завершении AxBuild.exe, но эти файлы можно оставить, если при запуске AxBuild.exe использовать параметр /nocleanup.

Параметры AxBuild.exe

Имя параметров не чувствительны к регистру. Во всех случаях, где для параметра используется сопровождающее значение, то значение указывается после знака «=», например, /aos=01.

AxBuild.exe always returns 0.

Опишем каждый параметр.

Xppcompileall — обязательный. Указывает, что необходима полная компиляции кода X++, создание нового p-кода и сохранение его в базе данных модели. Параметр не имеет сопровождающего значения и нет ведущего «/». Этот параметр является командой, указывающей тип действия, который должна выполнить программа. Пока это единственный такой параметр.

/altbin (/a) — не обязательный. Указывается путь к каталогу, на компьютере где установлен AOS, с файлами DLL, которую установлены с помощью клиента ax32.exe. AxBuild.exe проверят, что ax32.exe находится в каталоге, перед тем как начнет выполнять компиляцию. Обычно используется путь, куда была произведена установка. Необходимо подтвердить правильный путь для конкретной среды, например:

C:\Program Files(x86)\Microsoft Dynamics AX\6.0\Client\Bin\

Одним из способов создания и заполнения такого каталога, является установка клиентской части в компьютер с AOS, даже если им никто не будет пользоваться. После этого, каждый разработчик, который добавляет стороннюю DLL в свою собственную клиентскую директорию, должен убедиться, что эта же DLL вручную скопирована на компьютер с AOS, в соответствующий каталог, если там предполагается запускать AxBuild.exe.

Если клиент ax32.exe не установлен на компьютере с AOS, то каталог необходимо создать вручную и заполнить его всеми DLL с клиентской установки на другом компьютере.

Если данный параметр опустить, то AxBuild.exe будет проверять информацию клиентской конфигурации в реестре, чтобы найти вернуть путь.

/aos (/s) – чаще необязательный. Указывается номер экземпляра AOS, который установлен на компьютере, где запускается AxBuild.exe.

    Если опустить этот параметр, AxBuild.exe проверяет информацию о конфигурации AOS в реестре Windows. Если реестр содержит информацию о единственном экземпляре AOS, то он используется по умолчанию для этого параметра. Все временные экземпляры AOS использую одну и ту же конфигурацию, которая принадлежит AOS, номер которого указан в параметре.

    Список всех доступных AOS можно посмотреть в Microsoft Dynamics AX Server Configuration Utility, AxSrvCfg.exe. В верху окна приложения имеется выпадающий список, который помечен как Application Object Server Instance. Вероятнее всего, чаще всего будет использоваться значение 01, например /aos=01.

Параметры /dbserver и /modelstore доступны, когда необходимо переопределить информацию, которая указана в конфигурации AOS.

/compiler (/с) – иногда обязательный. Параметр /с может отсутствовать в списке команд, который можно получить командой /help, но данный параметр полностью поддерживается.

    Параметр нужен только в том случае, когда текущая директория не является директорией, которая содержит ax32serv.exe. В этом случае значением параметра будет файл ax32serv.exe и путь до него. Пример:

/compiler=»C:\Program Files\Microsoft Dynamics AX\6.0\Server\bin\ax32serv.exe»

    При автоматизации запуска полной компиляции вероятно стоит указывать значение для этого параметра.

/dbserver (/d) – необязательный. Для параметра указывается значение имени Microsoft SQL Server, в котором хранится модель данных Ax.

    Обычно данный параметр не используется. Программа берет информацию из конфигурации AOS, который был указан в /aos.

/help (/h or /?) – необязательный. Выводит информацию о всех параметрах в консоли. Параметр не имеет принимаемого значения. Параметр используется, если программа была запущена без указания каких-либо параметров.

/log (/l) – необязательный. Указывается путь, где будут хранится два лог файла.

По умолчанию это директория Server\…\Log\, которая находится в директории AOS. Это значение хранится в реестре, в ветке:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\

Dynamics Server\6.0\01\Original (конфигурация)

    В параметре нельзя указать имя файла, указывается только путь.

/verbose – параметр влияет на количество информации, которая будет записываться в лог.

/modelstore (/m) – необязательный. Задает имя базы модели данных.

    Обычно данный параметр не используется. Программа берет информацию из конфигурации AOS, который был указан в /aos.

/nocleanup (/n) – необязательный. Параметр указывает, что временные файлы после окончания работы программы не будут удалены из папки %TEMP%.

Параметр не принимает значение. По умолчанию программа удаляет временные файлы.

/verbose (/v) – необязательный. Параметр говорит программе, что необходимо писать всю информацию о трассировке и диагностическую информацию в файл AOTComp.log file.

    Параметр не имеет принимающего значения. Обычно записывается только подмножество информации, которую можно просмотреть на экране в консоли.

/workers (/w) – необязательный. Указывается количество временных AOS, которые будет работать параллельно и будут использоваться для процесса компиляции.

    Программа рассчитывает число на основании доступных ядер процессора. Но можно указать число в ручную, но необходимо помнить, что на одно ядре процессора может быть запущено от 1 до 4 AOS.

Ограничение компиляции на AOS

    Объект .Net не может быть создан

    Когда запускается компилятор X++, то он выполняет специальные компиляции нескольких классов. Эти классы включают Application, Infolog и ClassFactory. Когда компилируются эти классы, во время компиляции на уровне AOS, они терпят неудачу, если в них был добавлен код, который вызывает interop в .NET Framework. Рекомендуется не изменять методы в этих классах.

    Вызовы COM объектов не могут быть связаны

    В X++ иногда используется цепочка вызовов методов, например:

myThing.method8().method9();

     Этот синтаксис цепочки верный, только если возвращаемый тип метода method8 имеет метод с именем method9.

    Когда компиляция происходит с использованием AxBuild.exe, синтаксис методов цепочкой не может использоваться с COM объектами. Компилятор не может определить, имеет ли COM объект, возвращаемый методом method8, метод с именем method9.

    Чтобы решить данную проблему необходимо использовать синтаксис, который давал бы компилятору информацию о типе, необходимую для проверки вызова метода method9.

    Пример ошибочного синтаксиса:  

void methodXpp()
{
    COM comInstanceA = new COM("MyCOMType_A");
    comInstanceA.method1().method2();
}

    Пример верного синтаксиса:

void methodXpp()
{
    COM comInstanceA = new COM("MyCOMType_A");
    COM comInstanceB;

    comInstanceB = comInstanceA.method1();
    comInstanceB.method2();
}

   Пример запуска из командной строки компиляции c двумя AOS:

Console for AxBuild.exe

microsoft.com

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar