如何追查一个io绑定的botleneck

我目前正在优化一个Web服务器,但是我很困扰一个特定的问题。 我使用Jmeter来模拟负载。 Jmeterconfiguration如下:

  • 400线程
  • 升级30秒
  • 循环计数1
  • 每个线程在服务器上访问17个不同的页面,每个请求之间有1 – 5秒的延迟。

我所经历的是,多达350个线程似乎正在工作,因为它应该。 负载和CPU使用率增加,网站变得明显慢,但直到可用。

在350-400个线程之间有一些事情发生。 负载下降到几乎没有什么,CPU闲置大约75 – 85%,网站挂起几分钟为大家。

我排除的是:

  • 服务器不交换,至less它不显示顶部和收集图表。
  • 没有正在等待完成的MySQL查询(由MySQLpipe理员报告)。 虽然我看到很多开放的联系。
  • MySQL中的max_connections是1600(每个请求有1个MySQL连接,所以这个限制还远远没有达到)
  • 等等就是说在cpu图中不存在(collectd)
  • 我们正在使用memcached,但超时设置为1秒。
  • memcached运行在同一台服务器上,所以networking延迟不应该成为问题。
  • MaxClients和ServerLimit没有在Apache中达到

我正在耗尽如何跟踪这个问题的想法。 任何提示,技巧或想法,以帮助固定原因?

谢谢

您应该检查每个正在运行的程序所允许的最大打开文件描述符。

你可以用ulimit -n看到这个限制,并修改文件/etc/security/limits.conf的默认行为。

如果您允许2000个客户端连接到MySQL,但只能打开1024个(默认限制)文件描述符(包括networking套接字),它将停止响应新连接而不发出警告。