为什么我的服务器性能会降低到停止点?

所以,有一段时间,我看到在萤火虫,一个请求超过15甚至60秒的反应,有时从来没有。 这是我排除的:

  • 这不是CPU,因为每次我检查服务器的负载时,所有3个数字都小于6
  • 这不是记忆,因为这也相当低,50%
  • 这不是I / O了,因为我已经看到了Joyent在我请求时发回给我的图表,并且它们显示的I / O不足3MB(主要是全部读取)。
  • 这不是SQL性能 – 我已经分析了每个运行的最后一条SQL命令,而且它们都是(不pipe它们中的99.9%)在不到30ms内运行,大部分运行在5ms以内。
  • 哦,我一直在分析所有的脚本执行时间,甚至在问题发生的时候,脚本总是在50ms或更短的时间内完成(即1/20秒)。 现在,我运行了很多Ajax调用。 每2秒钟1个用户,我有300个DAU +。 但是,即使全部300个同时播放,那么每秒最多只有150个呼叫。 唯一能想到的是我的一个邻居是时髦的。 问题是高度间歇的。 99%的时间它完美的工作,并有出色的performance。 但是99%以上还不够好。
  • 最终性能变得如此糟糕,我不得不重新启动服务器,在这一点上一切都很好。 我现在已经做了4次了。 有任何想法吗? 注意:这是在joyent,vps,intro包256m ram与爆裂。

这里是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% 

好的,我想我已经知道了这个问题。 Apache中的MaxClients数量被设置为8,这个值太低了。 我增加了,现在看起来好多了。

尝试运行ps -faux ,然后看看你的过程。 请特别注意STATS列。 如果你看到“Ss”,那么你的脚本被阻止。

如果数据库连接确保在MySQL中有wait_timeout (对于那里的ya PostSQL用户,则为statement_timeout),否则在运行数据库查询时,您可能会阻塞而不是返回。

你也可以运行strace -p <process id>来查看你的进程正在运行什么系统调用。 希望你擅长C 🙂

我会将日志logging添加到您的脚本中,以查明什么阻止了1%的时间。 祝你好运。

如果你的数据库有性能问题,可能是你没有closures你的连接。 您可以打开连接池以消除这种情况。 您也可以打开输出caching以确保查询快速返回。

你的服务器是动力不足的。 每秒150个请求是很多要发送到正在运行一个完整的LAMP堆栈的虚拟机。

你看到的行为是Apache被8个并发请求完全占用,因此拒绝了9个。

你已经回答说,你增加了MaxClients到8,并解决了这个问题。 但是,现在您很可能会在负载下进行交换,导致整个服务器出现故障。 我在这里回答了很多关于正确configurationLAMP堆栈的细节。

用你提供的数字,你根本无法处理150 rps的负载。 150 rps,每次执行需要50ms,处理这150个请求需要7.5秒。 这意味着要求最小的并发度为8.然而,只有在你的150个请求或多或less均匀分布的情况下,8才是最小的 。 如果你在10毫秒的时间内爆发了50个请求,那么你将丢掉42个请求。

您需要增加您的MaxClients,以便能够舒适地维持您期望的任何负载峰值。 但是,在256M服务器上实际上没有这个空间。 我猜你的平均httpd进程大小是从10MB到20MB的任何地方。 你不能在不转换的情况下旋转其中的15个。