我有一个Apache Web服务器运行许多VirtualHosts。
最近它一直陷入困境,变得反应迟钝,我想知道如何确定哪些VirtualHosts导致了大部分问题。 过去我们曾经有过个别站点的代码中的一个bug被整个服务器取下的场合。 我的目标是能够快速诊断这些实例。
我正在监视与munin的服务器,并注意到apache进程的数量,内存使用情况和负载往往是非常高的问题期间。 问题是,这些统计数据是针对整个networking服务器的,而不是单个的虚拟主机。
我已经写了一个脚本来parsing每个VirtualHost的stream量的博客,但显示这是不够的。 我可能需要确定每个VirtualHost负责多less个apache进程 ,或者每个进程打开多长时间 ,或者每个进程负责多less内存使用。
我在哪里可以find这些信息? 我不介意写一个脚本来跟踪这些数据,但我不知道从哪里提取它。
我明白,并不总是适合有mod_status和所有的时间,但它和apachetop是诊断这些问题的最佳方法。 然而,有很多方法来剥皮猫。
这个技巧在很多情况下都是有用的,不仅仅是Apache特有的。 但是,这取决于许多因素,而且你需要知道它在做什么来了解它的局限性。
for pid in `pgrep -u www-data`; do find /proc/${pid}/cwd -printf "%l\n" ; done
让我们来分解一下:
这个技巧有两个主要的注意事项:
1)如果在Apache进程的相同上下文中运行的某个chdir()在VirtualHost目录之外,那么你将很难被发现。
例如在mod_php下运行的PHP脚本(CGI将会与Apache fork不同,因为它假设CGI不是问题,或者你可以更容易地跟踪它们)。
2)如果你有非常快速的服务页面的Apache实例(例如一个小的静态HTML页面)。 这通常不是问题,但它可能是可能的。 如果你得到很多“没有这样的文件或目录”的错误,这基本上是一个performance。 我会期待一些,但不是大多数,除非他们适合这个特定的情况。 基本上这是因为用ps扫描过的Apache进程已经在检查/ proc的时候退出了。 显然这意味着他们正在非常迅速地提供页面。
关于内存绑定的Apache进程,我使用ps_mem.py来计算我的Web服务器上的内存使用情况。 如果你拥有庞大的阿帕奇(按照常驻内存大小)进程,并且他们正在快速退出,这大致相当于要求一个大胖子继续跑100米冲刺。 如果你的networking服务器不是共享的,那么通常把那些“没有这样的文件或目录”错误的内容移动到一个较小的轻量级web服务器上(例如nginx / lighttpd)或者开始大量caching内容(例如varnish / squid)。
我想你想要apachetop,或者mod_status
(带有ExtendedStatus On
)。 我还没有在Apache中的性能问题,没有被mod_status
照亮,apachetop看起来像一个整洁的工具(在日志布局有一些令人讨厌的限制)。