我正在使用 aws 服务器 r4.4xlarge,并为数据库分配了超过 60GB,但仍然面临 CPU 使用率过高的问题。
我有大约 10 个大表,每个表的大小约为 18GB,具有整数主键。所有表都是 innodb,并且我还通过将其添加到默认配置文件中对 innodb 进行了优化。
innodb_buffer_pool_size=60G #(max 60 % of your Memory if and only if Memory >= 8G)
innodb_log_file_size=15G #(min 25% of innodb_buffer_pool_size)
innodb_flush_log_at_trx_commit=2
另外,在 mysql 中调试时,我对某些查询有疑问,但我仍然希望 mariadb 能够正确利用实例。大多数进程处于睡眠状态,但有些进程处于查询状态很长一段时间。
+---------+-----------------+-----------------+------------------+---------+------+----------------+-----------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+---------+-----------------+-----------------+------------------+---------+------+----------------+-----------------+----------+
| 5415663 | root | localhost | test_db | Query | 0 | Sorting result | SELECT XXXXX | 0.000 |
我需要建议,关于我是否应该继续优化某些东西,以便从 mariadb 中获得最大收益。
Tasks: 339 total, 1 running, 338 sleeping, 0 stopped, 0 zombie
%Cpu(s): 13.0 us, 0.1 sy, 0.0 ni, 86.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 12582731+total, 40068792 free, 72185768 used, 13572756 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 51496540 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
126064 mysql 20 0 65.336g 0.063t 8968 S 205.6 53.5 51004:26 mysqld
1346 rabbitmq 20 0 9804208 1.022g 4228 S 2.3 0.9 1336:27 beam.smp
1488 redis 20 0 604496 513216 2236 S 1.0 0.4 389:01.86 redis-server
7064 www-data 20 0 450464 38604 30744 S 0.3 0.0 0:00.93 php-fpm7.0
9226 www-data 20 0 383204 37932 29336 S 0.3 0.0 0:00.66 php-fpm7.0
9404 www-data 20 0 376000 36820 29016 S 0.3 0.0 0:00.57 php-fpm7.0
答案1
当您拥有 16 个核心时,200% 的 CPU 利用率不算高。200% 是两个满核(r4.4xlarge 中的 16 个核心)。考虑到您使用的内存量,MariaDB 肯定有所作为。事实上,您只使用了 16 个核心中的 2 个,我认为您的 CPU 利用率过低。
使用该htop
实用程序可以更好地了解 mariaDB 对核心的使用情况。
答案2
有一个错误https://jira.mariadb.org/browse/MDEV-15016。该错误已修复。使用最新版本(10.2.13、10.3.5)并再次验证一切正常。
答案3
大部分进程处于睡眠状态...
这是非常正常的,特别是当您的应用程序使用连接池时。
...但有些处于查询状态的时间相当长。
我需要一些建议,关于我是否还需要优化一些东西...
一般来说,数据库运行起来并不慢,但是
其中的查询运行起来却很慢。
您展示的示例是执行排序的选择。由于您为数据库提供了大量内存,因此它将尝试“在内存中”进行排序,但执行那消耗 CPU 能力 - 这就是您所看到的。
调查此查询[的解释计划]并寻求改进。
正如我喜欢说的:
- 你可以花几天时间摆弄数据库和服务器级别的设置,并通过以下方式提高“性能”:或许- 2 或 3百分点。
- 您可以花费相同的时间构建更清晰的表结构,添加适当的索引等,并通过以下方式提高“性能” -至少- 2 或 3数量级。