如何知道哪个域使用哪个apache实例

我有一个安装了DirectAdmin的VPS。 今天我的服务器停了一个小时,当我检查通知中心时,我看到一些httpd实例使用了很多我的CPUfunction。
你可以在下面检查一下顶部的命令。 我想知道的是我的哪个域名造成这种情况?

top命令结果:

顶部 – 07:52:54上午21:08,0用户,平均负载:61.00,19.79,6.98任务:总计223个,运行5个,睡眠218个,停止0个,僵尸0个Cpu:3.7% ,总计1026200k,使用1014088k,使用12112k,使用764k缓冲液交换:总计3002360k,使用1166920k,使用1835440k,使用1835440k,
caching了14084k

PID用户PR NI VIRT RES SHR S%CPU%MEM时间+命令
12684 apache 20 0 55192 15m 1044 D 2.9 1.5 0:01.10 / usr / sbin / httpd -k start -DSSL
12660 apache 20 0 50248 15m 1324 D 2.7 1.6 0:01.13 / usr / sbin / httpd -k start -DSSL
10782 apache 20 0 58860 15m 1456 R 2.5 1.5 0:37.45 / usr / sbin / httpd -k start -DSSL
12686 apache 20 0 55144 17m 1044 D 2.2 1.7 0:01.04 / usr / sbin / httpd -k start -DSSL
28根20 0 0 0 0 R 2.0 0.0 0:00.60 [kswapd0]
12654 apache 20 0 55144 14m 1044 D 2.0 1.5 0:01.03 / usr / sbin / httpd -k start -DSSL
12658 apache 20 0 55144 11m 1044 D 2.0 1.1 0:00.94 / usr / sbin / httpd -k start -DSSL
12669 apache 20 0 55144 18m 1044 D 1.7 1.8 0:01.03 / usr / sbin / httpd -k start -DSSL
12695 apache 20 0 55144 18m 1044 D 1.7 1.8 0:01.05 / usr / sbin / httpd -k start -DSSL
12681 apache 20 0 55176 15m 1044 D 1.5 1.5 0:00.94 / usr / sbin / httpd -k start -DSSL
12670 apache 20 0 55184 13m 1044 D 1.2 1.3 0:00.85 / usr / sbin / httpd -k start -DSSL
12692 apache 20 0 55144 16m 1044 D 1.0 1.7 0:01.00 / usr / sbin / httpd -k start -DSSL
12696 apache 20 0 55144 19m 1044 D 1.0 1.9 0:01.00 / usr / sbin / httpd -k start -DSSL
12700 apache 20 0 56304 7296 1028 D 1.0 0.7 0:00.79 / usr / sbin / httpd -k start -DSSL
12719 apache 20 0 54812 11m 1216 S 0.7 1.2 0:00.60 / usr / sbin / httpd -k start -DSSL
12734 apache 20 0 54804 12m 1212 R 0.7 1.3 0:00.62 / usr / sbin / httpd -k start -DSSL
12772 apache 20 0 54812 20m 1724 R 0.7 2.1 0:00.63 / usr / sbin / httpd -k start -DSSL

正如前面的回答所提到的,看一个特定的Apache进程没有太大的价值。

我可能会build议你改变你的httpd.conf设置 – 使用更有效的进程(例如PHP-FPM而不是mod_php)或者改变服务器/客户端/请求的数量。

通常,在具有多个域的环境中,每个域都有自己的用户。 (如果您在FastCGI模式下运行PHP,通常会看到这种情况,并且可以轻松查看哪个PHP进程正在使用大量资源)。

以下仅仅是为了感兴趣的缘故 – 在这种情况下它没有什么用处:

如果您确实想要确定某个特定时刻的特定进程所在的站点,则可以运行追踪文件访问的跟踪。 但是请注意,在高stream量的服务器上会产生大量的输出。

例如,下面将显示文件打开(如果您使用FastCGI,通常只有.htaccess文件)以及目录列表,并且足以识别现在正在处理该进程的域:

strace -p PID -e trace=open,lstat64

输出示例:

 Process PID attached - interrupt to quit open("/path/to/website/folder/.htaccess", O_RDONLY|O_LARGEFIL E|O_CLOEXEC) = 66 open("/path/to/website/folder/subfolder/.htaccess", O_RDONLY|O _LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory) lstat64("/path", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 lstat64("/path/to", {st_mode=S_IFDIR|0755, st_size=90, ...}) = 0 lstat64("/path/to/website", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 lstat64("/path/to/website/folder", {st_mode=S_IFDIR|0755, st_size=4096, . ..}) = 0 lstat64("/path/to/website/folder/subfolder", {st_mode=S_IFDIR|0750, st_size =21, ...}) = 0 lstat64("/path/to/website/folder/subfolder/php.fcgi", {st_mode=S_IFREG|0750 , st_size=96, ...}) = 0 

或者,你可以看看进程读取,并为grep'主机':

strace -p PID -e trace=read -s 100 2>&1 | grep "Host:"

输出示例:

 read(65, "GET /path/of/request/ HTTP/1.0\r\nHost: www.domain.com\r\nX-Real-IP: xxx.xxx.xxx.xx"..., 8000) = 1167 

(您可能需要使“string长度”值更长)

再一次,请记住,这两者都是一个“即时”看待一个给定的过程是什么 – 在下一个将改变的瞬间 – 因此对于任何超出好奇心的事物都是无用的。

您在顶部输出中查看的进程反映了有多less个守护进程产生了处理到服务器的HTTP / S请求。 他们没有明确链接到一个特定的网站。 当一个请求到达你的服务器时,一个空闲的守护进程将接收到请求,并根据发送给服务器的头信息,然后将它连接到正确的文件。

简而言之,没有一个过程明确地链接到一个特定的网站,但所有这些过程都可能与其链接。

问候,菲尔,

netstat -tp会告诉你哪个进程正在服务哪个TCP连接,允许你将进程映射到主机名。

说,你最好使用Apache的mod_status( http://httpd.apache.org/docs/2.0/mod/mod_status.html ),因为它是专门为这个问题而构build的。

不过,看起来CPU不是你的问题。 你有12M的空闲内存,而且你正在沉浸于交换。