MariaDB 10.1.22 使用更多 RAM 而不是 CPU

Ted*_*ugs 5 mysql mariadb

我正在使用:

Server version: 10.1.22-MariaDB - Source distribution
Run Code Online (Sandbox Code Playgroud)

服务器规格:

128GB RAM
CPU: E5-2600 
Run Code Online (Sandbox Code Playgroud)

我们有大约 80 个表,每个表的记录低于 10k 条记录,所有这些都是 InnoDB。我想利用它来使用更多的内存而不是服务器的 CPU 可能吗?

我的.cnf :

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
user    = mysql
datadir = /www/server/data
basedir = /www/server/mysql
log_error = /www/server/data/mariadb.err
#pid-file = /www/server/data/mariadb.pid
default_storage_engine = InnoDB
#skip-external-locking
#loose-skip-innodb
skip-name-resolve

performance_schema = OFF

key_buffer_size = 1024M
max_allowed_packet = 100G
table_open_cache = 4096
sort_buffer_size = 16M
net_buffer_length = 8K
read_buffer_size = 16M
read_rnd_buffer_size = 1M
myisam_sort_buffer_size = 256M
thread_cache_size = 512
query_cache_size = 512M
tmp_table_size = 512M
max_heap_table_size = 512M
table_definition_cache = 8192
table_cache = 4096
join_buffer_size = 10M
sort_buffer_size = 10M
sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES


#skip-networking
#skip-name-resolve
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

log-bin=mysql-bin
binlog_format=mixed
server-id   = 1
expire_logs_days = 10

default_storage_engine = InnoDB
innodb_data_home_dir = /www/server/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /www/server/data
innodb_buffer_pool_size = 4096M
innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 1024M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 30
innodb_log_files_in_group = 2
innodb_thread_concurrency = 20
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_io_capacity = 2000
innodb_file_format = Barracuda
innodb_buffer_pool_dump_at_shutdown = ON
innodb_buffer_pool_load_at_startup = ON
innodb_log_compressed_pages = 0
innodb_flush_neighbors = 0
innodb_adaptive_hash_index_partitions = 16
innodb_buffer_pool_instances = 4

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 1024M
sort_buffer_size = 16M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
Run Code Online (Sandbox Code Playgroud)

更新:我们在网站上有很多这种 SQL 命中(分页),但它已经被索引

SELECT VID, title, duration, addtime, thumb, thumbs, viewnumber, rate, likes, dislikes, type, hd FROM video WHERE active = '1' AND type = 'public' ORDER BY com_num DESC LIMIT 2952, 36
Run Code Online (Sandbox Code Playgroud)

它在 EXPLAIN 上显示类似这样的内容:

/* Affected rows: 0  Found rows: 1  Warnings: 0  Duration for 2 queries: 0.562 sec. */
Using index condition; Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)

你认为文件排序导致它使用更多的 CPU 吗?

在此处输入图片说明

上图(红框)的 CPU 使用率会在高峰时段飙升至 160%,我们如何减少它?

Rol*_*DBA 3

我看到你的innodb_thread_concurrency是 20。这不好。为什么 ???多年来,我了解到无限并发是最好的(请参阅我的旧帖子MySQL使用太多CPU)。通常,我建议将其设置为 0。

随着最近对 InnoDB 的改进,我了解到在某些情况下 0 可能不是最佳值。Percona Server 5.7 性能改进0一文对两个值(和64)进行了比较。文章指出:

多年来(Vadim 十年前就讨论过这个问题!)InnoDB 对于大多数可扩展性问题都有一个通用的解决方法:innodb_thread_concurrency 系统变量。它允许您限制 InnoDB 中的活动线程数量并减少共享资源争用。然而,它需要权衡,因为最大可能的性能也受到限制。

从这篇文章中,我开始意识到0可能不会提高Percona Server实例的CPU,但它可以稍微提高MySQL。将其设置为 64 可能有帮助,也可能没有帮助。为什么可以或不可以???该文章将 MySQL 与 Percona 进行了比较。您正在使用 MariaDB。因此,您必须对此进行试验。由于innodb_thread_concurrency是动态的,您可以运行

SET GLOBAL innodb_thread_concurrency = 0;
Run Code Online (Sandbox Code Playgroud)

或者

SET GLOBAL innodb_thread_concurrency = 64;
Run Code Online (Sandbox Code Playgroud)

看看CPU是否会稳定下来。

CPU 并不是唯一的问题。我还注意到你的innodb_buffer_pool_size只有 4G (4096M) 而你有 128G 的 RAM。从进程列表的外观来看,您似乎在计算机上运行了完整的堆栈。我怀疑innodb_buffer_pool_size太小,MySQL(MariaDB)正在旋转它的轮子,删除旧页面并在 InnoDB Buffer Pool 中导入新页面。您还有空间增加它,因为您有 109G (144515380k) 的可用 RAM。

建议


归档时间:

查看次数:

1852 次

最近记录:

8 年,1 月 前