2011-05-23 2 views
2

J'ai un problème avec mon application django hébergée avec apache/mod_wsgi. J'ai ajouté du code matplotlib dans l'application, et les processus de travail apache se bloquent maintenant.Mod_wsgi worker processes segmentation fault (11)

Je réduit ce problème à ce qui suit:

  • sans aucune application importations matplotlib fonctionne bien
  • lorsque « matplotlib à l'importation » est ajouté partout dans l'application, les processus de travail meurent avec segfault et les utilisateurs ne voient pas la réponse du serveur
  • "matplotlib import" fonctionne très bien dans l'interpréteur python de ligne de commande - segfault ne se produit que dans les processus apache

est ici t il entrée du journal:

[Tue May 24 08:29:08 2011] [notice] child pid 17576 exit signal Segmentation fault (11) 

Je ne peux pas reproduire le problème sur un autre ordinateur. J'ai essayé d'enlever (rm site-packages/matplotli *) et installer différentes versions de matplotlib (0.99.3, 1.0.0, 1.0.1) J'ai essayé d'installer tous les modules dans virtualenv et pointez sur virtualenv à partir de mon .wsgi scénario.

J'ai essayé ceci: Error: child pid 6695 exit signal Segmentation fault (11) Je lis http://code.google.com/p/modwsgi/wiki/ aussi bien. Tous les pointeurs sur la façon de déboguer/contourner ce problème seront très appréciés.

(je suis même prêt à passer à un autre serveur (pâte/cherrypy + apache mod_proxy, etc.) pour éliminer le problème.)

Voici mes paramètres apache:

/usr/sbin/httpd -V

Server version: Apache/2.2.15 (Unix) 
Server built: Apr 10 2010 11:21:07 
Server's Module Magic Number: 20051115:24 
Server loaded: APR 1.3.9, APR-Util 1.3.10 
Compiled using: APR 1.3.9, APR-Util 1.3.9 
Architecture: 32-bit 
Server MPM:  Prefork 
    threaded:  no 
    forked:  yes (variable process count) 
Server compiled with.... 
-D APACHE_MPM_DIR="server/mpm/prefork" 
-D APR_HAS_SENDFILE 
-D APR_HAS_MMAP 
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) 
-D APR_USE_SYSVSEM_SERIALIZE 
-D APR_USE_PTHREAD_SERIALIZE 
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT 
-D APR_HAS_OTHER_CHILD 
-D AP_HAVE_RELIABLE_PIPED_LOGS 
-D DYNAMIC_MODULE_LIMIT=128 
-D HTTPD_ROOT="/etc/httpd" 
-D SUEXEC_BIN="/usr/sbin/suexec" 
-D DEFAULT_PIDLOG="logs/httpd.pid" 
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status" 
-D DEFAULT_LOCKFILE="logs/accept.lock" 
-D DEFAULT_ERRORLOG="logs/error_log" 
-D AP_TYPES_CONFIG_FILE="conf/mime.types" 
-D SERVER_CONFIG_FILE="conf/httpd.conf" 

/usr/sbin/httpd -l

Compiled in modules: 
    core.c 
    prefork.c 
    http_core.c 
    mod_so.c 

/usr/sbin/httpd -M

Loaded Modules: 
core_module (static) 
mpm_prefork_module (static) 
http_module (static) 
so_module (static) 
auth_basic_module (shared) 
auth_digest_module (shared) 
authn_file_module (shared) 
authn_alias_module (shared) 
authn_anon_module (shared) 
authn_dbm_module (shared) 
authn_default_module (shared) 
authz_host_module (shared) 
authz_user_module (shared) 
authz_owner_module (shared) 
authz_groupfile_module (shared) 
authz_dbm_module (shared) 
authz_default_module (shared) 
ldap_module (shared) 
authnz_ldap_module (shared) 
include_module (shared) 
log_config_module (shared) 
logio_module (shared) 
env_module (shared) 
ext_filter_module (shared) 
mime_magic_module (shared) 
expires_module (shared) 
deflate_module (shared) 
headers_module (shared) 
usertrack_module (shared) 
setenvif_module (shared) 
mime_module (shared) 
dav_module (shared) 
status_module (shared) 
autoindex_module (shared) 
info_module (shared) 
dav_fs_module (shared) 
vhost_alias_module (shared) 
negotiation_module (shared) 
dir_module (shared) 
actions_module (shared) 
speling_module (shared) 
userdir_module (shared) 
alias_module (shared) 
rewrite_module (shared) 
wsgi_module (shared) 
ssl_module (shared) 
Syntax OK 

Apache config

<VirtualHost *:443> 

    ServerName    somesite.com 
    DocumentRoot   "/somedir" 

    WSGIApplicationGroup %{GLOBAL} 
    WSGIScriptAlias//somedir/production.wsgi 

    <..> 

</VirtualHost> 

Répondre

3

Dans le wiki vous a dit que vous lisez, vous devriez avoir trouvé:

http://code.google.com/p/modwsgi/wiki/DebuggingTechniques#Debugging_Crashes_With_GDB

En remarque, il est recommandé de ne pas utiliser le mode prefork/embedded. Mode démon utilisateur mod_wsgi si vous êtes obligé d'utiliser prefork MPM. Lire:

http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html

pour quelques-unes des raisons pour lesquelles.

D'autres personnes ont matplotlib fonctionnant avec mod_wsgi, donc pas évident tout de suite quel est le problème.

+0

Merci Graham, très apprécié. Bien que je ne pouvais pas déboguer des plantages avec GDB (je ne peux pas éteindre ce serveur particulier et ne peux pas reproduire le problème sur un autre ordinateur), je vais essayer ceci et afficher les résultats le cas échéant. J'utilise cherrypy + mod_proxy comme solution de contournement. – user466176

+1

Si vous utilisez le mode démon de mod_wsgi, vous n'avez pas besoin d'éteindre tout le serveur. Vous attachez simplement gdb à pid du processus du démon tel que documenté, puis déclenchez la demande pour provoquer l'échec. –