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

Kil*_*ian 10 mysql innodb performance my.cnf

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

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

我只使用 innodb,读取/写入大约 65%/35%。大约 800 - 1000 qps,但所有查询都很简单,永远不会加入超过 1 个额外的表。所有索引都已设置,并且没有单独的查询记录在慢日志中(> 2 秒)。目前我有大约 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
Run Code Online (Sandbox Code Playgroud)

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

磁盘输入/输出:

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95
Run Code Online (Sandbox Code Playgroud)

我的.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
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 7

我在 StackExchnage 写了一些帖子

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

请阅读这些内容以获得您需要的指导。

现在,对于更紧迫的问题:你提到你有 400MB 的数据,1GB 的索引。你的索引比数据大 50%,这让我很害怕。但是,由于您的所有数据都是 InnoDB 并且您对当前的查询性能感到满意,因此您的设置已经绰绰有余,尤其是 innodb_buffer_pool_size 的 16384MB。那是 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 变量?

试一试 !!!