因此,我偶尔会在 Firebug 中看到请求需要超过 15 秒甚至 60 秒才能响应,有时甚至永远不会响应。以下是我排除的情况:
- 这不是 CPU 的问题,因为每次我检查服务器负载时,这 3 个数字都小于 6
- 这不是内存问题,因为内存也相当低,不到 50%
- 它不再是 I/O 了,因为我已经看到了 Joyent 在我请求它们时发回给我的图表,它们显示少于 3MB 的 I/O(大部分都是读取的)。
- 这不是 SQL 性能问题 - 我已经分析了运行的每个 SQL 命令,它们全部(无论如何是 99.9%)运行时间都少于 30 毫秒,大多数运行时间少于 5 毫秒。
- 哦,我一直在分析所有脚本的执行时间,即使出现问题,脚本也总是能在 50 毫秒或更短的时间内完成(即 1/20 秒)。现在,我确实运行了很多 Ajax 调用。每个用户每 2 秒 1 次,我有 300 个 DAU+。但是,即使所有 300 个同时播放,每秒最多也只有 150 次调用。我能想到的唯一另一件事是我的一个邻居很古怪。这个问题非常间歇性。99% 的时间它运行良好,性能出色。但 99% 以上还不够好。
- 最终,性能变得非常糟糕,我不得不重启服务器,此时一切又恢复正常。我已经这样做了大约 4 次。有什么想法吗?注意:这是在 joyent、vps、入门包 256mb 内存上进行的,具有爆发性。
以下是 mysql 转储信息:
Traffic ø per hour
Received 18 MiB 29 MiB
Sent 134 MiB 221 MiB
Total 151 MiB 251 MiB
Connections ø per hour %
max. concurrent connections 5 --- ---
Failed attempts 0 0.00 0.00%
Aborted 0 0.00 0.00%
Total 9,418 15.59 k 100.00%
答案1
好的,我想我已经找到问题所在了。Apache 中的 MaxClients 数量设置为 8,这个值太低了。我增加了这个值,现在看起来情况有所好转。
答案2
尝试运行ps -faux
,然后查看您的进程。特别注意列STATS
。如果您看到“Ss”,则表示您的脚本已被阻止。
如果它是一个数据库连接,请确保您已wait_timeout
在 MySQL 中设置(statement_timeout
对于 PostSQL 用户而言),否则当您运行数据库查询时您可能会被阻止而不是返回。
您还可以运行strace -p <process id>
以查看您的进程正在运行哪些系统调用。希望您擅长 C 语言 :-)
我会将日志记录添加到您的脚本中,以找出是什么阻碍了那 1% 的时间。祝你好运。
答案3
如果您的数据库存在性能问题,可能是因为您没有关闭连接。您可以打开连接池来消除这个问题。您还可以打开输出缓存以确保查询快速返回。
答案4
您的服务器根本动力不足。每秒 150 个请求对于运行完整 LAMP 堆栈的 VM 来说太多了。
您看到的行为是 Apache 被 8 个并发请求完全占用,因此拒绝第 9 个请求。
您回答说,您将 MaxClients 增加到 8,问题就解决了。但是,您现在很可能会在负载下进行交换,导致整个服务器瘫痪。我详细介绍了如何正确配置 LAMP 堆栈在我的回答中。
根据您提供的数字,您根本无法处理 150 rps 的负载。150 rps 的负载和每次执行需要 50ms,处理这 150 个请求需要 7.5 秒。这意味着需要至少 8 个并发。然而,8 是最低限度因为它只有在 150 个请求分布大致均匀时才会起作用。如果在 10 毫秒内突然收到 50 个请求,那么您将丢弃其中的 42 个。
您需要增加 MaxClients 才能轻松承受您预期的任何负载峰值。然而,在 256M 服务器上几乎没有空间来做到这一点。我猜您的平均 httpd 进程大小在 10MB 到 20MB 之间。您不能只启动 15 个而不进行交换。