64GB 内存的 My.cnf

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)

Bil*_*win 8

一个帮助您调整 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=0query_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_threadsinnodb_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_pa​​cket 设置为 32M。请记住,如果您在配置文件中多次设置给定变量,则最后一个设置优先。所以你的数据包限制为 16M。如果您希望它们最多允许 32M,则取出此行。

[myisamchk]

[mysqlhotcopy]
Run Code Online (Sandbox Code Playgroud)

myisamchk 和 mysqlhotcopy 仅用于 MyISAM 和 ARCHIVE 表。如果您迁移到使用 InnoDB,则不需要使用这些工具。