我有一个安装了 DirectAdmin 的 vps。今天我的服务器宕机了一个小时,当我检查通知中心时,我发现一些 httpd 实例正在使用我的大量 CPU 功率。
您可以查看下面的部分 top 命令。我想知道我的哪个域导致了这种情况?
top
命令结果:
顶部 - 07:52:54 启动 21:08,0 个用户,平均负载:61.00、19.79、6.98 任务:总计 223 个,其中 5 个正在运行,218 个正在休眠,0 个已停止,0 个僵尸 CPU:3.7%us、0.3%sy、0.0%ni、95.6%id、0.3%wa、0.0%hi、0.0%si、0.0%st 内存:总计 1026200k,已使用 1014088k,可用 12112k,缓冲区 764k 交换:总计 3002360k,已使用 1166920k,可用 1835440k,
缓存 14084kPID 用户 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 启动 -DSSL
28 root 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 启动 -DSSL
12658 apache 20 0 55144 11m 1044 D 2.0 1.1 0:00.94 /usr/sbin/httpd -k 启动 -DSSL
12669 apache 20 0 55144 18m 1044 D 1.7 1.8 0:01.03 /usr/sbin/httpd -k 启动 -DSSL
12695 apache 20 0 55144 18m 1044 D 1.7 1.8 0:01.05 /usr/sbin/httpd -k 启动 -DSSL
12681 apache 20 0 55176 15m 1044 D 1.5 1.5 0:00.94 /usr/sbin/httpd -k 启动 -DSSL
12670 apache 20 0 55184 13m 1044 D 1.2 1.3 0:00.85 /usr/sbin/httpd -k 启动 -DSSL
12692 apache 20 0 55144 16m 1044 D 1.0 1.7 0:01.00 /usr/sbin/httpd -k 启动 -DSSL
12696 apache 20 0 55144 19m 1044 D 1.0 1.9 0:01.00 /usr/sbin/httpd -k 启动 -DSSL
12700 apache 20 0 56304 7296 1028 D 1.0 0.7 0:00.79 /usr/sbin/httpd -k 启动 -DSSL
12719 apache 20 0 54812 11m 1216 S 0.7 1.2 0:00.60 /usr/sbin/httpd -k 启动 -DSSL
12734 apache 20 0 54804 12m 1212 R 0.7 1.3 0:00.62 /usr/sbin/httpd -k 启动 -DSSL
12772 apache 20 0 54812 20m 1724 R 0.7 2.1 0:00.63 /usr/sbin/httpd -k start -DSSL
答案1
正如前面的答案所提到的,查看特定的 Apache 进程并没有太多价值。
我可能会建议您应该更改您的 httpd.conf 设置 - 使用更高效的流程(例如 PHP-FPM 而不是 mod_php)或更改服务器/客户端/请求的数量。
通常,在具有多个域的环境中,每个域都有自己的用户。(如果您在 FastCGI 模式下运行 PHP,通常会看到这种情况,并且可以轻松查看哪个 PHP 进程正在使用大量资源)。
以下内容仅仅是为了兴趣——在这种情况下它没有什么用处:
如果您确实想确定某个特定进程在特定时刻服务于哪个站点,您可以运行跟踪来查找文件访问。但请注意,在高流量服务器上会非常快速地生成大量输出。
例如,以下内容将显示文件打开(如果使用 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
或者,您可以查看进程读取,并搜索“Host”:
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
(您可能需要使“字符串长度”值更长)
再次提醒,请记住,这两者都是对给定流程所服务的“瞬间”观察——下一瞬间将会发生变化——因此,除了好奇心之外,它毫无用处。
答案2
您在顶部输出中看到的进程反映了已生成多少个守护进程来处理对您的服务器的 HTTP/S 请求。它们没有明确链接到特定网站。当请求到达您的服务器时,空闲的守护进程将接收该请求,然后根据发送到服务器的标头信息将其连接到正确的文件。
简而言之,没有任何过程明确地与特定站点相关联,但所有过程都可能与其相关联。
问候,菲尔,
答案3
netstat -tp 将告诉您哪个进程正在服务哪个 TCP 连接,从而允许您将进程映射到主机名。
也就是说,你最好使用 Apache 的 mod_status (http://httpd.apache.org/docs/2.0/mod/mod_status.html),因为它是专门为解决这个问题而构建的。
不过,这里看起来 CPU 不是您的问题。您有 12M 的可用内存,并且大量使用交换空间。