[mod_python] Multiple Interpreters mod_python optimization

zsi zsi at skolesys.dk
Fri May 15 06:34:07 EDT 2009



On Fri, 15 May 2009 20:11:38 +1000, Graham Dumpleton
<graham.dumpleton at gmail.com> wrote:
> 2009/5/15 zsi <zsi at skolesys.dk>:
>> Hey *
>>
>> I am creating a SOAP service that is based on ZSI and mod_python. I have
>> the service running and it works, but it's not performing well, so I
> made
>> did some output to the syslog from inside the handler:
>>
>> reloadchecker.py:
>> ----------------
>> testvar=1
>> ----------------
>>
>> My handler:
>> ----------------
>> import capa0_9.soap.sessionservice as sessionservice
>> import capa0_9.soap.zsi_handler as zsi_handler
>> from mod_python import apache
>> import capa0_9.tools.log as log
>> import os,reloadchecker
>>
>> mod = __import__('encodings.utf_8', globals(), locals(), '*')
>> mod = __import__('encodings.utf_16_be', globals(), locals(), '*')
>>
>> def handler(req):
>>
>>        """
>>        The PythonHandler entry-point. This function must be present
> in
>> order to have mod_apache dispatch a python operation.
>>        """
>>        zsi_handler.AsHandler(modules=(sessionservice,), request=req)
>>        log.debug("REQUESTINFO: Interpreter Name = %s" %
>> str(req.interpreter))
>>        log.debug("REQUESTINFO: os.getpid()      = %s" %
> str(os.getpid()))
>>        log.debug("REQUESTINFO: reloadchecker    = %s" %
>> str(reloadchecker.testvar))
>>        reloadchecker.testvar += 1
>>        return apache.OK
>> -----------------
>>
>> I log the interpreter name, which according to section 4.1 should make
>> mod_python boost performance by keeping the interpreter alive as long as
>> the apache server processes. And I log the pid of the interpreter. As it
> is
>> clear to see in the output below a new pid is spawned each time, it does
>> not reuse the interpreter and therefore, I guess, it has to reload
>> everything for each request. Note that i also list the apache2 processes
>> before and after I bombard the server with requests, it shows that the
> same
>> processes are running before and after. I also made a dummy module
>> "reloadchecker" that contains one variable "testvar". If it is reloaded
> the
>> variable is initialized to 1, if it was already loaded it should be
>> increased by 1 for each request.
>>
>> Am I missing something,

Thanks for the quick response.

> 
> Yes.
> 
>> shouldn't mod_python optimize performance by
>> reusing previously loaded modules from earlier requests?
> 
> Only if the request is actually handled by the same process. Since
> Apache is a multiprocess web server, the requests could be handled by
> any of the processes. You will obviously incur the load cost of the
> interpreter and application for the first request against each
> processor. Subsequent requests for a process should use the fact that
> stuff is already loaded. You likely didn't do enough requests to have
> touched all process and have a request actually go back to a process
> which was already used.
> 
> Read:
> 
>  
>
http://www.dscpl.com.au/wiki/ModPython/Articles/TheProcessInterpreterModel
> 
> Since you appear to be using prefork MPM, also read about the dangers
> of prefork MPM in:
> 
>  
>
http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html
> 
> If you want better control over how many processes are used for your
> application and particularly so you can limit number to small fixed
> number and/or use threading as well, then look at mod_wsgi daemon mode
> instead.
> 
> BTW, the process IDs in your 'ps' output don't even match what your
> Python code is producing. Looks like you aren't even talking to the
> same Apache instance.
I wasn't expecting them to match. The process id's from the python code
are the interpreter's pid not the apaches. What I wanted to show by
that was that it is stille the same apache processes (8 of them) but
I have 18 different interpreter process ID's. So it is not because I
hit a new apache process every time.

> So, try and validate your configuration and whether you might have
> multiple Apache installations running. Look for 'httpd' processes as
> well.

Here is the server pool configuration (standard ubuntu mpm-prefork
configuration):
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0

Best regards
Jakob Simon-Gaarde

>> mikrov at capa-server:/srv/capa/www/0.9$ sudo ps aux | grep apache2
>> mikrov    7396  0.0  0.1   3004   764 pts/2    S+   11:11  
> 0:00 grep
>> apache2
>> root     22343  0.0  1.0  13728  5336 ?        Ss   May14  
> 0:26
>> /usr/sbin/apache2 -k start
>> root     22346  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22347  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22348  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22349  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22350  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22383  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22392  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22407  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22716  0.0  0.6  13728  3136 ?        S    May14  
> 0:03
>> /usr/sbin/apache2 -k start
>> root     23356  0.0  0.6  13728  3136 ?        S    May14  
> 0:03
>> /usr/sbin/apache2 -k start
>>
>> mikrov at capa-server:/srv/capa/www/0.9/sessionservice$ sudo tail -f
>> /var/log/syslog | grep REQUESTINFO
>> May 15 11:52:03 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:03 capa-server capa: REQUESTINFO: os.getpid()      =
> 7953
>>
>> May 15 11:52:03 capa-server capa: REQUESTINFO: reloadchecker    = 1
>>
>> May 15 11:52:03 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:03 capa-server capa: REQUESTINFO: os.getpid()      =
> 7954
>>
>> May 15 11:52:03 capa-server capa: REQUESTINFO: reloadchecker    = 1
>>
>> May 15 11:52:04 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:04 capa-server capa: REQUESTINFO: os.getpid()      =
> 7955
>>
>> May 15 11:52:04 capa-server capa: REQUESTINFO: reloadchecker    = 1
>>
>> May 15 11:52:05 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:05 capa-server capa: REQUESTINFO: os.getpid()      =
> 7959
>>
>> May 15 11:52:05 capa-server capa: REQUESTINFO: reloadchecker    = 1
>>
>> May 15 11:52:06 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:06 capa-server capa: REQUESTINFO: os.getpid()      =
> 7960
>>
>> May 15 11:52:06 capa-server capa: REQUESTINFO: reloadchecker    = 1
>>
>> May 15 11:52:07 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:07 capa-server capa: REQUESTINFO: os.getpid()      =
> 7961
>>
>> May 15 11:52:07 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:08 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:08 capa-server capa: REQUESTINFO: os.getpid()      =
> 7963
>> May 15 11:52:08 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:08 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:08 capa-server capa: REQUESTINFO: os.getpid()      =
> 7964
>> May 15 11:52:08 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:09 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:09 capa-server capa: REQUESTINFO: os.getpid()      =
> 7966
>> May 15 11:52:09 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:10 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:10 capa-server capa: REQUESTINFO: os.getpid()      =
> 7968
>> May 15 11:52:10 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:11 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:11 capa-server capa: REQUESTINFO: os.getpid()      =
> 7969
>> May 15 11:52:11 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:12 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:12 capa-server capa: REQUESTINFO: os.getpid()      =
> 7970
>> May 15 11:52:12 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:13 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:13 capa-server capa: REQUESTINFO: os.getpid()      =
> 7972
>> May 15 11:52:13 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:13 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:13 capa-server capa: REQUESTINFO: os.getpid()      =
> 7973
>> May 15 11:52:13 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:14 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:14 capa-server capa: REQUESTINFO: os.getpid()      =
> 7974
>> May 15 11:52:14 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:15 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:15 capa-server capa: REQUESTINFO: os.getpid()      =
> 7976
>> May 15 11:52:15 capa-server capa: REQUESTINFO: reloadchecker    = 1
>> May 15 11:52:16 capa-server capa: REQUESTINFO: Interpreter Name =
>> /srv/capa/www/0.9/sessionservice/
>> May 15 11:52:16 capa-server capa: REQUESTINFO: os.getpid()      =
> 7977
>> May 15 11:52:16 capa-server capa: REQUESTINFO: reloadchecker    = 1
>>
>> mikrov at capa-server:/srv/capa/www/0.9$ sudo ps aux | grep apache2
>> mikrov    7457  0.0  0.1   3004   764 pts/2    S+   11:12  
> 0:00 grep
>> apache2
>> root     22343  0.0  1.0  13728  5336 ?        Ss   May14  
> 0:26
>> /usr/sbin/apache2 -k start
>> root     22346  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22347  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22348  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22349  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22350  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22383  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22392  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22407  0.0  0.6  13728  3136 ?        S    May14  
> 0:04
>> /usr/sbin/apache2 -k start
>> root     22716  0.0  0.6  13728  3136 ?        S    May14  
> 0:03
>> /usr/sbin/apache2 -k start
>> root     23356  0.0  0.6  13728  3136 ?        S    May14  
> 0:03
>> /usr/sbin/apache2 -k start



More information about the Mod_python mailing list