MySQL 5.1 InnoDB配置/ 24GB RAM-双至强高负载


10

我正在运行一个Facebook应用程序,该应用程序目前有300-600个并发用户(并且还在不断增长)。为了使硬件为增长做好准备,我将i7 / 12gb ram / 2x 80g intel x25 ssd(debian 5.0 / mysql 5.0 / 64bit)更改为bi-xeon / 24gb ram / 2x 120gb intel 320 ssd(ubuntu 10.10 / mysql 5.1 / 64位)。

现在我面临的问题是,性能要比“小盒子”差。在两台服务器上,我一直在使用nginx / php fcgi来提供内容。

我只使用innodb,读/写大约65%/ 35%。大约800-1000 qps,但是所有查询都很简单,永远不会加入超过1个额外的表。所有索引均已设置,并且慢速日志(> 2s)中不会记录任何查询。目前,我大约有400mb的数据(带索引的数据约为1gb),期望它每月增加一倍。

我很喜欢每个可以给我一个提示的人,告诉他们应该进行哪些更改以使其运行更加流畅。

i7机顶盒上的旧配置是这样的(混合myisam / innodb),最多可容纳800多个用户。

旧的my.cnf

   key_buffer              = 3000M
   max_allowed_packet      = 128M
   thread_stack            = 192K
   thread_cache_size       = 8
   max_connections        = 400
   table_cache            = 8000
   thread_concurrency     = 16
   query_cache_limit       = 8M
   query_cache_size        = 128M
   wait_timeout            = 10
   interactive_timeout     = 10
   connect_timeout         = 600
   low_priority_updates    = 1
   join_buffer_size        = 8M
   read_buffer_size        = 2M
   sort_buffer_size        = 3M
   myisam_sort_buffer_size = 32M
   read_rnd_buffer_size    = 4M
   innodb_buffer_pool_size = 3G
   innodb_log_buffer_size  = 8M

bi-xeon盒上的新配置是这样的(纯innodb),导致300多个用户的高负载。大约30个mysql进程位于进程列表的顶部。

磁盘I / O:

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95

my.cnf

    key_buffer              = 64M
    max_allowed_packet      = 1M
    thread_stack            = 192K
    thread_cache_size       = 128
    max_connections        = 500
    table_cache            = 512
    #thread_concurrency     = 10
    sort_buffer_size        = 256K
    read_buffer_size        = 256K
    read_rnd_buffer_size    = 256K
    tmp_table_size          = 32M
    max_heap_table_size     = 32M
    query_cache_limit       = 1M
    query_cache_size        = 128M
    query_cache_type        = 1

    innodb_file_per_table = 1
    innodb_data_file_path = ibdata1:1000M:autoextend
    innodb_buffer_pool_size = 16384M
    innodb_additional_mem_pool_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 0
    innodb_lock_wait_timeout = 50
    innodb_flush_method=O_DIRECT
    innodb_log_files_in_group = 2
    innodb_log_file_size = 128M
    innodb_log_buffer_size = 8M
    innodb_thread_concurrency = 12

嗯,已skip-name-resolve禁用,可以启用吗?
Wrikken 2011年

Answers:


7

我已经在StackExchnage中写了一些帖子

  1. 为InnoDB和MyISAM调整MySQL
  2. 如何控制InnoDB磁盘空间
  3. MySQL磁盘空间管理的另一个观点
  4. 关于InnoDB优化的观点
  5. InnoDB微调

请阅读这些内容以获取所需的指导。

现在,对于更紧迫的问题:您提到您有400MB的数据,其中1GB有索引。这让我感到害怕,您的索引比数据大50%。但是,由于您的所有数据都是InnoDB,并且您对当前的查询性能感到满意,因此您的设置已经足够了,尤其是16384MB的innodb_buffer_pool_size。那是16GB。你们都在那里。可是等等 !!!您的innodb_log_file_size是128M吗?考虑到16GB的缓冲池,该方法太小了。您应该调整ib_logfile文件的大小(将innodb_log_file_size设置为2047M)。

您可能正在按线程运行负载。尝试设置连接缓冲区(join_buffer_size,sort_buffer_size,read_buffer_size,read_rnd_buffer_size)

来自我:为什么MySQL会说我内存不足?

来自@DTest:如何计算mysql max_connections变量?

试试看 !!!


这全都是关于设置一些索引的...现在我有一些在其他组合中被双索引的列...并且我现在有35 GB的数据和10'000qps ...并且它像丝一样平滑。
Kilian

0
  • 您是否将某些表从MyISAM转换为InnoDB?
    如果是这样,请在http://mysql.rjweb.org/doc.php/myisam2innodb中检查性能的细微改进/降低。
  • innodb_flush_log_at_trx_commit = 1
    -导致在每次交易后写入日志。考虑使用= 2
  • max_connections-- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    这将告诉您自启动以来需要多少。
  • 查询缓存:

    query_cache_size        = 128M
    query_cache_type        = 1

    这些可能很痛苦。上面说,50MQC在维护上花费了太多时间。拥有它ON可能也很浪费。做SHOW GLOBAL STATUS LIKE 'Qc%'检查有效性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.