如何追踪 io 瓶颈

如何追踪 io 瓶颈

我目前正在优化一个 Web 服务器,但是我被一个特定的问题难住了。我正在使用 jmeter 来模拟负载。jmeter 的配置如下:

  • 400 个线程
  • 加速 30 秒
  • 循环次数 1
  • 每个线程访问服务器上的 17 个不同的页面,每个请求之间的延迟为 1 - 5 秒。

我遇到的情况是,线程数达到 350 时一切似乎都运行正常。负载和 CPU 使用率增加,网站明显变慢,但仍然可以使用。

然而,在 350 - 400 个线程之间,发生了一些事情。负载几乎降为零,CPU 空闲率约为 75 - 85%,并且网站对所有人来说都挂起了几分钟。

我排除的是:

  • 服务器没有交换,至少它没有显示在顶部和收集的图表中。
  • 没有等待完成的 MySQL 查询(MySQL 管理员报告)。尽管我看到很多打开的连接。
  • MySQL 中的 max_connections 为 1600(每个请求 1 个 MySQL 连接,因此远未达到此限制)
  • 等待在 CPU 图表 (collectd) 中可以说不存在
  • 我们正在使用memcached,但超时设置为1秒。
  • memcached 在同一台服务器上运行,因此网络延迟不是问题。
  • Apache 中未达到 MaxClients 和 ServerLimit

我不知道该如何追踪这个问题。有什么技巧、窍门或想法可以帮助我确定原因吗?

谢谢

答案1

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

您可以使用 查看此限制ulimit -n并修改文件中的默认行为/etc/security/limits.conf

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

相关内容