Вопрос

Я размещаю IronPython в WebService на основе c #, чтобы иметь возможность предоставлять собственные сценарии расширения. Однако я обнаружил, что использование памяти резко увеличивается, когда я выполняю простое нагрузочное тестирование, многократно выполняя веб-сервис в цикле.

IronPython-1.1 реализовал IDisposable на своих объектах, так что вы можете избавиться от них, когда они будут сделаны. Новый движок IronPython-2, основанный на DLR, не имеет такой концепции.

Из того, что я понял, каждый раз, когда вы выполняете скрипт в ScriptEngine, новая сборка внедряется в домен приложения и не может быть выгружена.

Есть ли способ обойти это?

Это было полезно?

Решение 3

Оказывается, после того, как aspnet_wp достигает 500 Мб, сборщик мусора включается и убирает беспорядок. Затем объем используемой памяти падает примерно до 20 МБ и снова начинает увеличиваться во время нагрузочного тестирования. Таким образом, нет утечки памяти как таковой.

Другие советы

Вы можете попробовать создать новый домен приложений каждый раз, когда запускаете один из ваших сценариев IronPython. Хотя сборки не могут быть выгружены из памяти, вы можете выгрузить домен приложения, и это позволит вам извлечь внедренную сборку из памяти.

Вам необходимо отключить создание оптимизированного кода:

var runtime = Python.CreateRuntime();
var engine = runtime.GetEngine("py");
PythonCompilerOptions pco = (PythonCompilerOptions)engine.GetCompilerOptions();
pco.Module &= ~ModuleOptions.Optimized;

// this shouldn't leak now
while(true) {
   var code = engine.CreateScriptSourceFromString("1.0+2.0").Compile(pco);
   code.Execute();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top