Как отследить память для скрипта Python - PullRequest
4 голосов
/ 10 сентября 2011

У нас есть система, которая имеет только одного переводчика. Многие пользовательские скрипты проходят через этот интерпретатор. Мы хотим ограничить использование памяти каждым скриптом. Существует только процесс, и этот процесс вызывает тасклеты для каждого сценария. Так как у нас только один интерпретатор и один процесс, мы не знаем, как ограничить использование памяти каждым скриптом. Каков наилучший способ сделать это

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

Я не думаю, что это вообще возможно. Ваши вопросы подразумевают, что память, используемая вашими тасклетами, полностью разделена, что, вероятно, не так. Python оптимизирует небольшие объекты, такие как целые числа. Насколько я знаю, например, каждый 3 в вашем коде использует один и тот же объект, что не является проблемой, потому что он неизменен. Так что, если два ваших тасклета используют одно и то же (маленькое?) Целое число, они уже делят память. ; -)

0 голосов
/ 10 сентября 2011

Память разделена на уровне процесса ОС.Нет простого способа определить, к какому тасклету и даже к какому потоку относится конкретный объект.

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

Если вы не заинтересованы в написании специального интерпретатора Python, лучше всего использовать процесс для каждой задачи.

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

Если вам нужно разделить большие объемы общих данных между задачами, используйте разделяемую память;для небольших взаимодействий используйте сокеты (с уровнем обмена сообщениями над ними по мере необходимости).

Да, это может быть медленнее, чем ваша текущая настройка.Но из-за того, что вы используете Python, я полагаю, что в этих сценариях вы все равно не выполняете срочные вычисления.

...