django、mod_wsgi、MySQL 高 CPU - 问题

django、mod_wsgi、MySQL 高 CPU - 问题

我在使用 OSQA 网站时遇到了问题。这是一个配置了 Django/Apache/mod_wsgi 的网站。每小时,任务 HTTPD 的 CPU 峰值达到 164%(平均值)。10 分钟后,它会恢复。我查看了日志、cron 表,进行了许多配置更改,但无法追踪此问题。有人可以查看以下信息并告诉我这是否是配置问题,或者是否有其他人遇到过此问题吗?

  1. 运行 TOP 显示 HTTPD 使用了 165% 的 CPU
  2. VMware 性能监视器也显示峰值。
  3. 这种情况每小时发生一次,持续 10 分钟。
  4. 我从服务器状态获得以下信息

    Server Version: Apache/2.2.15 (Unix) DAV/2 mod_wsgi/3.2 Python/2.6.6
    Server Built: Feb 7 2012 09:50:15
    
    Current Time: Sunday, 10-Jun-2012 21:44:29 EDT
    Restart Time: Sunday, 10-Jun-2012 19:44:51 EDT
    Parent Server Generation: 0
    Server uptime: 1 hour 59 minutes 37 seconds
    Total accesses: 1088 - Total Traffic: 11.5 MB
    CPU Usage: u80.26 s243.8 cu0 cs0 - 4.52% CPU load
    .152 requests/sec - 1682 B/second - 10.8 kB/request
    4 requests currently being processed, 11 idle workers
    
    ....._..........__......W.......................................
    ...................................C._..._....._L__._L_._.......
    ......................
    
    Scoreboard Key:
    "_" Waiting for Connection, "S" Starting up, "R" Reading Request,
    "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
    "C" Closing connection, "L" Logging, "G" Gracefully finishing,
    "I" Idle cleanup of worker, "." Open slot with no current process
    
    Srv PID Acc M   CPU     SS  Req Conn    Child   Slot    Client  VHost   Request
    0-0 -   0/0/34  .   0.42    327 17  0.0 0.00    0.67    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    1-0 -   0/0/22  .   0.31    339 32  0.0 0.00    0.26    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    2-0 -   0/0/22  .   0.65    358 10  0.0 0.00    0.31    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    3-0 -   0/0/31  .   1.03    378 31  0.0 0.00    0.60    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    4-0 -   0/0/20  .   0.45    356 9   0.0 0.00    0.31    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    5-0 18852   0/16/34 _   0.98    27  18120   0.0 0.37    0.62    69.180.250.36   osqa.informs.org    GET /questions/289/what-is-the-difference-between-operations-re
    6-0 -   0/0/32  .   0.94    309 29  0.0 0.00    0.64    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    7-0 -   0/0/31  .   1.15    382 32  0.0 0.00    0.75    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    8-0 -   0/0/21  .   0.28    403 19  0.0 0.00    0.20    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    9-0 -   0/0/32  .   1.37    288 16  0.0 0.00    0.60    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    10-0    -   0/0/33  .   1.72    383 16  0.0 0.00    0.40    127.0.0.1   osqa.informs.org    OPTIONS * HTTP/1.0
    
  5. 我正在运行 Django 1.3

  6. 这是一个 mod_wsgi 配置,复制的是 wsgi.conf 文件:

    <IfModule !python_module>
    <IfModule !wsgi_module>
    
    LoadModule wsgi_module modules/mod_wsgi.so
    
    <IfModule wsgi_module>
    
    <Directory /var/www/osqa>
     Order allow,deny
     Allow from all
     #Deny from all
    </Directory>
    
    WSGISocketPrefix /var/run/wsgi
    WSGIPythonEggs /var/tmp
    WSGIDaemonProcess OSQA maximum-requests=10000
    WSGIProcessGroup OSQA
    
    Alias /admin_media/ /usr/lib/python2.6/site-packages/Django-1.2.5-py2.6.egg/django/contrib/admin/media/
    Alias /m/ /var/www/osqa/forum/skins/
    Alias /upfiles/ /var/www/osqa/forum/upfiles/
    
    <Directory /var/www/osqa/forum/skins>
     Order allow,deny
     Allow from all
    </Directory>
    
    WSGIScriptAlias / /var/www/osqa/osqa.wsgi
    
    </IfModule>
    </IfModule>
    </IfModule>
    
  7. 这是 httpd.conf 文件

    Timeout 120
    KeepAlive Off
    MaxKeepAliveRequests 100
    MaxKeepAliveRequests 400
    KeepAliveTimeout 3
    
    <IfModule prefork.c>
    Startservers      15
    MinSpareServers   10
    MaxSpareServers   20
    ServerLimit      50
    MaxClients       50
    MaxRequestsPerChild  0
    </IfModule>
    
    
    <IfModule worker.c>
    StartServers         4
    MaxClients         150
    MinSpareThreads      25
    MaxSpareThreads     75
    ThreadsPerChild      25
    MaxRequestsPerChild  0
    </IfModule>
    
  8. 我们正在使用 MySQL

  9. 该服务器是 ESX4i,配置为 VM 使用 4 个 CPU 和 8 GB 内存。启用了超线程,有 2 个物理 CPU,4 个逻辑 CPU。CPU 是 Intel Xeon 2.8 GHz。总内存为 12GB

答案1

这个问题已经解决了。应 graham-dumpleton 的要求,我添加了监控 New Relic 的服务器,它指向了来自 Yahoo Pipes 的错误请求。联系 Yahoo 后,他们提供了以下文本来阻止 Yahoo Pipes 访问网站。

配置你的 Web 服务器以阻止用户代理“雅虎管道”。例如,要阻止 Apache 中的管道,请将其添加到 httpd.conf 中的虚拟主机块中:

SetEnvIfNoCase 用户代理“Yahoo Pipes”noPipes

限制 GET POST
顺序允许,拒绝
全部允许
拒绝来自 env=noPipes
/Limit

相关内容