调整 MySQL 设置以处理大量用户负载

调整 MySQL 设置以处理大量用户负载

我开发了一款 php 游戏,它显然依赖于 mysql 查询。我在一台巨型服务器上运行它:Intel Xeon 7550,32GB RAM(Redhat x86_64 ES 5.0),安装了 cPanel。我在 Facebook 上发布了这款游戏,在 CPU 崩溃之前,只有 250 名用户可以使用它。

我打开了“top”并监控了 CPU 使用率。MySQL 一度使用率高达 1600%!所有其他东西都在 3% 左右。显然,我需要调整 mysql 的设置,以便更大规模地发布它。

如果这个问题含糊不清,请见谅。我对调整 mysql 服务器设置的知识非常有限。我需要调整哪些设置?我应该将它们设置为多少?我猜内存是其中之一?我预计会有 10,000 个会话同时运行。使用我当前的设置,我只能有 250 个。如果有经验丰富的服务器管理员提供任何指导,我将不胜感激。

答案1

我预见到的问题..

1.) Mysql 在设计上为数百/数千个连接使用了大量内存。

基本上你需要设置配置来帮助最大限度地减少内存使用
我不认为这是记忆问题
使用 200Mb 的数据库和 32Gb 的安装,你不应该达到最大内存
您只有 250 个用户,并且 CPU 已达到最大限度

2.) Mysql 在设计上,为每个核心提供一个连接/线程(可以共享)

这显然可以与许多线程共享,但 1 个线程不能突破核心。
您看到的问题是“慢速/繁重”查询太多,从而最大化每个核心。
因此您无法接收更多用户,因为 CPU 已达到极限
。-开始分析您的查询
-正确索引读取
-如果需要,使用写入主机和读取从机

一些问题

What is your ratio READS / WRITES???  
Have you tried Slow_query logging ( set it to 1 second )?  
Have you used "explain" on queries to see if indexing is working?  
Have you considered a job queue for writes?  
Are you using the mysql cache effectively for reads?

实际上,您的问题是错误的查询/插入..
如果您能解决这个问题,我们可以帮助您进行配置以最大限度地减少内存使用量。

该配置基本上对 CPU 使用率没有太大帮助,这取决于您的代码!

希望这很清楚:D

答案2

我只提出几点供大家思考。

在一台使用率很高的数据库服务器上,32GB 的 RAM 并不是“怪物”,但这取决于数据库的使用方式。如果您有无数的请求 - 并且数据(正在请求的)不能全部放入 RAM,那么磁盘系统就会严重影响数据存储的 I/O。听起来您不需要更多 RAM,因为您的 CPU 已经用到极限了。

1600% CPU 使用率相当于 X7550 上 16 个逻辑(8 个物理)核心达到最大值。您应该注意,数据库服务器上的超线程备受争议,因为它通常这会提高一点点写入性能,但会降低一点点读取性能。另一方面,禁用它并不能解决您的问题。

在我看来,您的数据库和/或应用程序在优化和处理时间方面设计得不是很好。250 个用户实际上杀死了 8x2,4GHz 核心,这不是我所说的普通事情,也不是 mysql 服务器设置可以为您解决的问题。

我已投票将此问题移至 Stack Overflow。

答案3

这是相当基础的,但是“mysql 性能调优入门脚本”(http://www.day32.com/MySQL/) 提供了一些很好的入门建议。

目前它处理以下方面的建议:

  • 慢查询日志
  • 最大連接數
  • 工作线程
  • 密钥缓冲区
  • 查询缓存
  • 排序缓冲区
  • 连接
  • 临时表
  • 表(打开和定义)缓存
  • 表锁定
  • 表扫描(read_buffer)
  • Innodb状态

答案4

我可以给出一些一般性建议,因为对于“盲”诊断来说,更具体的优化是困难/不可能的:

  • 默认的 my.cnf 使用非常低端的设置(至少是我见过的所有默认设置)。有各种各样的 my.cnf 示例,可以让您大致了解从哪里开始(搜索“mysql my.cnf 优化”)。请注意,您需要调整的确切设置取决于您的应用程序,因此对其他人有效的设置可能对您不起作用。
  • 说“250 个用户”是不够的。应用程序的读写量大吗?每个用户每秒有多少个查询?
  • 数据库是否在设计时充分考虑了性能?每个表是否都为常用查询设置了索引?查询是简单、复杂还是超级复杂?注意查询中的“陷阱”,它们可能会引发大量性能问题。您是在数据库端使用“WHERE”过滤记录,还是在服务器端通过请求并忽略每个请求中的多条记录进行过滤?
  • 对于具有正确 my.cnf 设置的 200MB 数据库,整个数据库工作集应该很容易放入 RAM 中,特别是对于具有 32GB 内存的服务器。
  • 如果您的应用程序读取大量复杂查询,请查看缓存策略以减少 MySQL 服务器上的负载。
  • 作为比较:我的 MySQL 服务器的容量(CPU/RAM)是您的服务器的 1/5,平均每秒对 MediaWiki 站点进行 100 次查询,并且始终有 90-95% 处于空闲状态。虽然我不知道您的应用程序/设置的详细信息,但我认为通过对 my.cnf 进行一些调整以及一些应用程序和数据库分析/优化,您可以将性能提高一到两个数量级。
  • 如果你对 MySQL 开发很感兴趣,可以考虑买本书高性能 MySQL。这是为新手用户提供的有关如何设置和使用 MySQL 的出色概述。MySQL 高性能博客也是一个值得经常访问的好网站。

相关内容