Python - RuntimeError: populate() isn't reentrant

Python - RuntimeError: populate() isn't reentrant

我有 Graphite 服务器,但它的守护进程间歇性地因这个错误而失败,

HTTP CRITICAL: HTTP/1.1 500 Internal Server Error - string 'datapoints' not found on 'http://192.168.12.15:8000/render/?target=sys.example_com.snmp.if_octets-Gi0_0_0.rx&format=json&from=-5min' - 723 bytes in 0.002 second response time |time=0.002067s;;;0.000000 size=723B;;;0

所以我重新启动了 apache,解决了这个问题。但我想解决这个问题的根本原因,我不能每次都重新启动 apache。我想永久解决这个问题。这是我在错误日志中发现的,

[Tue Aug 01 20:16:01] [wsgi:error] RuntimeError: populate() isn't reentrant
[Tue Aug 01 20:16:21] [wsgi:error] Target WSGI script '/usr/lib/python2.7/dist-packages/graphite/wsgi.py' cannot be loaded as Python module.
[Tue Aug 01 20:16:21] [wsgi:error] Exception occurred processing WSGI script '/usr/lib/python2.7/dist-packages/graphite/wsgi.py'.
[Tue Aug 01 20:16:21] [wsgi:error] Traceback (most recent call last):
[Tue Aug 01 20:16:21] [wsgi:error] File "/usr/lib/python2.7/dist-packages/graphite/wsgi.py", line 14, in <module>
[Tue Aug 01 20:16:21] [wsgi:error] application = get_wsgi_application()
[Tue Aug 01 20:16:21] [wsgi:error] File "/usr/lib/python2.7/dist-packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Tue Aug 01 20:16:21] [wsgi:error] django.setup()
[Tue Aug 01 20:16:21] [wsgi:error] File "/usr/lib/python2.7/dist-packages/django/__init__.py", line 21, in setup
[Tue Aug 01 20:16:21] [wsgi:error] apps.populate(settings.INSTALLED_APPS)
[Tue Aug 01 20:16:21] [wsgi:error] File "/usr/lib/python2.7/dist-packages/django/apps/registry.py", line 78, in populate

这是我的 /usr/lib/python2.7/dist-packages/graphite/wsgi.py 文件,

import os
import sys

try:
    from importlib import import_module
except ImportError:
    from django.utils.importlib import import_module

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'graphite.settings')  # noqa

from django.conf import settings
from django.core.wsgi import get_wsgi_application

application = get_wsgi_application()

try:
    import whitenoise
except ImportError:
    whitenoise = False
else:
    # WhiteNoise < 2.0.1 does not support Python 2.6
    if sys.version_info[:2] < (2, 7):
        whitenoise_version = tuple(map(
                int, getattr(whitenoise, '__version__', '0').split('.')))
        if whitenoise_version < (2, 0, 1):
            whitenoise = False

if whitenoise:
    from whitenoise.django import DjangoWhiteNoise
    application = DjangoWhiteNoise(application)
    prefix = "/".join((settings.URL_PREFIX.strip('/'), 'static'))
    for directory in settings.STATICFILES_DIRS:
        application.add_files(directory, prefix=prefix)
    for app_path in settings.INSTALLED_APPS:
        module = import_module(app_path)
        directory = os.path.join(os.path.dirname(module.__file__), 'static')
        if os.path.isdir(directory):
            application.add_files(directory, prefix=prefix)

更新

这是我正在使用的 Graphite 配置文件,

<VirtualHost *:8000>
  ServerName graphite-web

  ## Vhost docroot
  DocumentRoot "/var/www"
  ## Alias declarations for resources outside the DocumentRoot
  Alias /static "/var/lib/graphite/webapp/content"

  ## Directories, there should at least be a declaration for /var/www

  <Directory "/var/www">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Require all granted
  </Directory>

  ## Logging
  ErrorLog "/var/log/apache2/graphite-web_error.log"
  ServerSignature Off
  CustomLog "/var/log/apache2/graphite-web_access.log" combined
  WSGIScriptAlias / "/usr/lib/python2.7/dist-packages/graphite/wsgi.py"
</VirtualHost>

是什么导致了这个问题?请问有什么帮助吗?

您需要返回并在之前的日志中查找错误。也就是说,针对进程的第一个请求,或者如果启用了预加载,则在加载 WSGI 脚本时。您给出的错误不是根本原因,而是后续请求在第一次失败后失败的结果,因为 Django 初始化在第一次失败时不再可重入。

如果这是暂时性问题,您应该确保使用 mod_wsgi 守护程序模式并在 WSGIDaemonProcess 上设置 startup-timeout=15 作为从暂时性问题自动恢复的方法。暂时性故障的一个原因是 Apache 首次启动时数据库不可用。

您需要确保您拥有最新的 mod_wsgi 版本,而不是 Linux 发行版发布的旧版本以获得 startup-timeout 选项。

我还建议您在问题中添加您正在使用的 mod_wsgi 配置,以便评论您是否应该采取其他不同的做法。