我有一个 Web 应用程序,其响应时间变化很大,但无法找出原因。
这就是(相当复杂的)设置:
德国数据中心的强大(i7、32GB RAM)专用服务器,运行 Debian 6 和 Proxmox。在该主机上,有一个 OpenVZ 容器,配置为使用 2 个 CPU 核心和 2 GB RAM。在这个容器中,我运行 Ubuntu 12.04 和一个 Redmine 实例(Rails 应用程序)。
Redmine 通过 Phusion Passenger 与 Apache 2 一起使用。
Apache vhost 配置(容器):
<VirtualHost *:80>
ServerName redmine.somedomain.com
DocumentRoot /var/www/redmine/
<Directory "/var/www/redmine/">
RailsBaseURI /
PassengerResolveSymlinksInDocumentRoot on
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
RewriteEngine On
# Check for maintenance file and redirect all requests
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /system/maintenance.html [L]
# Rewrite index to check for static
RewriteRule ^/$ /cache/index.html [QSA]
# Rewrite to check for Rails cached page
RewriteRule ^([^.]+)$ /cache/$1.html [QSA]
ErrorLog /var/log/apache2/redmine.error.log
CustomLog /var/log/apache2/redmine.access.log combined
ServerSignature Off
</VirtualHost>
乘客配置:
<IfModule mod_passenger.c>
PassengerRoot /var/lib/gems/1.9.1/gems/passenger-3.0.19
PassengerRuby /usr/bin/ruby
PassengerDefaultUser redmine
PassengerDefaultGroup redmine
PassengerPoolIdleTime 0
PassengerMinInstances 4
PassengerMaxPoolSize 10
PassengerStatThrottleRate 600
RailsFrameworkSpawnerIdleTime 0
RailsAppSpawnerIdleTime 0
</IfModule>
容器虚拟机没有外部 IP,因此在主机上我使用 Apache(反向)代理。
该配置为(主机):
<VirtualHost *:443>
ServerName redmine.somedomain.com
SSLProxyEngine On
ProxyRequests off
ProxyPreserveHost on
ProxyPass / http://192.168.2.101/ keepalive=on max=100
ProxyPassReverse / http://192.168.2.101/
SSLEngine on
SSLCertificateFile /data/private/101/etc/apache2/ssl/redmine.crt
SSLCertificateKeyFile /data/private/101/etc/apache2/ssl/redmine.key
SSLCACertificatePath /data/private/101/etc/ssl/certs/
RequestHeader set X_FORWARDED_PROTO 'https'
KeepAlive On
KeepAliveTimeout 60
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
ErrorLog /var/log/apache2/redmine.err.log
LogFormat "%t \"%r\" %D" measure-time
CustomLog /var/log/apache2/redmine.time.log measure-time
</VirtualHost>
如您所见,我激活了定时日志来了解单个请求的行为方式。根据该日志,它似乎相当随机。
该日志文件的示例内容:
[10/Feb/2014:09:48:36 +0100] "GET /plugin_assets/redmine_contacts_helpdesk/stylesheets/helpdesk.css?1377871228 HTTP/1.1" 501
...
[10/Feb/2014:09:48:35 +0100] "GET /plugin_assets/redmine_contacts_helpdesk/stylesheets/helpdesk.css?1377871228 HTTP/1.1" 20994933
...
[10/Feb/2014:09:49:07 +0100] "GET /plugin_assets/redmine_contacts_helpdesk/stylesheets/helpdesk.css?1377871228 HTTP/1.1" 418
最后一个值是处理请求所用的时间(以 µs 为单位)。如您在此处所见,通常处理请求仅需约 500 µs,但一分钟后处理完全相同的请求也可能需要长达 20 秒的时间。在我看来,这应该可以排除 Ruby 进程作为可能的原因。这一假设得到了以下事实的支持:在如此缓慢的请求期间,服务器不会显示任何负载(无论是 CPU 还是 I/O)。它也独立于主机上其他 VM 的负载。似乎完全是随机的。
由于特定的设置,有很多可能的原因,我真的不知道从哪里开始。
也许对所涉及组件有更多经验的人可以给我一些提示,告诉我如何诊断这个问题。