Я хочу включить опцию --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
Код: Выделить всё
> 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()
Код: Выделить всё
> 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")
Подробнее здесь: https://stackoverflow.com/questions/790 ... ython-guni