передается в командную строку, проблема с памятью исчезла, и загрузка ЦП в режиме ожидания обычно ниже 0,2%. Процессор и память выглядят так же, как если бы приложение Phoenix работало с консоли вне IIS.
аюсь создать прототип небольшого веб-приложения, чтобы узнать, смогу ли я использовать Phoenix и Elixir для создания веб-приложений для интрасети, которые будут использоваться моими сотрудниками в моей компании. Мы всегда были типичным магазином Microsoft .NET, но мне интересно играть с некоторыми другими технологиями, среди которых Elixir и Phoenix.
У меня работает виртуальная машинаWindows 10
а такжеIIS 8
, Я установилHttpPlatformHandler а также на виртуальной машине для запуска приложения Phoenix и передачи ему запросов от IIS (для этого есть причина, о которой я расскажу чуть позже).
Когда я запускаю свое приложение Phoenix в Windows автономно, оно работает отлично. Я не вижу никаких проблем. Когда я запускаю свое приложение Phoenix, используяHttpPlatformHandler
и IIS, я вижу, что процесс erl.exe постоянно работает и потребляет около35-40% процессора (я работаю с 2 ядрами и 8 ГБ оперативной памяти на виртуальной машине). Я также вижу, как память постоянно растет без остановки. Через пару минут он превысит 1 ГБ и перейдет к 2 ГБ (я наблюдаю за использованием памяти с помощью Process Explorer). В приложении Phoenix нет ни загрузки, ни активных запросов. Это происходит как в среде разработчиков, так и в продуктах.
Я хочу запускать Phoenix за IIS, потому что это приложение для внутренней сети, оно будет работать в домене Windows, и большинство пользователей будут пользователями Windows. Я создал плагин, который будет читать токен пользователя Windows изX-IIS-WindowsAuthToken
HTTP заголовок, которыйHttpPlatformHandler
добавляет к запросам, которые он перенаправляет в процесс Phoenix, и я использую набор NIFS для вызова Windows API, чтобы получить Windows SID и домен \ имя пользователя аутентифицированного пользователя, чтобы установить сеанс и авторизовать пользователя.
Кто-нибудь пробовал это раньше и видел ту же проблему? Я относительно новичок в отладке Elixir и Phoenix и хотел бы получить несколько советов о том, что я могу сделать, чтобы попытаться выяснить, почему среда выполнения Erlang делает это, или как определить, что я делаю в своем коде.
Я не уверен, что это я, потому что я вижу, что это происходит в простом приложении Phoenix, которое генерируется недавно с использованиемmix phoenix.new
.
Для справки, вот мойweb.config
для моего приложения Phoenix:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="httpplatformhandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
</handlers>
<httpPlatform processPath="C:\Projects\neucode\run.bat"
arguments=""
stdoutLogEnabled="true"
forwardWindowsAuthToken="true">
<environmentVariables>
<environmentVariable name="MIX_ENV" value="prod"/>
</environmentVariables>
</httpPlatform>
</system.webServer>
</configuration>
мойrun.bat
файл:
mix phoenix.server
Я очень ценю любую помощь или предложения, которые может предоставить любой. Пожалуйста, дайте мне знать, если я могу предоставить что-нибудь еще, что поможет диагностировать проблему.
Заранее спасибо.
ОБНОВИТЬ
Я выяснил, как подключиться к моему приложению Phoenix, работающему в IIS, с помощью Observer благодаряэтот смысл, Похоже, что проблемным процессом является пользовательский процесс:
Я начал отслеживать этот процесс и порт, с которым он связан, и вижу непрерывный поток событий, которые, как я предполагаю, являются событиями приема с пустыми данными:
Я думаю, оглядываясь по сторонам, что это процесс пользователя ядра. Кто-нибудь знает, как я могу понять, что это за порт и почему он посылает непрерывный поток событий?