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 配置,以便评论您是否应该采取其他不同的做法。
我有 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 配置,以便评论您是否应该采取其他不同的做法。