MySQL服务器平均负载很高

最近我们在MySQL服务器上遇到严重的性能问题。 应用服务器和数据库服务器是分开的 在数据库服务器端,负载平均值立即上升。 CPU使用率也很高(约200%)。

平均负载:16.91,21.48,30.91

在应用程序结束时,我们手动closures了手动打开的任何地方的数据库连接。 my.cnf也使用以下参数进行configuration:

innodb_buffer_pool_size = 4G query_cache_type = 1 wait_timeout = 1800 key_buffer = 16M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 32 query_cache_limit = 5M query_cache_size = 640M query_cache_type = 1 

但仍然没有明显的改善。 服务器使用率仍然非常高。 什么可能会出现configuration错误? 如何保持服务器负载平均正常(或至less接近正常)?

为了解决这个问题,你(或者你的代表)需要收集一些关于你的系统的数据,并用科学方法 (或者你喜欢的一个过程)来分析它。

您可以使用sar,free,iostat,vmstat等系统工具收集数据。

安装监控来收集和跟踪数据1,2

阅读你的日志也经常是有帮助的。

现在您已经了解了系统的运行情况,您可以不问问题,进行试验并分析结果。


  1. 你试图解决的实际问题是什么?

我的平均负载非常高。 1

  1. 所以,现在我们知道我们正在解决的实际问题是什么,我们有一些方向。 让我们收集一些信息来帮助我们找出解决scheme。

    • 问题时间有关吗? 这是否定期或随机发生?
    • 检查你的日志,所有这些,不只是特定的服务的日志,因为别的东西可能会导致这个问题。 日志条目通常有时间戳,这是为了帮助您关联多个应用程序和服务之间的事件 – 使用它们。 如有必要,也可以增加日志冗长度。
    • 看看你的系统在做什么。 使用像top,vmstat,iostat,sar,ps,tcpdump甚至全面的监视工具。
  2. 分析您收集的信息。 当服务停止响应时,系统上实际发生了什么? 系统资源的状态是什么?

  3. 采取适当的措施进行补救。 希望这是很明显的发生了什么事情,你内存不足,OOM杀手出来玩,你的交换活动太高,你的运行队列太长,你iobound等等。如果不明显,可能不会收集正确的数据 – 你知道该怎么做,回到2。

  4. 监视4.做的更改。

  5. 这些改变是否解决了这个问题? 好点吗? 情况更糟吗? 有没有区别? 你从哪里出发取决于你的发现。 您可能需要返回2.收集更多相关数据或3.重新分析您拥有的数据或4.因为您确定了一些可能的解决scheme。

  6. logging您的发现和您所做的更改。