最近我们的 MySQL 服务器出现了严重的性能问题。应用服务器和数据库服务器是分开的。在数据库服务器端,平均负载迅速升高。CPU 使用率也居高不下(约 200%)。
平均负载:16.91、21.48、30.91
在应用程序端,我们手动关闭了手动打开的数据库连接。我的cnf也可以使用以下参数进行一些配置:
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
但仍然没有明显的改善。服务器使用率仍然很高。配置可能出了什么问题?如何保持服务器平均负载正常(或至少接近正常)?
答案1
为了解决这个问题,你(或你的代表)需要收集一些关于你的系统的数据,并使用以下方法进行分析:科学的方法(或者您喜欢的流程)。
您可以使用系统工具(如 sar、free、iostat、vmstat 等)收集数据。
阅读日志通常也很有帮助。
现在您已经了解了系统的运行情况,您可以开始提出问题、进行试验并分析结果。
- 您真正想要解决的问题是什么?
我的平均负载异常高。1
现在我们知道了要解决的实际问题,我们有了一些方向。让我们收集一些信息来帮助我们找到解决方案。
- 问题是否与时间有关?它是定期发生还是随机发生。
- 检查您的日志,检查所有日志,而不仅仅是特定服务的日志,因为其他原因可能会导致问题。日志条目通常有时间戳,这是为了帮助您关联多个应用程序和服务之间的事件 - 使用它们。如有必要,也可以增加日志详细程度。
- 观察系统正在做什么。使用 top、vmstat、iostat、sar、ps、tcpdump 等工具,甚至全面监控。
分析您收集到的信息。当服务停止响应时,系统上究竟发生了什么?系统资源的状态如何?
采取适当的措施进行补救。希望您能清楚地知道发生了什么,内存不足,OOM 杀手开始发挥作用,您的交换活动太高,您的运行队列太长,您受到 iobound 等。如果情况不明显,那么您可能没有收集正确的数据 - 您知道该怎么做,请返回 2。
监控4.处引入的变更。
这些变化解决了问题吗?是好转了吗?还是恶化了?没有区别吗?接下来该怎么做取决于你发现了什么。你可能需要回到 2. 并收集更多相关数据,或者 3. 重新分析你拥有的数据,或者 4. 因为你已经确定了许多潜在的解决方案。
记录您的发现和所做的更改。