我有一台服务器在 mod_wsgi 下的 apache2 上运行几个 cherrypy 应用程序。我们看到一个没有处理很多请求的盒子上的平均负载不断波动。据我所知,该盒子没有实际的 CPU 负载,有足够的内存,网络流量很少,没有发生磁盘 I/O。我们正在运行 13 个 mod_wsgi 守护进程,每个进程有 5 个线程,为 5 个不同的应用程序提供服务。这些是非常轻量级的后端服务应用程序,根本不进行太多处理。我检查了几乎所有我能想到的导致负载波动的原因,想知道这里是否有人遇到过类似的问题。非常感谢任何评论。
以下是在每分钟处理 10 个请求的临时环境中约 5 分钟内的平均负载跟踪:
~ $ sar -q 5
Linux 2.6.32-305-ec2 01/27/2011 _i686_ (1 CPU)
04:18:37 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
04:18:42 AM 0 257 1.52 1.90 1.89
04:18:47 AM 0 257 1.40 1.87 1.88
04:18:52 AM 0 257 1.28 1.84 1.87
04:18:57 AM 0 257 1.18 1.81 1.86
04:19:02 AM 0 257 1.17 1.79 1.85
04:19:07 AM 0 257 1.15 1.78 1.85
04:19:12 AM 0 257 1.14 1.77 1.84
04:19:17 AM 0 257 1.05 1.74 1.83
04:19:22 AM 0 257 0.96 1.71 1.82
04:19:27 AM 0 257 0.89 1.68 1.81
04:19:32 AM 0 256 0.82 1.65 1.80
04:19:37 AM 0 256 0.75 1.62 1.79
04:19:42 AM 0 256 0.69 1.60 1.78
04:19:47 AM 0 256 0.95 1.64 1.79
04:19:52 AM 0 256 1.20 1.67 1.81
04:19:57 AM 0 256 1.42 1.71 1.82
04:20:02 AM 0 256 1.31 1.68 1.81
04:20:07 AM 0 256 2.00 1.82 1.85
04:20:12 AM 0 256 2.64 1.96 1.89
04:20:17 AM 0 256 3.23 2.09 1.94
04:20:22 AM 0 256 2.97 2.06 1.93
04:20:27 AM 0 256 2.74 2.02 1.92
04:20:32 AM 0 256 2.52 1.99 1.91
04:20:37 AM 0 256 2.31 1.95 1.90
04:20:42 AM 0 256 2.13 1.92 1.89
04:20:47 AM 0 256 1.96 1.89 1.88
04:20:52 AM 0 256 1.80 1.86 1.87
04:20:57 AM 0 256 1.66 1.83 1.85
04:21:02 AM 0 256 1.52 1.80 1.84
04:21:07 AM 0 256 1.40 1.77 1.83
04:21:12 AM 0 256 1.29 1.74 1.82
04:21:17 AM 0 256 1.19 1.71 1.81
04:21:22 AM 0 256 1.09 1.68 1.80
04:21:27 AM 0 256 1.00 1.65 1.79
04:21:32 AM 0 256 0.92 1.62 1.78
04:21:37 AM 0 256 0.85 1.59 1.77
04:21:42 AM 0 256 0.78 1.57 1.77
04:21:47 AM 0 256 0.72 1.54 1.76
04:21:52 AM 0 256 0.98 1.58 1.77
04:21:57 AM 0 256 1.22 1.62 1.78
04:22:02 AM 0 256 1.44 1.66 1.79
04:22:07 AM 0 256 2.13 1.80 1.83
04:22:12 AM 0 256 2.76 1.93 1.88
04:22:17 AM 0 256 3.34 2.07 1.92
04:22:22 AM 0 256 3.87 2.20 1.96
04:22:27 AM 0 256 3.56 2.16 1.95
04:22:32 AM 0 256 3.28 2.13 1.94
04:22:37 AM 0 256 3.01 2.09 1.93
04:22:42 AM 0 256 2.77 2.06 1.92
04:22:47 AM 0 256 2.55 2.02 1.91
04:22:52 AM 0 256 2.34 1.99 1.90
04:22:57 AM 0 256 2.16 1.95 1.89
04:23:02 AM 0 256 1.98 1.92 1.88
04:23:07 AM 0 256 1.82 1.89 1.87
04:23:12 AM 0 256 1.68 1.86 1.86
以及顶级简介:
top - 04:38:57 up 1:17, 1 user, load average: 2.55, 3.03, 2.46
Tasks: 78 total, 1 running, 77 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1741016k total, 946844k used, 794172k free, 63712k buffers
Swap: 917496k total, 0k used, 917496k free, 646064k cached
每个请求,一个服务的 apache conf(它们看起来都很像这样)。
Listen 12800
<VirtualHost *:12800>
WSGIScriptAlias / /var/www/services/tracking/tracking.wsgi
WSGIDaemonProcess tracking user=www-data group=www-data processes=3 threads=5 maximum-requests=1000 umask=0007
WSGIProcessGroup tracking
WSGIApplicationGroup tracking
WSGIPassAuthorization On
ErrorLog /var/log/apache2/tracking.error.log
CustomLog /var/log/apache2/tracking.access.log combined
LogLevel warn
</VirtualHost>
除了您在本次配置中看到的以外,我们实际上并没有对 mod_wsgi 进行任何特定的参数调整。
答案1
您是否绝对确定它们是在守护进程模式下运行,而不是错误地在嵌入模式下运行?根据使用的 MPM 和 MPM 设置,嵌入模式可能会导致胖 Python Web 应用程序出现不良行为。请参阅:
http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html
如果使用守护进程模式并将最大请求数设置为极低的值,您也可能会给自己带来问题。如果流量不频繁且使用大量进程,不活动超时也会导致问题。
建议您发布与 mod_wsgi 相关的 Apache 配置部分。