"[Errno 12] Невозможно выделить память" в Geoip2() в Django с помощью uWSGI

Следующий код успешно выполняется в manage.py shell:

from django.contrib.gis.geoip2 import GeoIP2
g = GeoIP2()

Если я запускаю сервер вручную с manage.py runserverи поместите код в моем представлении Django, он также работает нормально.

Мое приложение Django размещено на uWSGI а также Nginx в качестве обратного прокси. И то и другое uWSGI а также Nginx бежать с www-data пользователь.

Вот исключение, которое я получаю при запуске на uWSGI:

...
File "/home/myuser/Env/virtenv/myproject/index/views.py" in index
  28.     g = GeoIP2()

File "/home/myuser/Env/virtenv/local/lib/python2.7/site-packages/django/contrib/gis/geoip2/base.py" in __init__
  95.                 self._city = geoip2.database.Reader(city_db, mode=cache)

File "/home/myuser/Env/virtenv/local/lib/python2.7/site-packages/geoip2/database.py" in __init__
  82.         self._db_reader = maxminddb.open_database(filename, mode)

File "/home/myuser/Env/virtenv/local/lib/python2.7/site-packages/maxminddb/__init__.py" in open_database
  37.         return maxminddb.reader.Reader(database, mode)

File "/home/myuser/Env/virtenv/local/lib/python2.7/site-packages/maxminddb/reader.py" in __init__
  52.                     db_file.fileno(), 0, access=mmap.ACCESS_READ)

Exception Type: error at /
Exception Value: [Errno 12] Cannot allocate memory

Локальные переменные:

Variable    Value
database    '/home/myuser/Env/virtenv/myproject/geoip/GeoLite2-City.mmdb'
db_file     <closed file '/home/myuser/Env/virtenv/myproject/geoip/GeoLite2-City.mmdb',     mode 'rb' at 0x7f8c5cf5d390>
mode        0
self        <maxminddb.reader.Reader object at 0x7f8c5cf5f550>

Я использую Virtualbox и моя гостевая ОС Ubuntu 16.04, У меня там 4ГБ файл подкачки. Если я освобождаю ОЗУ, проблема не устраняется. Однако это не должно вызывать проблем с памятью на уровне ОС, поскольку я могу создать объект GeoIP2 в оболочке, а также, если я запускаю сервер вручную.

Следующее, что я проверил, это то, что geoip каталог в моем проекте принадлежит www-data и имеет 775. Оба файла внутри (GeoLite2-City.mmdb а также GeoLite2-Country.mmdb) также принадлежат www-data и имеют 774.

/etc/systemd/system/uwsgi.service содержит:

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStartPre=/bin/bash -c 'mkdir -p /run/uwsgi; chown www-data:www-data /run/uwsgi'
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

/etc/uwsgi/sites/my_site.ini содержит:

[uwsgi]

project = myproject
base = /home/myuser
home = %(base)/Env/virtenv/%(project)

binary-path = /usr/local/bin/uwsgi
chdir = %(home)
chmod-socket = 660
chown-socket = www-data:www-data
#emperor = true
#enable-threads = true
gid = www-data
limit-as = 1024
logto = /tmp/uwsgi.log
master = true
module = myproject.wsgi:application
pidfile = /opt/logs/uwsgi/master.pid
# number of cores on machine
processes = 2
python-path = %(home)
py-autoreload = 2
socket = /run/uwsgi/%(project).sock
uid = www-data
vacuum = true
virtualenv = %(base)/Env/virtenv
vhost = true
workers = 4

env = AWS_KEY=***************
env = AWS_SECRET=***************
env = DJANGO_SETTINGS_MODULE=myproject.settings.local
env = GMAIL_PASS=***************
env = PSQL_PASS=***************
env = SECRET_KEY=*********************************************

Мне интересно, где ограничение uWSGI является?

1 ответ

Решение

limit-as = 512 в УССИ ini Файл был виновником. Удвоить это 1024 мб решает проблему.

Из официальной документации uWSGI 2 здесь:

ограничить, поскольку

Аргумент: номер

Ограничить адресное пространство процесса (vsz) (в мегабайтах).

Ограничивает использование адресного пространства каждого uWSGI (рабочего) процесса, используя POSIX/UNIX setrlimit(). Например, ограничение limit-256 не позволит процессам uWSGI расти более чем на 256 МБ адресного пространства. Адресное пространство - это виртуальная память, к которой у процесса есть доступ. Это не соответствует физической памяти. Прочтите и поймите эту страницу, прежде чем активировать эту опцию: http://en.wikipedia.org/wiki/Virtual_memory

Другие вопросы по тегам