最近我的网络服务器出现了一个奇怪的问题。在过去的一天左右,网站似乎在随机间隔内有所减慢,我们似乎没有遇到任何重大的额外流量,但是快速查看“top”和 httpd 似乎从 3-10% 跳升到 99% 左右,然后短暂地达到 80% 左右,然后又回落。例如:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2443 apache 25 0 256m 20m 5472 R 88.2 2.1 3:22.29 httpd
这似乎每 30 分钟左右就会发生一次。奇怪的是,在发生这种情况的同时,我可以运行 Apache 服务器状态页面并会得到(例如):
CPU Usage: u700.5 s6.22 cu0 cs0 - 20.2% CPU load
所以我的问题有两个:
- 有谁知道为什么这个问题可能在过去一天左右出现(服务器没有发生任何变化)
- 为什么我的 CPU 使用率统计数据远远高于服务器状态,哪个是正确的?
答案1
Apache 服务器状态页面中的 CPU 使用率是自 Apache 启动以来的平均使用率,因此它不会显示这样的峰值。当您遇到这些负载峰值时,您可以检查服务器状态页面以查看正在服务哪些页面/客户端(ExtendedStatus 必须处于打开状态)。
您还可以使用 netstat 查看当前正在访问您机器的客户端:
netstat -an | grep ESTABLISHED
如果您连续运行几个小时,并且流量激增,您可能会发现重复出现的 IP 地址,并可能追踪到特定的机器人/爬虫。如果确实如此,您可以考虑使用robots.txt限制机器人对您网站的抓取能力。
编辑:在繁忙的服务器上,上述 netstat 命令应显示一些条目,例如:
tcp 0 0 10.2.212.13:80 216.146.52.21:24979 ESTABLISHED
tcp 0 0 10.2.212.13:80 86.174.113.138:54901 ESTABLISHED
tcp 0 0 10.2.212.13:80 94.1.216.253:51204 ESTABLISHED
tcp 0 0 10.2.212.13:80 24.9.61.204:62936 ESTABLISHED
客户端的 IP 地址将在右侧。如果您只看到 1 或 2 行,则仅表示此时只有您的 ssh 连接。当您的负载增加时再次检查。您也可以删除 grep 以列出所有连接,尽管这将包括大量旧的 TIME_WAIT。
我将从扩展的服务器状态开始,看看是否可以在流量高峰期间显示任何明显的爬虫。
答案2
检查你的访问日志。由于间隔非常规律,数据挖掘器或爬虫可能会访问你网站上的每个页面。
答案3
创建一个简单的可执行文件:
#!/usr/bin/sh
# use IP
netstat -na |grep ESTABLISHED
# use NAMES
# netstat -ta |grep ESTABLISHED
“ta” 将打印出 DNS 名称,因此请取消注释您喜欢的名称。
然后将其放入一个按间隔运行文件的程序中,例如 crontab。我会阅读此手册页,您可能甚至无法使用它。您将需要将输出发送到日志以供将来使用。如果您希望记下运行时间,则可以向脚本添加日期命令。crontab 示例:
#minute hour dayofmonth monthofyear dayofweek
0,15,30,45 * * * * <path/to/script> > <log>
这是用 crontab -e 编辑的(再次阅读手册页)。
您可以使用它来对 access.log 中的顶级条目进行排序:
awk '{print $1}' access_log | sort |uniq -c |sort -n
如果您确实看到网页响应缓慢,请查看 I/O 等待,有时 CPU 使用率“高”并不是什么大问题。
答案4
我怀疑您使用的是四核 CPU。在这种情况下,您很容易陷入这样的境地:top 将返回每个核心的负载百分比,而其他工具会将此数字除以核心数,以得出整个 CPU 的总体负载数字。
就变化而言,我倾向于给出与 Hyppy 相同的建议。