我有一个运行许多VirtualHosts的apache网络服务器。
最近它变得很卡,没有响应,我想知道如何确定哪些 VirtualHosts 导致了大部分问题。我们过去曾遇到过单个网站代码中的错误导致整个服务器瘫痪的情况。我的目标是能够快速诊断这些情况。
我正在使用以下方式监控服务器穆宁并注意到,在所讨论的时间段内,apache 进程数、内存使用率和负载往往非常高。问题是,这些统计数据是针对整个 Web 服务器的,而不是针对单个 VirtualHosts 的。
我已经编写了一个脚本来解析网络日志每个虚拟主机的流量,但似乎这还不够。我可能需要确定有多少个 Apache 进程每个 VirtualHost 负责,或者每个流程保持开放多长时间- 也许多少内存使用各人负责。
在哪里可以找到这些信息? 我不介意编写脚本来跟踪这些数据,但我不知道首先从哪里提取这些数据。
答案1
我知道让 mod_status 一直处于可用和打开状态并不总是合适的,但它和 apachetop 是诊断这些问题的最佳方法。然而,方法有很多。
此技巧在很多情况下都很有用,而且不仅限于 Apache。但它确实取决于很多因素,您需要知道它在做什么才能知道它的局限性。
for pid in `pgrep -u www-data`; do find /proc/${pid}/cwd -printf "%l\n" ; done
让我们分解一下:
- pgrep -u www 数据为您提供在用户 www-data 下运行的 pid 列表。这是 Debian / Ubuntu 上的默认设置,请根据您自己的系统进行更改(基于 RedHat 的系统往往使用httpd,例如,以用户身份)。对于没有 pgrep 的系统,您可以使用ps axuwww | grep 用户 | awk'{print $2}'
- *for; do; ... done * 循环意味着我们循环遍历循环 do 部分内运行命令的每个条目。
- 查找 /proc/${pid}/cwd -printf "%l\n"只需在 /proc 中搜索每个 PID,然后输出该进程的当前工作目录。当从 VirtualHost 提供文件时,Apache 默认会将 chdir() 转到 VirtualHost。/proc/PID/cwd 是指向 apache 进程正在运行的目录的符号链接。printf“%l\n”将端点打印到该链接。有关更多信息,请参阅 find(1)。
此技巧有两个主要注意事项:
1)如果在与 Apache 进程相同的上下文中运行的某个程序在 VirtualHost 目录之外执行了 chdir(),那么您很难发现这一点。
例如在 mod_php 下运行的 PHP 脚本(由于 Apache fork 是一个单独的进程,因此 CGI 会有所不同,但我认为 CGI 不是问题,否则您可以更轻松地跟踪它们)。
2) 如果您的 Apache 实例能够非常快速地提供页面(例如,小型静态 HTML 页面)。这通常不是问题,但也可能存在问题。如果您收到大量“没有此文件或目录”错误,这基本上就是问题的一种表现。我预计会有一些,但除非它们符合这种特殊情况,否则不会是大多数。基本上这是因为当您检查 /proc 时,您使用 ps 扫描的 Apache 进程已经退出。显然,这意味着它们能够非常快速地提供页面。
对于内存受限的 Apache 进程,我使用ps_mem.py计算我的网络服务器上的内存使用情况。如果您拥有大型 Apache(就常驻内存大小而言)进程,并且它们快速退出,这大致相当于要求一个大胖子继续跑 100 米短跑。如果您的网络服务器不是共享的,这些“没有这样的文件或目录”错误通常是将一些内容移动到较小的轻量级网络服务器(例如 nginx/lighttpd)或开始大量缓存内容(例如 varnish/squid)的好选择。
答案2
我认为您需要 apachetop,否则mod_status
(使用ExtendedStatus On
)。我还没有遇到 Apache 中没有被 解决的性能问题mod_status
,并且 apachetop 看起来像一个简洁的工具(在日志布局方面有一些令人讨厌的限制)。