You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@httpd.apache.org by Thomas Moyer <tm...@cse.psu.edu> on 2008/09/11 14:23:41 UTC

[users@httpd] Performance problems

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I am having some problems with performance when using mod_python to  
serve some dynamic content.  The request handler gathers information  
being generated by background processes on the system, and then  
creates a simple XML document that is sent to the client. Here is the  
code I am using with some explanation.

     requestedFilePath = "/" + req.filename.split("/")[-1] 
[:-4].replace("_", "/").replace("-",".")
     sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
     sock.connect(ATTService)
     Attest = message.recvMsg(sock)[0]
     sock.close()

     fmt = "%ds" % len(requestedFilePath)
     msg = struct.pack(fmt, requestedFilePath)
     sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
     sock.connect(MHTService)
     message.sendMsg(sock, msg, fmt)
     MHTList = message.recvMsg(sock)[0]
     sock.close()

     req.content_type = 'text/xml'
     req.write("<ACA>%s%s</ACA>" % (Attest,MHTList))
     return apache.OK

There are 3 different pieces here.  The first block connects to a  
daemon running on the system that is monitoring the system. I connect  
to a Unix domain socket and receive the most recent information it  
has.  I then do the same thing with another daemon that is gathering  
information about files that are available on the system. Finally I  
combine these two blocks of information and send it to the client.

My problem is, when I start using benchmarking tools like JMeter, and  
I put the system under any sort of load (100 clients for example), the  
first recvMsg call (Attest = message.recvMsg(sock)[0]) takes about 12  
seconds to complete per client.  I watch top during the run and see  
that the apache processes are completely occupied (usually showing 120+ 
% CPU usage).  The system running apache is an 8-core machine with  
16GB of RAM so I'm pretty sure there isn't a resource problem for  
either memory or processor.

I'm not really sure where to look next to understand why a simple  
socket recv() call is taking 12 seconds to complete.  The amount of  
data being recv()'d is ~80K of text if that makes a difference.

Below is the config file for Apache:
ServerRoot "/etc/apache2"
LockFile /var/lock/apache2/accept.lock
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
<IfModule mpm_prefork_module>
     StartServers          5
     MinSpareServers       5
     MaxSpareServers      10
     MaxClients          150
     MaxRequestsPerChild   0
</IfModule>
<IfModule mpm_worker_module>
     StartServers          2
     MaxClients          150
     MinSpareThreads      25
     MaxSpareThreads      75
     ThreadsPerChild      25
     MaxRequestsPerChild   0
</IfModule>
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Files ~ "^\.ht">
     Order allow,deny
     Deny from all
</Files>
DefaultType text/plain
HostnameLookups Off
ErrorLog /var/log/apache2/error.log
LogLevel warn
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/httpd.conf
Include /etc/apache2/ports.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i 
\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
ServerTokens Full
ServerSignature On
PythonOption mod_python.mutex_locks 32
PythonOptimize On
Include /etc/apache2/conf.d/
Include /etc/apache2/sites-enabled/

Enabled Modules:
lias.conf
alias.load
auth_basic.load
authn_file.load
authz_default.load
authz_groupfile.load
authz_host.load
authz_user.load
autoindex.load
cgid.load
dir.load
env.load
mime.load
mod_python.load
negotiation.load
setenvif.load
status.load

And finally the site configuration itself:
NameVirtualHost *
<VirtualHost *>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/
	<Directory />
		Options FollowSymLinks
		AllowOverride None
	</Directory>
	<Directory /var/www/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
		AddHandler mod_python .aca
		PythonHandler serveACA | .aca
		PythonPath "sys.path + ['/var/shamon/']"
		PythonDebug On
	</Directory>
	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
	<Directory "/usr/lib/cgi-bin">
		AllowOverride None
		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
		Order allow,deny
		Allow from all
	</Directory>
	ErrorLog /var/log/apache2/error.log
	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn
	CustomLog /var/log/apache2/access.log combined
	ServerSignature On
     Alias /doc/ "/usr/share/doc/"
     <Directory "/usr/share/doc/">
         Options Indexes MultiViews FollowSymLinks
         AllowOverride None
         Order deny,allow
         Deny from all
         Allow from 127.0.0.0/255.0.0.0 ::1/128
     </Directory>
</VirtualHost>

Not sure what other information is needed.

~tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)

iEYEARECAAYFAkjJDc0ACgkQa7Yypxfw9TdvngCgio05p2p9rHXhI3qB2EC8LgPV
uJEAn0w60bAQJ6QiMsZDrd4Z0c+uTzjr
=4TUr
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: users-unsubscribe@httpd.apache.org
   "   from the digest: users-digest-unsubscribe@httpd.apache.org
For additional commands, e-mail: users-help@httpd.apache.org