如何诊断偶发性性能问题?

如何诊断偶发性性能问题?

我有一个 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 的负载。似乎完全是随机的。

由于特定的设置,有很多可能的原因,我真的不知道从哪里开始。

也许对所涉及组件有更多经验的人可以给我一些提示,告诉我如何诊断这个问题。

相关内容