我有以下规格:
8vCPU / 32 GB 内存 / 160 GB 磁盘托管在 Digital Ocean 上
该 Web 应用程序基于 Laravel(PHP)构建,目前正在为 550 个并发用户提供服务。
这些是流程:
17767 mysql 20 0 29.160g 4.160g 18804 S 214.3 13.2 25:55.25 mysqld
20455 www-data 20 0 496504 45364 31252 S 19.9 0.1 0:11.90 apache2
21849 www-data 20 0 496420 44828 30868 S 10.4 0.1 0:08.25 apache2
20470 www-data 20 0 494500 43232 31188 S 8.8 0.1 0:09.81 apache2
2422 www-data 20 0 496436 41656 27660 R 8.5 0.1 0:02.39 apache2
29369 www-data 20 0 494324 42960 31048 R 8.5 0.1 0:04.87 apache2
28830 www-data 20 0 494320 41632 29700 S 8.1 0.1 0:02.57 apache2
21160 www-data 20 0 496392 44796 30804 S 7.8 0.1 0:08.95 apache2
20899 www-data 20 0 494424 42572 30552 R 7.2 0.1 0:07.29 apache2
20971 www-data 20 0 496432 45092 31060 S 6.8 0.1 0:07.21 apache2
21589 www-data 20 0 496468 44692 30612 S 6.5 0.1 0:06.98 apache2
32660 www-data 20 0 496520 44816 30796 R 6.5 0.1 0:03.80 apache2
21650 www-data 20 0 494460 42984 30996 S 5.5 0.1 0:06.84 apache2
...
...
...
MYSQL 的 CPU 使用率为 214%,而且似乎我的所有努力都无法降低这个数字。
查看 Digital Ocean 提供的图表,当前总体 CPU 使用率为 80%,而 RAM 仅为 25%。这很奇怪吗?我一直认为 RAM 通常是性能的瓶颈,而不是 CPU。
这是我的 MYSQL 设置
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 16
myisam-recover-options = BACKUP
max_connections = 500
wait_timeout = 20000
query_cache_limit = 2M
query_cache_size=0
query_cache_type=0
tmp_table_size = 320M
max_heap_table_size = 320M
log_error = /var/log/mysql/error.log
expire_logs_days = 10
max_binlog_size = 100M
innodb_buffer_pool_size=22G
innodb_buffer_pool_instances=22
innodb_log_file_size=5G
innodb_read_io_threads=8G
innodb_write_io_threads=8G
我感觉我已经用尽了所有办法。我浏览了许多互联网帖子,调整了许多变量,例如innodb_buffer_pool_size
,innodb_buffer_pool_instance
等,以更好地表示硬件,使用 mysql 调谐器并遵循其所有建议,我花了很多很多小时检查代码的每一部分,记录每个缓慢的查询和请求,并优化应用程序,但这也只带来了最小的改变。我是不是遗漏了什么?还是我到了需要再次增强服务器的地步?25% 的内存使用率异常低……
任何建议都会有很大帮助。谢谢。
答案1
由于声誉不佳,我无法发表评论。我是新来的!但请将此视为评论。
需要考虑的一些事项。Inno_buffer_pool_size 似乎过多,并且根据文档;*“缓冲池大小必须始终等于或等于 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances”*
几个月前我遇到过类似的问题,在修改了所有我能想到的东西之后,我终于通过备份配置文件(在我的情况下是 /etc/my.cnf.d/server.cnf)并删除除绑定 IP 地址和端口等基本内容之外的所有内容解决了它。
重新加载 mysql 后问题消失了,所以我知道这是我所做的更改的组合。我重新引入了每个更改,每次都重新启动,直到原来的问题再次出现。我不记得是哪个选项,但我摆弄了一下并对其进行了更好的调整。
看起来交换对您来说不是问题,但请留意可能发生的任何磁盘交换。
再次重申,这是一条评论。:)
答案2
您至少需要发布以下输出
显示完整流程清单;
并从那里可能启用慢查询日志记录:
slow_query_log=1
长查询时间=0
然后过一会儿发布输出:
mysqldumpslow -st /path/to/slow.log | head -100
然后我们可以看看哪些查询正在消耗你的 CPU,以及是否可以让它们消耗更少的 CPU。
数据库性能优化 5% 是配置,95% 是查询优化,除非配置确实严重错误。不过,如果你相信 mysqltuner 告诉你的任何东西,那么严重错误的配置也是有可能的,例如 80 亿个 io 线程……
答案3
innodb_read_io_threads=8G
innodb_write_io_threads=8G
不!!
每个 io_thread 占用一定量的 RAM、CPU、系统等。“8”是合理的;“8G”是非常不合理。我很惊讶系统没有崩溃。
您是否更改了其他设置?