我在 Linux 服务器上安装了 Apache,里面有一个 Python 脚本(更具体地说是 Trac)。在最低流量下,它消耗了 99% 的 CPU,平均负载超过 3.00。能否以某种方式了解它在那里做什么 - 磁盘、网络、哪些文件等?是否有一些工具可以分析特定进程正在忙什么?
编辑:strace apache2 -X
向我展示了很多具有类似内容的行:
stat("/home/foo/apache/conf.d/trac-XXX.conf", {st_mode=S_IFREG|0644, st_size=1014, ...}) = 0
open("/home/foo/apache/conf.d/trac-XXX.conf", O_RDONLY|O_CLOEXEC) = 6
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6a93021000
fstat(6, {st_mode=S_IFREG|0644, st_size=1014, ...}) = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6a9301e000
read(6, "contents of my trac-XXX.conf"..., 4096) = 1014
read(6, "", 4096) = 0
close(6)
目录中的每个文件都有相同的行/home/foo/apache/conf.d/
(我有数百个文件)。您知道如何解释这些信息并解决问题吗?看起来 Apache 在每个 HTTP 请求上都重新加载所有配置文件。
答案1
您可以使用strace
( man strace
)。以 root 身份尝试
strace `ps -e | grep apache2 | awk '{ print "-p"$1 }'`
或类似地用trac
代替apache2
。您可能还想配置日志级别到debug
。
由于对 Trac 不熟悉,因此以下编辑纯属瞎猜。
在下面的评论中Trac 票 3833osimons 表示:
例如,如果您不使用 mod_python,而是使用简单的 CGI 设置,环境会针对每个请求完全重新加载。这样的请求实际上没有历史记录 - Python 进程启动,模块加载,Trac 处理启动,请求完成后整个 Python 进程终止。
这种方法之所以有效是因为请求的特定信息(比如您的预览示例)会作为参数传递给请求对象 - 在 req 上下文中可用。
所以问题是,您是使用mod_python
还是使用纯 CGI 来运行 Trac?如果您使用纯 CGI,那么就很清楚为什么每次请求时都会读取 Trac 配置文件。