Как включить совместное использование памяти между работниками в приложении GAE на основе Flask (Python/Gunicorn) — пробPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как включить совместное использование памяти между работниками в приложении GAE на основе Flask (Python/Gunicorn) — проб

Сообщение Anonymous »

В Gunicorn каждый рабочий процесс по умолчанию загружает весь код приложения. Это приводит к увеличению использования памяти и случайным OOM (ошибкам нехватки памяти).
Я хочу включить опцию --preload для Gunicorn, чтобы рабочие обращались к памяти главного процесса, тем самым экономя используемой памяти и предотвращения ошибок OOM.
Я начал с добавления флага --preload, однако при измерении RSS и общей памяти (с использованием psutil) отдельных рабочих процессов я обнаружил, что никакой разницы по сравнению с тем, когда я развертываю без --preload.
Я обнаружил концепцию под названием Copy-on-Read в статье об отключении сборщика мусора в Instagram (https://medium.com/ binu-22feet/dismissing-python-garbage-collection-at-instagram-37faf66828ad), указывающий, как подсчет ссылок и сбор мусора CPython вызывают копирование при записи даже при чтении.
Следующее статье, я сделал то же самое, что и они, однако даже это не имело никакой разницы для моего приложения по сравнению с развертыванием без --preload.
Как мне заставить рабочих разделять память?

Пример кода:
app.yaml:

Код: Выделить всё

runtime: python311
instance_class: F2
entrypoint: gunicorn -b :$PORT -w 4 --preload --config gunicorn.conf.py app_main:app

automatic_scaling:
min_idle_instances: 1
app_main.py

Код: Выделить всё

> import os
> import gc
> import atexit
> from flask import Flask
>
> gc.set_threshold(0)
> atexit.register(os._exit, 0)
>
> app = Flask(__name__)
>
> @app.route('/')
> def hello():
>   return "Hello, World!"
>
> if __name__ == '__main__':
>   app.run()
gunicorn.conf.py

Код: Выделить всё

> import psutil
> import logging
> from google.cloud import logging as cloud_logging
>
> def post_fork(server, worker):
>   # Disable GC inside worker processes as well
>   gc.set_threshold(0)
>   atexit.register(os._exit, 0) # from IG's analysis
>
>   try:
>     client = cloud_logging.Client()
>     client.setup_logging()
>   except Exception as e:
>     logging.basicConfig(level=logging.INFO)
>
>   process = psutil.Process()
>   pid = process.pid
>
>   mem = process.memory_info().rss / (1024 ** 2)
>   shared = process.memory_info().shared / (1024 ** 2)
>
>   logging.info(f"Process {pid} memory: {mem:.2f} MB")
>   logging.info(f"Process {pid} shared memory: {shared:.2f} MB")
>
>   \# Log memory of master process
>   mpid = psutil.Process(pid).ppid()
>   mp = psutil.Process(mpid)
>
>   mmem = mp.memory_info().rss / (1024 ** 2)
>   mshared = mp.memory_info().shared / (1024 ** 2)
>
>   logging.info(f"Master {mpid} memory: {mmem:.2f} MB")
>   logging.info(f"Master {mpid} shared memory: {mshared:.2f} MB")
Во всех экспериментах, которые я проводил до сих пор, общая память всегда равна 0 для всех рабочих и даже главного процесса.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ython-guni
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»