Tom*_*ary 2 mysql my.cnf configuration
以下 my.cnf 文件是否适用于具有 64GB RAM 的专用服务器(在 Debian 上)?
我在服务器上只运行一个网站,并且在某些表中插入高负载数据需要几个世纪......似乎数据库无法处理某些表锁定(50Mb 表,不是那么多)。
如果没问题,那么我将逐步分析每个查询。
任何帮助将不胜感激!
[客户]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld]
port = 3306
socket = /var/run/mysqld/mysqld.sock
back_log = 50
skip-networking
max_connections = 100
max_connect_errors = 10
table_open_cache = 4096
table-definition-cache = 4096
skip-external-locking
skip-name-resolve
max_allowed_packet = 32M
binlog_cache_size = 2M
max_heap_table_size = 64M
read_buffer_size = 4M
read_rnd_buffer_size = 32M
sort_buffer_size = 16M
join_buffer_size = 8M
thread_cache_size = 20
thread_concurrency = 16
query_cache_type=1
query_cache_size = 1024M
query_cache_limit = 2M
ft_min_word_len = 4
default-storage-engine = MYISAM
thread_stack = 192K
transaction_isolation = REPEATABLE-READ
tmp_table_size = 4G
log-bin=mysql-bin
binlog_format=mixed
slow_query_log
long_query_time = 2
server-id = 1
key_buffer_size = 16G
bulk_insert_buffer_size = 256M
myisam_sort_buffer_size = 246M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 12G
innodb_data_file_path = ibdata1:10M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 512M
sort_buffer_size = 512M
read_buffer = 8M
write_buffer = 8M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
open-files-limit = 8192
Run Code Online (Sandbox Code Playgroud)
一个帮助您调整 MySQL 配置的好工具是 MySQL 的Percona 配置向导。这会询问您一些有关系统和工作负载的问题,并为您提供一些大致的调整值。
当然,术语调优表明进一步细化可能是有益的,但是随着您监控工作负载、资源使用情况和瓶颈,这种情况会随着时间的推移而发生。这不是我们可以在这样的帖子中一劳永逸地回答的问题。
但是,我对您的配置还有其他评论:
max_allowed_packet = 32M
Run Code Online (Sandbox Code Playgroud)
这不会生效,因为您稍后在配置文件中使用较小的值覆盖它。见下文。
binlog_cache_size = 2M
Run Code Online (Sandbox Code Playgroud)
这是默认值的 64 倍。除非你有充分的理由增加它,否则不要。请注意,binlog 缓存是按用户线程分配的,因此如果您有 100 个并发事务,这将使用 200MB 的 RAM。建议您删除此行并使用默认值。
max_heap_table_size = 64M
Run Code Online (Sandbox Code Playgroud)
这约束tmp_table-size. 见下文。
read_buffer_size = 4M
Run Code Online (Sandbox Code Playgroud)
这比默认值高 32 倍。它仅在 MyISAM 故事的表扫描期间使用。最好创建适当的索引并避免表扫描。建议您删除此行并使用默认值。
read_rnd_buffer_size = 32M
Run Code Online (Sandbox Code Playgroud)
这比默认值高 128 倍,比最大允许值 2M 高 16 倍。这仅用于 MySQL 5.5 及更早版本中的 MyISAM 读取,在 MySQL 5.6 中它也用于多范围读取。但可能没有必要增加它。建议您删除此行并使用默认值。
sort_buffer_size = 16M
Run Code Online (Sandbox Code Playgroud)
这比默认值高 4 倍。在 MySQL 5.6 中,它比默认值高 16 倍。这也是为每个用户线程分配的缓冲区,因此请注意增加它的大小。建议您删除此行并使用默认值。
join_buffer_size = 8M
Run Code Online (Sandbox Code Playgroud)
这比默认值高 64 倍,因此请确保您有充分的理由增加它。它在索引扫描和未索引列上的连接期间使用。更好地索引表会更好。请记住,可以为每个用户线程分配连接缓冲区,因此这 8MB 的数量可以解释不可预测的内存增长。建议您删除此行并使用默认值。
thread_cache_size = 20
Run Code Online (Sandbox Code Playgroud)
现代 Linux 内核可以比过去更快地创建线程,因此保留线程缓存不再那么重要。建议您删除此行并使用默认值。
thread_concurrency = 16
Run Code Online (Sandbox Code Playgroud)
您在 Solaris 上运行吗?如果没有,这个变量就没有意义。建议您删除此行。
query_cache_type=1
query_cache_size = 1024M
Run Code Online (Sandbox Code Playgroud)
这是专用于查询缓存的大量 RAM,并且它可能被过度分配。查询缓存有一些缺点,特别是当您有很多并发连接时。通常我们实际上建议禁用查询缓存,除非您能证明您获得了很大的收益。
通过设置禁用这两个 query_cache_type=0和query_cache_size=0。
ft_min_word_len = 4
Run Code Online (Sandbox Code Playgroud)
这是默认设置。建议您删除此行并使用默认值。
default-storage-engine = MYISAM
Run Code Online (Sandbox Code Playgroud)
建议将默认存储引擎设置为 InnoDB。
我建议不要将 MyISAM 用于任何事情。MyISAM 只支持表锁定,它在崩溃时很容易被破坏,它不再被开发,它正在逐渐被淘汰。声称 MyISAM 比 InnoDB 更快的说法是基于非常旧的 MySQL 版本。早在 2007 年,基准测试表明 InnoDB在大多数工作负载下都比 MyISAM 快。
使用 MyISAM 的最后一个原因之一,全文索引,也已过时。InnoDB 正在获取全文索引(它们是在 5.6 中引入的,但它们还不能真正使用)。无论如何,Sphinx 搜索更适合全文搜索。
thread_stack = 192K
Run Code Online (Sandbox Code Playgroud)
这实际上低于64 位系统上的默认值 256K。建议您删除此行并使用默认值。
transaction_isolation = REPEATABLE-READ
Run Code Online (Sandbox Code Playgroud)
这是默认设置。建议您删除此行并使用默认值。
tmp_table_size = 4G
Run Code Online (Sandbox Code Playgroud)
这将不允许任何高于 的 tmp 表max_heap_table_size,您之前将其设置为 32M。因此,如果您想要大型 tmp 表,您还必须增加该配置变量以匹配。但要小心,因为您可能最终会在内存中使用多个线程填充 4G tmp 表,然后开始交换。
key_buffer_size = 16G
bulk_insert_buffer_size = 256M
myisam_sort_buffer_size = 246M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
Run Code Online (Sandbox Code Playgroud)
这些仅由 MyISAM 使用,如果您不使用 MyISAM,则不需要它们。
innodb_additional_mem_pool_size = 16M
Run Code Online (Sandbox Code Playgroud)
这在现代 Linux 内核上没有实际意义,动态内存分配实际上比让 InnoDB 预分配内存更有效。建议您删除此行并使用默认值。
innodb_buffer_pool_size = 12G
Run Code Online (Sandbox Code Playgroud)
如果可能的话,这应该足以保存所有 InnoDB 数据和索引,再加上大约 10% 的额外更改缓冲区。
您可以查询 InnoDB 数据和索引的大小:
SELECT SUM(data_length+index_length)/1024/1024 AS total_InnoDB_size_in_MB
FROM INFORMATION_SCHEMA.TABLES
WHERE engine = 'InnoDB';
Run Code Online (Sandbox Code Playgroud)
如果该总数大于物理系统 RAM 的大小 (64G),则尽可能多地增加缓冲池。通常建议是大约 80% 的系统 RAM,假设您在同一台服务器上没有任何其他大内存消耗者。如果这样做,请减去其他进程所需的内存。
如果您的数据比您的系统 RAM 小很多,那么分配一个大的缓冲池就没有任何好处。缓冲池中只保存每一页数据和索引的一个副本。
innodb_data_file_path = ibdata1:10M:autoextend
Run Code Online (Sandbox Code Playgroud)
这是默认设置。
innodb_file_io_threads = 4
Run Code Online (Sandbox Code Playgroud)
在 MySQL 5.0(或 5.1 除非您启用 InnoDB 插件)之后无法识别此变量。使用innodb_read_io_threads和innodb_write_io_threads。此外,无论如何您都将变量设置为默认值,因此您不需要在配置文件中添加这一行。
如果您仍在运行足够旧的 MySQL 版本以识别此变量,我强烈建议您升级。
innodb_thread_concurrency = 16
Run Code Online (Sandbox Code Playgroud)
这可能已经过时了,除非您运行的是非常旧的 MySQL 版本。建议您删除此行并使用默认值 0(无限线程并发),除非您观察到瓶颈。
innodb_flush_log_at_trx_commit = 1
Run Code Online (Sandbox Code Playgroud)
这是默认设置。建议您删除此行并使用默认值。
innodb_log_buffer_size = 8M
Run Code Online (Sandbox Code Playgroud)
这是默认设置。建议您删除此行并使用默认值。
innodb_log_file_size = 256M
Run Code Online (Sandbox Code Playgroud)
这够了吗?太多了?这里有一个博客可以提供帮助:http : //www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/
innodb_log_files_in_group = 3
Run Code Online (Sandbox Code Playgroud)
在组中更改 innodb 日志文件没有任何好处。建议您删除此行并使用默认值。
innodb_max_dirty_pages_pct = 90
Run Code Online (Sandbox Code Playgroud)
这是 MySQL 5.0 中的默认设置。现在默认值是 75。但无论如何你也不可能有这么多脏页。建议您删除此行并使用默认值。
innodb_lock_wait_timeout = 120
Run Code Online (Sandbox Code Playgroud)
默认值为 50(秒),对于大多数工作负载应该足够了。你有理由把这个增加到 120 吗?
max_allowed_packet = 16M
Run Code Online (Sandbox Code Playgroud)
您之前将 max_allowed_packet 设置为 32M。请记住,如果您在配置文件中多次设置给定变量,则最后一个设置优先。所以你的数据包限制为 16M。如果您希望它们最多允许 32M,则取出此行。
[myisamchk]
[mysqlhotcopy]
Run Code Online (Sandbox Code Playgroud)
myisamchk 和 mysqlhotcopy 仅用于 MyISAM 和 ARCHIVE 表。如果您迁移到使用 InnoDB,则不需要使用这些工具。