我已经设置了一个 MariaDB 服务器,一切都运行良好,大多数查询的执行时间远低于 20 毫秒,但有时一个查询会花费半秒或更长的时间(有时是几秒),而我没有理由这样做能够参透。
我知道 >0.5 秒可能看起来不是很长的延迟,但如果我执行类似的查询,它将完成,根本没有明显的延迟,因此查询本身似乎没有缺陷。我正在使用它slow_query_log
来跟踪延迟查询,但它没有显示任何明显的罪魁祸首;延迟查询的锁定时间<1ms,索引使用的键长度较短,很少行受到影响等。
我的设置是 Ubuntu Server 14.04 和 MariaDB 10.0.22,大部分是普通设置。我确实启用了二进制日志(在混合模式下),因此我可以稍后设置复制,但我也发现了禁用它的问题。该数据库正在存储在同一服务器上运行的低影响 PHP 应用程序的数据,但我没有收到超过几十个同时连接;虽然这些可能会影响单个表,但不会影响同一行,而且我所有的表都是 InnoDB(我相信 MariaDB 上的 XtraDB),所以锁定不应该成为问题,慢速查询日志似乎支持了这一点。
被延迟的查询都是UPDATE
查询,但仅针对使用短(整数)主键的单行,只有百分之一的查询被延迟,但全天定期进行很多此类查询。所有字段都是固定长度的(没有 blob 或文本字段,只有整数和短 varchar)。
时间上的相对差异(<20ms 到 3s+)让我感到困惑,因为即使在处理未缓存的表等时我也看不出任何原因。我也看不到其他程序的性能有任何明显的提升;我确实每天运行备份,有时会稍微减慢速度,但这些备份在固定时间运行,而缓慢的查询在一整天都发生。我正在使用 HHVM 来运行 PHP 脚本,以防相关,但我发现它的内存和 CPU 使用率比普通 PHP 稳定得多,并且性能非常出色(当不被缓慢的查询延迟时),所以它似乎并不存在一个明显的罪魁祸首,当然不是几秒钟的延迟,因为它与 MariaDB 具有相同的优先级。
我还可以做些什么来调试这个,任何可能需要调整的 MariaDB 设置吗?
[编辑] 根据 Rui F Ribeiro 的要求,这里有一些额外的统计数据;这是一个相当普通的服务器,但使用率很低:
free -m
:
total used free shared buffers cached
Mem: 993 768 225 8 83 304
-/+ buffers/cache: 380 613
Swap: 0 0 0
vmstat
:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 231752 85788 311716 0 0 15 38 30 32 0 0 99 1 0
uptime
:
12:12:24 up 11 days, 21:32, 1 user, load average: 0.11, 0.08, 0.06
sudo /etc/init.d/mysql status
:
* /usr/bin/mysqladmin Ver 9.1 Distrib 10.0.22-MariaDB, for debian-linux-gnu on x86_64
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
Server version 10.0.22-MariaDB-1~precise-log
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 1 day 16 hours 23 min 23 sec
Threads: 1 Questions: 32381 Slow queries: 1089 Opens: 92 Flush tables: 5 Open tables: 17 Queries per second avg: 0.222
自从mysql
上次重新启动以来,看起来我的慢查询次数超过了百分之一(因为平均值大幅上升)。还值得注意的是,我通过 PHP 的 MySQLi 接口使用持久连接(这应该说明打开次数较少)(因此在持久连接时,锁等会自动释放)。