我们有一个高流量的网站,高峰时有1000
并发用户,最低时有100
用户同时访问。平均每天要40,000
访问100,000
一次。问题是有时加载速度非常慢(我们将这次称为灾难时间:) ),当我们尝试使用 加载网站时Firefox
,它会显示waiting...
(我尝试使用世界各地的许多提供商)
我们监控服务器灾难次、、CPU load
都是Memory Usage
正常的。此外,的慢查询日志MySQL
没有任何查询1 sec
。Apache
没有任何错误。iotop
没有显示任何导致此灾难的因素。
有趣的是,灾难时间和高峰时间没有任何关系。有时灾难发生在300
并发用户身上,有时又发生在不同的时间。我找不到它们之间的任何关系。
灾难发生时如何追踪数据包?我想知道这个灾难是我们的数据中心的故障(例如上游或防火墙)还是我们的服务器的故障(例如Apache
配置、Web 应用程序或任何其他我不知道的故障)。
如需更多数据,只需添加评论,然后我会编辑我的问题以提供您需要回答的数据。
答案1
并发用户/访问量与系统的容量/性能无关 - 它只与并发连接以及这些请求正在执行的操作有关。
将请求响应时间添加到服务器日志中是一个开始 - 如果这些不能反映问题,则问题可能出在网络上。我注意到您在问题中没有提及您的网络服务器日志 - 您检查过它们吗?
您认为您的流量很大,而您的问题暗示您只有一台服务器。为什么?(多台服务器会增加此特定问题的复杂性,例如负载分配,但也会简化许多诊断,然而这对性能和可用性毫无影响)。
跟踪连接数和他们的状态还提供了诊断问题所需的重要数据。
灾难发生时如何追踪数据包?
使用数据包捕获程序 - 它可以运行在从客户端到服务器的任何地方。我使用 wireshark(适用于 Linux、MSWindows 和其他系统)
如果您提到您的服务器正在使用哪个版本/MPM 以及它在哪个操作系统上运行,那将会很有用。
答案2
如果你使用的是 Linux,则可以使用tcpdump
,例如:
$ tcpdump dst port 80
但我认为这没什么用。我会尽量排除尽可能多的变量。我的第一个想法是这可能是网络问题。
尝试创建一个带有响应时间的 Apache 日志,如下所示:
LogFormat "\"%{%Y-%m-%d %H:%M:%S}t\" %V %m \"%U\" \"%q\" %{Content-Type}o %s %B %O %D" responsetime
CustomLog "/var/log/apache2/responsetime.log" responsetime
然后,尝试从同一交换机上的机器/服务器访问 Web 服务器。
如果这看起来正常,请尝试使用类似的方法time wget http://localhost/index.html -q --output-document=/dev/null
在同一个盒子上执行此操作。