Mariadb 5.5 安装在 CentOS 上,为总容量约为 40GB(按磁盘上每个数据库文件计算)和 506 个表的数据库提供服务。该数据库由 php-fpm 查询,问题是,在某个时候,当流量增加时,mysqld
进程打开的文件数量(按lsof
状态计算)会增加到大约 200k,系统会挂起(具体来说,Web 请求非常慢,TTFB 需要 5 分钟)。
服务器本身应该具有足够的容量(Supermicro; X10DRH
125GB RAM 和 SSD),以便能够在如此适度的负载下快速运行。
检查 lsof 输出表明,mysqld 进程保持打开的表在和其中:
[root@mail proc]# lsof | wc -l 95592
其中大多数是打开的表:
[root@mail proc]# lsof | grep .ibd | wc -l 57331
在此之前,lsof 显示 /[aio] 的数量非常大,并且放置后innodb_use_native_aio=0
情况有所改善
mysql_slow_log
不显示运行时间超过 5 秒的查询,
| Innodb_mem_total | 33061601280
我的 MySQL 配置是:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
innodb_file_per_table = 1
innodb_buffer_pool_size = 1G
innodb_io_capacity = 2000
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
innodb_write_io_threads = 64
innodb_use_native_aio=0
skip-name-resolve=1
max_heap_table_size=256M
tmp_table_size=256M
slow-query-log=1
long_query_time=1
某些表mysql.log
在启动时显示一些错误:
191205 7:21:25 InnoDB: Error: trying to open a table, but could not InnoDB: open the tablespace file './staging/yotpo_rich_snippets.ibd'!
但我不确定这是否是导致性能低下的原因。
此外,数据库数据文件位于/home/
分区中,即:
/dev/md2 /home ext4 grpquota,usrquota,data=ordered,relatime,rw 0 2
如能提供任何关于在哪里挖掘的提示,我们将不胜感激。
答案1
有几种可能性:
- 有些查询需要很长时间(并且同时挂在文件(即表)上)。-- 查找慢速查询;让我们努力加快它们的速度。您已打开 slowlog;使用它
pt-query-digest
来识别“最差”的查询。 - 该APP使用了“EAV”模型,该模型连接了许多表。——如果是这样,让我们讨论一下。
- Web 服务器允许大量连接。如果允许“太多”,那么就会互相干扰。“TTFB 需要 5 分钟”就是一个线索。-- 在 Web 服务器层限制连接。
- RAM 使用效率不高。您有 125GB 的 RAM,但实际
innodb_buffer_pool_size
只有 1G。-- 将其更改为 80G。
同时,删除此问答并坚持使用更好的网站:dba.stackexchange.com。