The error:
Embedded mode of mod_wsgi disabled by runtime configuration
is likely indicative of what your problem is.
It says that whatever URL you are asking for is resolving to a directory
containing a WSGI script where the name of the directory is:
/home/app/public_html/wsgi/ota/wsgi
This doesn't match the configuration your showed before for where the
application was being delegated to daemon process mode.
You before had:
WSGIDaemonProcess ussd_pull user=www-data group=www-data threads=200
WSGIScriptAlias /ussd /home/app/public_html/wsgi/ussd_pull.wsgi
<Directory /home/app/public_html/wsgi>
WSGIProcessGroup ussd_pull
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
The URL you are requesting can't be for that and whatever URL you are using is
mapping to a WSGI application which isn't being delegated to a daemon process
properly and instead is running in embedded mode.
This is evident because with WSGIRestrictEmbedded that error will only come up
if the WSGI application was going to run in embedded mode.
Your performance issue thus is that running Python web applications in embedded
mode can be sub optimal, especially when you are completely unrealistic in a
benchmark as you are and are overloading the server beyond what would likely be
reasonable traffic for your web site. You made it worse by issuing such a short
test with only 1000 requests, because all you have gone and measured is the
startup delays in loading your web application lazily into each Apache child
worker process when it was started on demand to suddenly meet the influx of
traffic.
Even if it had been properly delegated to the daemon process group, the
configuration of:
WSGIDaemonProcess ussd_pull user=www-data group=www-data threads=200
is still way over the top on threads.
I would start with using:
WSGIDaemonProcess ussd_pull processes=3 threads=5
You don't need the user and group options when you want it to run as the Apache
user.
Anyway, these are what you should do.
1. Find what part of the Apache configurations being used for the URL you are
requesting as it wasn't what you quoted before. You want the WSGIScriptAlias
that likely has:
WSGIScriptAlias /ussd /home/app/public_html/wsgi/ota/wsgi/ussd_pull.wsgi
2. Show what the other WSGI directives are around that point and in particular
the context of where the WSGIProcessGroup directive is. RIght now it doesn't
appear to be at either VirtualHost scope or in a correctly defined Directory
block matching the directory '/home/app/public_html/wsgi/ota/wsgi'.
3. Fix anything and validate that the WSGI application is actually running in
daemon mode by following the test:
http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Embedded_Or_Daemon_Mode
4. Drop the number of threads in the WSGIDaemonProcess that is being used,
perhaps starting with processes=3 and threads=5.
5. Keep in mind that running ab on a web server at full speed is a complete
unrealistic way of testing a server. Try instead with siege and use a measured
rate of traffic such as:
siege -i -d 10 -c 100 http://10.8.39.26/ussd/main
For 100 concurrent users even that is over the top as you wouldn't expect users
to be issuing requests very 10 seconds.
6. Go watch my PyCon talk:
http://lanyrd.com/2013/pycon/scdyzk/
It explains the sort of scenario you triggered by the way things are setup and
they way you are testing it.
Graham
On 10/06/2014, at 3:45 PM, Minh Tuan <[email protected]> wrote:
> Hi Graham,
> Sorry for late reply cause you make me realize that i have to do more study
> as i'm quite newbie in here.
> I read every words in your group, blog, also on stackoverflow that related to
> my configuration but seem i lack of many concepts thus cannot understand them
> thoroughly.
>
> Back to your questions, i tried some tests and don't know why getting
> unstable result (10.8.39.26 is my app server as you well know):
>
>
> app@application:~$ time curl "http://10.8.39.26:8080/ussd/main" > /dev/null
> 2&>1
>
>
> real 0m0.025s
>
> user 0m0.000s
>
> sys 0m0.016s
>
>
>
> app@application:~$ time curl "http://10.8.39.26:8080/ussd/main" > /dev/null
> 2&>1
>
>
> real 0m0.251s
>
> user 0m0.008s
>
> sys 0m0.012s
>
>
> Testing by:
> ab -n 1000 -c 200 http://10.8.39.26/ussd/main
> I got pretty good result as Time per request: 0.3 ms, Request per second:
> 3000 (#/sec).
>
> Testing by call Asynchronous requests with speed 100 request/sec, the app
> become laggy, Apache2 child processes reached to maximum (150), responded
> time at that moment is 3 seconds. After this test, i divide by time and get
> the number: ~50 requests/second that my web application can serve.
>
> About parameter as your advice:
> mod_wsgi.process_group = 'ussd_pull'
> mod_wsgi.application_group = ''
> Especially, i don't know where to put WSGIRestrictEmbedded directive. It
> should be "outside of any
> VirtualHost's". If i put it like this:
>
> WSGIRestrictEmbedded On
> <VirtualHost *:8080>
> ...
> </VirtualHost>
>
> The whole app is die with error log: Embedded mode of mod_wsgi disabled by
> runtime configuration: /home/app/public_html/wsgi/ota/wsgi
>
> As my python app is very tiny, it just dig in DB 1 fist time only, to
> retrieve a short text and dedicates that text in to global variable, then use
> this variables to respond every sequence requests, i expect my app can server
> at least 500 request/seconds as i'm in plenty of hardware resource.
>
> I'll upgrade to version 3.5 soon, it should be easy cause someone complied
> this version for my Debian distribution.
>
> Many thanks and wish you healthy.
> Tuan.
>
>
>
> On Mon, Jun 2, 2014 at 6:13 PM, Graham Dumpleton <[email protected]>
> wrote:
> What sort of throughput does your site get and how long is the average
> response time?
>
> A setting of threads=200 for daemon mode is ill advised and although the way
> mod_wsgi daemon works it should largely mitigate the problems that are caused
> by such an over the top value, Python's less than stellar threading model may
> cause issues.
>
> Also, have you validated that Apache is matching incoming requests properly
> and routing them into the daemon process? You can check where the request is
> being handled by doing the tests:
>
>
> http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Embedded_Or_Daemon_Mode
>
> http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Sub_Interpreter_Being_Used
>
> To be safe and ensure things aren't executing in embedded mode, I would
> suggest adding WSGIRestrictEmbedded directive to disable embedded mode
> altogether.
>
> http://blog.dscpl.com.au/2009/11/save-on-memory-with-modwsgi-30.html
> http://blog.dscpl.com.au/2012/10/why-are-you-using-embedded-mode-of.html
>
> BTW, mod_wsgi version 3.4 has a security issue and you should try and
> upgrade, unless of course this is the patched version of the Debian package
> for mod_wsgi.
>
>
> http://blog.dscpl.com.au/2014/05/security-release-for-modwsgi-version-35.html
>
> Graham
>
> On 02/06/2014, at 9:04 PM, Minh Tuan <[email protected]> wrote:
>
>> Dear Graham,
>> - Apache prefork MPM settings: I have not touched it yet, thus it is default:
>> - mod_wsgi version is 3.4, refer to your guide line here
>> - Apache version:
>> app@application:~/public_html/logs$ sudo apachectl -V
>>
>> Server version: Apache/2.4.9 (Debian)
>>
>> Server built: Mar 29 2014 22:29:22
>>
>> Server's Module Magic Number: 20120211:31
>>
>> Server loaded: APR 1.5.1, APR-UTIL 1.5.3
>>
>> Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
>>
>> Architecture: 64-bit
>>
>> Server MPM: prefork
>>
>> threaded: no
>>
>> forked: yes (variable process count)
>>
>> Server compiled with....
>>
>> -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=256
>>
>> -D HTTPD_ROOT="/etc/apache2"
>>
>> -D SUEXEC_BIN="/usr/lib/apache2/suexec"
>>
>> -D DEFAULT_PIDLOG="/var/run/apache2.pid"
>>
>> -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
>>
>> -D DEFAULT_ERRORLOG="logs/error_log"
>>
>> -D AP_TYPES_CONFIG_FILE="mime.types"
>>
>> -D SERVER_CONFIG_FILE="apache2.
>> conf"
>>
>> - Apache configure related mod_wsgi:
>> app@application:~$ sudo cat /etc/apache2/sites-available/ussd-pull.conf
>>
>>
>>
>> <VirtualHost *:8080>
>>
>>
>> # ---- Configure VirtualHost Defaults ----
>>
>>
>> ServerAdmin [email protected]
>>
>>
>> DocumentRoot /home/app/public_html/http
>>
>>
>> <Directory />
>>
>> Options FollowSymLinks
>>
>> AllowOverride None
>>
>> Require all granted
>>
>> </Directory>
>>
>>
>> <Directory /home/app/public_html/http/>
>>
>> Options Indexes FollowSymLinks MultiViews
>>
>> AllowOverride None
>>
>> Require all granted
>>
>> </Directory>
>>
>>
>> # ---- Configure WSGI Listener(s) ----
>>
>>
>> WSGIDaemonProcess ussd_pull user=www-data group=www-data threads=200
>>
>> WSGIScriptAlias /ussd /home/app/public_html/wsgi/ussd_pull.wsgi
>>
>>
>> <Directory /home/app/public_html/wsgi>
>>
>> WSGIProcessGroup ussd_pull
>>
>> WSGIApplicationGroup %{GLOBAL}
>>
>> Require all granted
>>
>> </Directory>
>>
>>
>> # ---- Configure Logging ----
>>
>>
>> ErrorLog /home/app/public_html/logs/error.log
>>
>> LogLevel warn
>>
>> CustomLog /home/app/public_html/logs/access.log combined
>>
>> </VirtualHost>
>>
>> - wsgi file:
>> app@application:~$ sudo cat ~/public_html/wsgi/ussd_pull.wsgi
>>
>>
>>
>> import sys
>>
>> sys.path.insert(0,'/home/app/public_html/apps/ussd_pull')
>>
>> from ussd_pull import app as application
>>
>> - Python version:
>> app@application:~$ python
>>
>>
>>
>> Python 2.7.6 (default, Mar 22 2014, 15:40:47)
>>
>> [GCC 4.8.2] on linux2
>>
>> Type "help", "copyright", "credits" or "license" for more information.
>>
>> >>>
>>
>> So shame that i dont know where MPM parameters are of Apache 2.4 so it
>> should default like 2.2 version:
>> <IfModule mpm_prefork_module>
>> StartServers 5
>> MinSpareServers 5
>> MaxSpareServers 10
>> MaxClients 150
>> MaxRequestsPerChild 0
>> </IfModule>
>> and i've not installed the packet apache2-dev yet as your suggestions.
>>
>> Many thanks.
>> Tuan.
>>
>>
>>
>> On Mon, Jun 2, 2014 at 5:27 PM, Graham Dumpleton
>> <[email protected]> wrote:
>>
>> On 02/06/2014, at 8:18 PM, Ice Prince <[email protected]> wrote:
>>
>> > Hi list,
>> > Believe you are doing well.
>> > I'm configuring a web application which using Apache + mod_wsgi + Flask
>> > and i have performance issue now.
>> > My application is very tiny, it just responds some short text only.
>> > My apache MPM is prefork as default, wsgi is configured to run in daemon
>> > mode.
>> > Tested by ab -n 10000 -c 200 http:/test/test i got a very good result as
>> > Request per second: 1500#/sec, time per request just 0.6ms.
>> > But i make an actual testing which from test server, i fetch the url
>> > http:/test/test with speed is 100 request/second only, my web service
>> > become laggy, the response time reach to 3 seconds as my manual monitoring.
>> > After calculation i found the actual requests i can handle only 40
>> > requests/second.
>> > I don't know how to do next, please give some some light. Many thanks.
>>
>> I would really need to see the Apache configuration related to mod_wsgi as
>> well as the Apache prefork MPM settings you have configured.
>>
>> So start by giving what you think covers that and I will ask for more if you
>> haven't supplied everything.
>>
>> Also confirm what version of mod_wsgi, Apache and Python you are using.
>>
>> Graham
>>
>> --
>> You received this message because you are subscribed to a topic in the
>> Google Groups "modwsgi" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/modwsgi/rufSwTh6PLI/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/modwsgi.
>> For more options, visit https://groups.google.com/d/optout.
>>
>>
>>
>> --
>> <====((=o-( ',_,' )-o=))=====>
>>
>> Bản chất tốt nhưng cuộc đời xô đẩy!
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "modwsgi" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>>
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/modwsgi.
>> For more options, visit https://groups.google.com/d/optout.
>
>
> --
> You received this message because you are subscribed to a topic in the Google
> Groups "modwsgi" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/modwsgi/rufSwTh6PLI/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/modwsgi.
> For more options, visit https://groups.google.com/d/optout.
>
>
>
> --
> <====((=o-( ',_,' )-o=))=====>
>
> Bản chất tốt nhưng cuộc đời xô đẩy!
>
> --
> You received this message because you are subscribed to the Google Groups
> "modwsgi" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/modwsgi.
> For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"modwsgi" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/modwsgi.
For more options, visit https://groups.google.com/d/optout.