VM 上的 MySQL,IO 等待时间长但 TPS 低

VM 上的 MySQL,IO 等待时间长但 TPS 低

我们正在尝试解决虚拟机上 MySQL 安装的一个奇怪情况。我们使用的是 Mysql 5.7 和带有 XFS 的 RHEL 7。

我们观察发现,当我们运行一些选择查询时,IOWait 竞争速度高达 40-50%,而我们看到磁盘读取速度没有超过 25-30 MBps。

我们在操作系统级别进行了检查,但当我们尝试进行文件复制和其他磁盘读写速度测试时,我们很容易获得 500-600 MBps。(所以我们假设它不是磁盘 IO 瓶颈)

IOPS 显示超过 20,000,平均为 9-10,000。

我们正在尝试找出可能导致磁盘 IO 等待的原因,尽管我们有足够快的磁盘和足够的 CPU 可用。下面列出了 MySQL 的一些关键变量:

显示类似 innodb_io% 的全局变量
innodb_io_capacity 200
innodb_io_capacity_max 2000

显示类似‘%thread%’的全局变量
innodb_purge_threads 4
innodb_read_io_threads 4
innodb_thread_concurrency 0
innodb_thread_sleep_delay 10000
innodb_write_io_threads 4
max_delayed_threads 20
max_insert_delayed_threads 20
myisam_repair_threads 1
performance_schema_max_thread_classes 50
performance_schema_max_thread_instances -1
thread_cache_size 100
thread_handling 每个连接一个线程
thread_stack 262144

显示类似“%thread%”的全局状态
延迟插入线程 0
性能模式线程类丢失 0
性能模式线程实例丢失 0
慢启动线程 2
线程缓存 61
线程连接 561
线程创建 44399
线程运行 2

选择@@Max_connections:1200

1. 慢查询解释如下:

EXPLAIN 
SELECT  COUNT(msgid)
    FROM  `2018-10-30`
    WHERE  priority=1
      AND  (message LIKE '%596f7572204f6e652054696d652050494e20%'
              OR  message LIKE '%4f545020666f7220%'
              OR  message LIKE '%4f545020616e642072656620%'
              OR  message LIKE '%4f545020746f20%'
           );

id 1
select_type 简单

EXPLAIN 
SELECT  COUNT(msgid)
    FROM  2018-10-30
    WHERE  priority=1
      AND  (message LIKE '%596f7572204f6e652054696d652050494e20%'
              OR  message LIKE '%4f545020666f7220%'
              OR  message LIKE '%4f545020616e642072656620%'
              OR  message LIKE '%4f545020746f20%'
           );

表 30-10-2018
分区 \N
类型 全部
可能的键 \N
键 \N
键长度 \N
引用 \N
行 28431345
已筛选 3.76
额外使用

2. 慢查询解释如下:

EXPLAIN 
SELECT  COUNT(msgid)
    FROM  `2018-10-30`
    WHERE  priority=1
      AND  ISDFlag=0
      AND  msgsubmitid IS NOT NULL
      AND  (message LIKE '%596f7572204f6e652054696d652050494e20%'
              OR  message LIKE '%4f545020666f7220%'
              OR  message LIKE '%4f545020616e642072656620%'
              OR  message LIKE '%4f545020746f20%'
           );

id 1
select_type SIMPLE
表 30-10-2018
分区 \N
类型 ALL
possible_keys index_msgsubmitid
键 \N
key_len \N
ref \N
行 28431345
筛选 0.19
额外使用 where

创建表
“创建表2018-10-30
MsgIdbigint(20)不为空,
UserIdint(11)不为空,
Statusbit(1)默认为空,
Priorityint(11)不为空,
MsgStatusint(11)默认'1111',
DestinationNumbervarchar(50)不为空,
OrginatorNamevarchar(11)默认为空,
OrginatorNumbervarchar(20)默认为空,
MsgSubmitIDvarchar(100)默认为空,
MsgStatusMsgvarchar(1000)默认为空,
MsgDeliveryDateTimevarchar(50)默认为空,
Messagevarchar(500)不为空,
IPaddressvarchar(15)不为空,
TransDatedatetime不为空,
SubmitDateTimedatetime默认为空,
SMSTypeint(11)默认为空,
DateTimeToSenddatetime默认为空,
Subjectvarchar(100)默认为空,
ISDFlagtinyint(4)默认为空,
GatewayIDint(11)默认为空,
SmscSubmitDateTimedatetime默认为空,
ClientMsgIdvarchar(100) DEFAULT NULL,
Sourceint(10) DEFAULT '0',
CreatedDateTimedatetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
UpdatedDateTimedatetime DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
PRIMARY KEY ( MsgId),
KEY index_msgsubmitid( MsgSubmitID),
KEY index_gatewayid( GatewayID),
KEY index_TransDate( TransDate),
KEY index_dstn_no( DestinationNumber),
KEY index_UserId( UserId),
KEY index_MsgStatus( MsgStatus)
) ENGINE=InnoDB DEFAULT CHARSET=latin1"

表索引 在此处输入图片描述

加载期间 iostat

[ ~]$ iostat -xm 5 3

Linux 3.10.0-957.5.1.el7.x86_64 (...)         04/09/2019      _x86_64_        (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.13    0.00    1.54    1.56    0.00   92.77

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0.00     0.00    0.00    0.00     0.00     0.00     8.00     0.00   31.50   31.50    0.00  31.50   0.00
sde               0.00     0.03   45.51   54.98     0.73     2.30    61.65     0.17    1.64    0.95    2.22   0.49   4.89
sdi               0.00     0.00    0.46    0.18     0.23     0.09  1016.01     0.02   31.79    6.59   95.41   1.15   0.07
sdh               0.00     1.77  112.94   27.89     1.77     0.69    35.77     0.13    0.96    0.79    1.65   0.48   6.83
sdc               0.00     0.18  114.18  144.24     2.11     7.36    75.07     0.33    1.26    0.95    1.50   0.45  11.62
sda               0.00     0.01    0.01    0.04     0.00     0.00   245.47     0.00    9.96    4.75   11.82   0.84   0.00
sdj               0.00     0.01   65.86    4.17     1.04     0.10    33.41     0.06    0.87    0.80    1.92   0.54   3.77
sdd               0.57     0.91    0.12    0.18     0.00     0.00    64.37     0.00    4.88    1.43    7.12   1.90   0.06
sdb               0.00     0.05   12.34    7.21     0.31     0.37    71.69     0.03    1.30    0.88    2.03   0.57   1.11
sdf               0.00     0.00   33.24    9.79     0.52     0.33    40.69     0.04    1.01    0.82    1.67   0.53   2.27
sdg               0.00     0.00   71.83    6.64     1.12     0.26    35.98     0.07    0.84    0.72    2.13   0.51   3.97
dm-0              0.00     0.00    2.73    1.44     0.15     0.01    76.44     0.00    1.17    1.31    0.90   0.60   0.25
dm-1              0.00     0.00    0.68    1.09     0.00     0.00     8.01     0.02   10.23    1.22   15.91   0.31   0.06
dm-2              0.00     0.00  453.14  249.19     7.43    11.24    54.44     0.81    1.15    0.84    1.72   0.30  21.30
dm-3              0.00     0.00    0.00    0.04     0.00     0.00   105.64     0.00   10.38    2.45   10.40   0.56   0.00
dm-4              0.00     0.00    0.49    0.50     0.24     0.23   981.47     0.03   25.41    6.51   44.16   1.00   0.10
dm-5              0.00     0.00    0.01    6.02     0.00     0.03     9.42     0.01    1.07    4.12    1.07   0.46   0.28

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.40    0.00    1.44   15.94    0.00   78.22

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sde               0.00     0.00  941.00    4.40    14.70     1.94    36.05     0.90    0.96    0.92    9.68   0.81  76.62
sdi               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdh               0.00     2.00    0.00    3.80     0.00     0.03    13.47     0.00    0.58    0.00    0.58   0.32   0.12
sdc               0.00     0.40  863.40  247.00    13.49    11.70    46.46     1.12    1.01    0.78    1.80   0.63  69.84
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdj               0.00     0.00    0.00    0.20     0.00     0.00    16.00     0.00    0.00    0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00   62.40     0.00     0.97    31.80     0.08    1.25    0.00    1.25   0.14   0.88
sdf               0.00     0.00 1818.40    0.00    28.41     0.00    32.00     2.10    1.15    1.15    0.00   0.54  98.94
sdg               0.00     0.00  131.40    0.20     2.05     0.00    32.00     0.18    1.34    1.34    1.00   1.33  17.50
dm-0              0.00     0.00    0.00    0.60     0.00     0.00    11.33     0.00    0.67    0.00    0.67   0.33   0.02
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00 3754.60  314.00    58.67    14.61    36.88     4.38    1.08    1.02    1.79   0.25  99.90
dm-3              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-4              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-5              0.00     0.00    0.00    5.80     0.00     0.03     8.83     0.00    0.38    0.00    0.38   0.24   0.14

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           4.30    0.00    1.36   15.71    0.00   78.62

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
fd0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sde               0.00     0.00 1004.60    3.60    15.70     1.70    35.34     0.89    0.89    0.86    9.11   0.78  78.80
sdi               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdh               0.00     2.00    0.00    3.80     0.00     0.02    13.05     0.00    0.74    0.00    0.74   0.63   0.24
sdc               0.00     0.00  883.40  135.60    13.80     7.78    43.37     0.87    0.86    0.78    1.35   0.69  70.42
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdj               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdd               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sdb               0.00     0.00    0.00   28.00     0.00     0.44    32.00     0.03    1.15    0.00    1.15   0.19   0.54
sdf               0.00     0.00 1762.60    0.00    27.54     0.00    32.00     2.09    1.19    1.19    0.00   0.56  98.88
sdg               0.00     0.00  126.00    0.00     1.97     0.00    32.00     0.18    1.39    1.39    0.00   1.39  17.54
dm-0              0.00     0.00    0.00    0.20     0.00     0.00    32.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00 3776.20  167.00    59.00     9.91    35.79     4.07    1.03    1.01    1.49   0.25  99.96
dm-3              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-4              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-5              0.00     0.00    0.00    5.80     0.00     0.02     8.55     0.00    0.83    0.00    0.83   0.41   0.24

安装输出

$ mount

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=49397072k,nr_inodes=12349268,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/mapper/rhel-root on / type xfs (rw,relatime,attr2,inode64,noquota)
mqueue on /dev/mqueue type mqueue (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
/dev/mapper/rhel-var on /var type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/rhel-home on /home type xfs (rw,nosuid,nodev,noexec,relatime,attr2,inode64,noquota)
/dev/mapper/rhel-tmp on /tmp type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/rhel-lv_dam on /dam_agent type ext4 (rw,relatime,data=ordered)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
tmpfs on /run/user/42 type tmpfs (rw,nosuid,nodev,relatime,size=9882784k,mode=700,uid=42,gid=42)
tmpfs on /run/user/987 type tmpfs (rw,nosuid,nodev,relatime,size=9882784k,mode=700,uid=987,gid=981)
tmpfs on /run/user/1012 type tmpfs (rw,nosuid,nodev,relatime,size=9882784k,mode=700,uid=1012,gid=1012)
tmpfs on /run/user/1005 type tmpfs (rw,nosuid,nodev,relatime,size=9882784k,mode=700,uid=1005,gid=1005)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=51,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=19059084)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=9882784k,mode=700)

服务器统计
CPU:24
核心:24
插槽:12
RAM:96GB

ioping 统计数据
在调查过程中,我们发现了以下 ioping 统计数据,这些数据显示某些 ping 高达 5ms,我们仍在调查这是否会对磁盘 IO 带宽产生任何影响:

# ioping /var/
4 KiB <<< /var/ (xfs /dev/dm-2): request=1 time=6.12 ms (warmup)
4 KiB <<< /var/ (xfs /dev/dm-2): request=2 time=569.9 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=3 time=618.6 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=4 time=505.7 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=5 time=534.8 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=6 time=744.6 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=7 time=1.10 ms (slow)
4 KiB <<< /var/ (xfs /dev/dm-2): request=8 time=447.6 us (fast)
4 KiB <<< /var/ (xfs /dev/dm-2): request=9 time=578.0 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=10 time=1.11 ms (slow)
4 KiB <<< /var/ (xfs /dev/dm-2): request=11 time=586.4 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=12 time=449.4 us (fast)
4 KiB <<< /var/ (xfs /dev/dm-2): request=13 time=402.0 us (fast)
4 KiB <<< /var/ (xfs /dev/dm-2): request=14 time=650.4 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=15 time=497.9 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=16 time=4.78 ms (slow)
4 KiB <<< /var/ (xfs /dev/dm-2): request=17 time=534.5 us (fast)
4 KiB <<< /var/ (xfs /dev/dm-2): request=18 time=8.27 ms (slow)
4 KiB <<< /var/ (xfs /dev/dm-2): request=19 time=876.8 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=20 time=3.99 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=21 time=1.04 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=22 time=1.20 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=23 time=980.6 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=24 time=2.26 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=25 time=794.6 us (fast)
4 KiB <<< /var/ (xfs /dev/dm-2): request=26 time=963.0 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=27 time=1.91 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=28 time=1.04 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=29 time=643.9 us (fast)
4 KiB <<< /var/ (xfs /dev/dm-2): request=30 time=1.40 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=31 time=837.2 us
4 KiB <<< /var/ (xfs /dev/dm-2): request=32 time=1.54 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=33 time=5.13 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=34 time=381.3 us (fast)
4 KiB <<< /var/ (xfs /dev/dm-2): request=35 time=1.03 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=36 time=1.27 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=37 time=1.99 ms
4 KiB <<< /var/ (xfs /dev/dm-2): request=38 time=827.9 us
^C
--- /var/ (xfs /dev/dm-2) ioping statistics ---
37 requests completed in 52.5 ms, 148 KiB read, 705 iops, 2.75 MiB/s
generated 38 requests in 37.5 s, 152 KiB, 1 iops, 4.06 KiB/s
min/avg/max/mdev = 381.3 us / 1.42 ms / 8.27 ms / 1.59 ms

MySQLTuner 输出位于此链接:https://pastebin.com/H4pxRttg
MySQL my.cnf:https://pastebin.com/CEcjvBRS
显示全局状态:https://pastebin.com/c54xPmtT
显示全局变量:https://pastebin.com/9edrGmaL
显示进程列表:https://pastebin.com/gNwF0KpG

顶部
顶部

限制
ulimit -a

iostat
iostat

iostat2
iostat2

自由度
自由度

任何关于在哪里查看的见解都将不胜感激。

答案1

问题是您的message字段是,varchar()并且您正在对非索引列执行全文搜索 - 使用您的查询,前导%导致对整个数据列进行全文扫描,因为 MySQL 只能在传统 BTREE 索引的第一个通配符之前使用数据的前缀。

使用 MySQL 进行全文搜索并不是一个很好的用例,但是如果您决心使用 MySQL,请查看索引FULLTEXT- 这将使 MySQL 能够有效地查询数据而无需进行全表扫描。

https://dev.mysql.com/doc/refman/8.0/en/innodb-fulltext-index.html

无论对 InnoDB 进行多少调整都无法修复模式或查询设计问题。

答案2

每秒速率 = RPS - 建议考虑 my.cnf [mysqld] 部分。这些都是动态变量,可以使用 SET GLOBAL global_name=Value 进行设置;

read_rnd_buffer_size=262144  # from 8M to reduce handler_read_rnd_next RPS of 22,915
read_buffer_size=262144  # from 2M to reduce handler_read_next RPS of 52,015
innodb_lru_scan_depth=100  # from 1024 to conserve 90% of CPU cycles used for function
innodb_flushing_avg_loops=5  # from 30 to reduce innodb_buffer_pool_pages_dirty count of 17,452
innodb_change_buffer_max_size=15  # from 25 percent set aside from innodb_buffer_pool_size 

免责声明:我是我的个人资料、网络资料中提及的网站的网络内容的作者,其中包含联系信息。

您可以每小时使用 SHOW GLOBAL STATUS LIKE '%dirty%'; 来查看 innodb_buffer_pool_dirty_pages 数量的减少,这将对减少 innodb 数据表的 READS RPS 产生积极影响。

答案3

为提高 MySQL IOPS 实例需要考虑的建议,

SET GLOBAL innodb_io_capacity_max=18000  # from 2000
SET GLOBAL innodb_io_capacity=9000  # from 200

用于测试并在下次停止/启动服务之前应用于 my.cnf [mysqld] 部分。

免责声明:我是我的个人资料、网络个人资料中提到的网站的内容作者,可以提供额外的建议。

2019 年 4 月 18 日由于 SET GLOBAL variable_name=value 适用于“新连接”,请至少等待 1 小时以查看对 io 等待时间的影响。如果您的流程通常需要 3 小时,请等待 3 小时以查看影响。

答案4

你只做吗COUNTs?如果不是,请告诉我们真实的查询。快速查询有捷径可走COUNT;除非这是真正的目标,否则我们不应该讨论它们。

SELECT  COUNT(msgid)
    FROM  `2018-10-30`
    WHERE  priority=1
      AND  (message LIKE '%596f7572204f6e652054696d652050494e20%'
              OR  message LIKE '%4f545020666f7220%'
              OR  message LIKE '%4f545020616e642072656620%'
              OR  message LIKE '%4f545020746f20%'
           );

不要说COUNT(msgid),这意味着测试msgid存在NOT NULL。简单地说COUNT(*)

领先的通配符和OR都是性能杀手。但是,更改为REGEXP 可能加快一些速度。目前,该message列最多被扫描 4 次。使用以下方法,可以“一次性”完成所有操作:

AND message REGEXP '596f7572204f6e652054696d652050494e20|4f545020666f7220|4f545020616e642072656620|4f545020746f20'

priority现在占用 4 个字节;还不够吗TINYINT

另一个可能的加速方法是覆盖索引(并使用`COUNT(*)):

INDEX(priority, message, ISDFlag, msgsubmitid)

那么你提出的所有查询将减少需要扫描的内容。它们将扫描索引的 BTree,而不是更宽的数据的 BTree。

每秒输入/输出次数

表的块缓存在 buffer_pool 中。当它满了时,I/O 会踢出一些块并引入其他块。如果主表非常大,您可以期待 I/O。如果它适合 buffer_pool,您可能看不到 I/O,即使是表扫描也是如此。

联合国海克斯-- 看起来message全是十六进制。如果是,则使用UNHEX()HEX()并将列声明为VARBINARY(250)一半大小。同样,更小 --> 更少的 I/O(当表太大而无法缓存时)。

innodb_buffer_pool_size—— 这个值是多少?96GB 的 RAM 应该在 75G 左右。这个表有多大?有很多这样的表吗?根据这个尴尬的表名,我敢打赌有很多。

如果同一条消息出现在两天内会发生什么情况?

变量和状态分析

观察结果:

  • 版本:5.7.20-log
  • 94.2 GB 内存
  • 正常运行时间 = 30 天 02:56:40
  • 您没有在 Windows 上运行。
  • 运行 64 位版本
  • 您似乎正在运行全部(或大部分)InnoDB。

更重要的问题:

一些建议的变量更改:

innodb_page_cleaners = 16
innodb_buffer_pool_instances = 16
innodb_lru_scan_depth = 256
innodb_read_io_threads = 8
innodb_write_io_threads = 8
long_query_time = 2

很少 SELECT?所以这主要是“只写”?插入是分批的吗?

尽管innodb_log_file_size对于繁重的写入活动来说它比应有的要小,但现在更改它可能不值得付出努力。(5G 比 2G 更好。)

如果您正在使用 SSD,您不妨关闭innodb_flush_neighbors

您的 I/O 似乎处理量超过innodb_io_capacity = 200指示值;提高它。建议 500。

是否涉及复制?机器是从机吗?一些与复制相关的值看起来很奇怪,特别是: slave_skip_errors设置为一个奇怪的值。你是不是在“掩盖问题”?

近一半的 SELECT 都进行表扫描。这个比例相当高,可能需要研究一下。另一方面,SELECT 的数量相当少。

每天更换存储例程大约四次是相当频繁的。

SHOW TABLES每秒发生2-3次——这难道无法避免吗?

详细信息和其他观察结果:

( Innodb_buffer_pool_reads ) = 1,006,346,347 / 2602600 = 386 /sec-- InnoDB buffer_pool I/O 读取率 -- 检查 innodb_buffer_pool_size

( Innodb_buffer_pool_pages_flushed ) = 513,074,244 / 2602600 = 197 /sec-- 写入(刷新)-- 检查 innodb_buffer_pool_size

( Key_blocks_used * 1024 / key_buffer_size ) = 19 * 1024 / 1024M = 0.00%-- key_buffer 的使用百分比。高水位线。-- 降低 key_buffer_size 以避免不必要的内存使用。

( table_open_cache ) = 32,163-- 要缓存的表描述符的数量 -- 通常几百个就够了。

( innodb_buffer_pool_size / innodb_buffer_pool_instances ) = 71680M / 8 = 8960MB-- 每个 buffer_pool 实例的大小。-- 一个实例至少应为 1GB。在非常大的 RAM 中,应有 16 个实例。

( innodb_lru_scan_depth * innodb_page_cleaners ) = 1,024 * 4 = 4,096-- 每秒页面清理器的工作量。-- “InnoDB:page_cleaner:预期循环花费 1000 毫秒...” 可以通过降低 lru_scan_depth 来解决:考虑 1000 / innodb_page_cleaners

( innodb_page_cleaners / innodb_buffer_pool_instances ) = 4 / 8 = 0.5-- innodb_page_cleaners -- 建议将 innodb_page_cleaners 设置为 innodb_buffer_pool_instances

( innodb_lru_scan_depth ) = 1,024 -- “InnoDB:page_cleaner:预期循环花费 1000ms...” 可以通过降低 lru_scan_depth 来修复

( (Innodb_buffer_pool_reads + Innodb_buffer_pool_pages_flushed) ) = ((1006346347 + 513074244) ) / 2602600 = 583 /sec-- InnoDB I/O -- 增加 innodb_buffer_pool_size?

( Innodb_os_log_written ) = 7,973,352,303,616 / 2602600 = 3063610 /sec-- 这是 InnoDB 繁忙程度的指标。-- 非常空闲或非常繁忙的 InnoDB。

( Innodb_log_writes ) = 1,662,275,231 / 2602600 = 638 /sec

( Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 7,973,352,303,616 / (2602600 / 3600) / 2 / 2048M = 2.57-- 比率 -- (见会议纪要)

( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 2,602,600 / 60 * 2048M / 7973352303616 = 11.7-- InnoDB 日志轮换之间的分钟数从 5.6.8 开始,可以动态更改;请确保也更改 my.cnf。--(轮换之间建议 60 分钟有点武断。)调整 innodb_log_file_size。(无法在 AWS 中更改。)

( Com_rollback ) = 760,459 / 2602600 = 0.29 /sec-- InnoDB 中的回滚。-- 回滚频率过高可能表明应用程序逻辑效率低下。--
(另一方面,与 Com_commit 相比,Com_rollback 非常低。)

( Innodb_dblwr_writes ) = 29,374,160 / 2602600 = 11 /sec-- “双写缓冲区”写入磁盘。“双写”是一种可靠性功能。一些较新的版本/配置不需要它们。--(其他问题的症状)

( innodb_flush_neighbors ) = 1-- 将块写入磁盘时进行小幅优化。-- 对于 SSD 驱动器使用 0;对于 HDD 使用 1。

( ( Innodb_pages_read + Innodb_pages_written ) / Uptime / innodb_io_capacity ) = ( 1021090541 + 513083786 ) / 2602600 / 200 = 294.7%-- 如果 > 100%,则需要更多 io_capacity。-- 如果驱动器可以处理,则增加 innodb_io_capacity。

( innodb_io_capacity ) = 200-- 磁盘每秒的 I/O 操作数。慢速驱动器为 100;旋转驱动器为 200;SSD 为 1000-2000;乘以 RAID 因子。

( sync_binlog ) = 0-- 使用 1 来增加安全性,但会花费一些 I/O 成本 =1 可能会导致大量的“查询结束”;=0 可能会导致“binlog 处于不可能的位置”并在崩溃时丢失事务,但速度更快。

( innodb_thread_concurrency ) = 0-- 0 = 让 InnoDB 决定 concurrency_tickets 的最佳值。-- 设置为 0 或 64。这可能会减少 CPU 使用率。

( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF-- 是否记录所有死锁。-- 如果您受到死锁的困扰,请启用此功能。注意:如果您有大量死锁,这可能会将大量数据写入磁盘。

( local_infile ) = local_infile = ON -- local_infile = ON 存在潜在的安全问题

( bulk_insert_buffer_size / _ram ) = 8M / 101146479820.8 = 0.01%-- 多行 INSERT 和 LOAD DATA 的缓冲区 -- 太大可能会影响 RAM 大小。太小可能会妨碍此类操作。

( (Queries-Questions)/Queries ) = (5936481203-59444814)/5936481203 = 99.0%-- 存储例程内的查询比例。--(如果很高的话还不错;但它会影响其他一些结论的有效性。)

( (Com_insert + Com_update + Com_delete + Com_replace) / Com_commit ) = (2193033569 + 372855165 + 1643709242 + 0) / 1660237104 = 2.54-- 每次提交的语句数(假设所有都是 InnoDB)-- 低:可能有助于将查询分组到事务中;高:长事务会给各种事物带来压力。

( Select_scan ) = 7,124,788 / 2602600 = 2.7 /sec-- 全表扫描 -- 添加索引/优化查询(除非它们是小表)

( Select_scan / Com_select ) = 7,124,788 / 15138927 = 47.1%-- 执行全表扫描的选择百分比。(可能会被存储例程欺骗。)-- 添加索引/优化查询

( Com_insert + Com_delete + Com_delete_multi + Com_replace + Com_update + Com_update_multi ) = (2193033569 + 1643709242 + 0 + 0 + 372855165 + 571) / 2602600 = 1617 /sec-- 写入次数/秒 -- 50 次写入次数/秒 + 日志刷新可能会使普通驱动器的 I/O 写入容量达到最大

( expire_logs_days ) = 3-- 多久自动清除 binlog(这么多天后)-- 太大(或为零)= 消耗磁盘空间;太小 = 需要快速响应网络/机器崩溃。(如果 log_bin = OFF,则不相关)

( slave_pending_jobs_size_max / max_allowed_packet ) = 16M / 4M = 4– 对于并行从属线程 – slave_pending_jobs_size_max 不得小于 max_allowed_pa​​cket

( slave_skip_errors ) = slave_skip_errors = 1 03 21 05 41 062-- 忽略哪些错误情况 -- 修改代码比将问题掩盖起来要好。

( long_query_time ) = 10-- 定义“慢速”查询的截止时间(秒)。-- 建议 2

异常小:

(Com_select + Qcache_hits) / (Com_insert + Com_update + Com_delete + Com_replace) = 0.0036

异常大:

( Innodb_pages_read + Innodb_pages_written ) / Uptime = 589
Binlog_cache_use = 635 /sec
Com_begin = 633 /sec
Com_commit = 637 /sec
Com_commit + Com_rollback = 638 /sec
Com_create_procedure = 0.15 /HR
Com_dealloc_sql = 39 /HR
Com_delete = 631 /sec
Com_do = 2.3 /HR
Com_drop_procedure = 0.15 /HR
Com_execute_sql = 42 /HR
Com_insert = 842 /sec
Com_load = 0.79 /HR
Com_prepare_sql = 42 /HR
Com_rename_table = 0.05 /HR
Com_show_create_proc = 2.9 /sec
Com_show_tables = 2.6 /sec
Com_show_warnings = 92 /HR
Com_signal = 4.6 /HR
Com_slave_start = 0.0014 /HR
Com_slave_stop = 0.0014 /HR
Com_update = 143 /sec
Handler_commit = 4507 /sec
Handler_delete = 635 /sec
Handler_prepare = 4503 /sec
Handler_update = 2978 /sec
Innodb_buffer_pool_pages_data = 4.51e+6
Innodb_buffer_pool_pages_total = 4.59e+6
Innodb_buffer_pool_write_requests = 27091 /sec
Innodb_data_read = 6426970 /sec
Innodb_data_reads = 392 /sec
Innodb_data_writes = 848 /sec
Innodb_data_writes - Innodb_log_writes - Innodb_dblwr_writes = 198 /sec
Innodb_data_written = 9506808 /sec
Innodb_dblwr_pages_written = 196 /sec
Innodb_log_write_requests = 4670 /sec
Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group = 5,259.0MB
Innodb_pages_created = 30 /sec
Innodb_pages_read = 392 /sec
Innodb_pages_read + Innodb_pages_written = 1.53e+9
Innodb_pages_written = 197 /sec
Innodb_rows_deleted = 635 /sec
Innodb_rows_deleted + Innodb_rows_inserted = 1945 /sec
Innodb_rows_inserted = 1310 /sec
Innodb_rows_updated = 663 /sec
Max_execution_time_set = 16
Ongoing_anonymous_transaction_count = 1
Open_tables = 4,129
Performance_schema_digest_lost = 2.23e+7
Select_range / Com_select = 49.2%
Threads_cached = 315
auto_increment_offset = 2
innodb_open_files = 32,163
port = 3317
report_port = 3317

异常字符串:

Ssl_session_cache_mode = Unknown
event_scheduler = ON
have_ssl = YES
have_symlink = DISABLED
innodb_data_home_dir = /var/lib/mysql
innodb_fast_shutdown = 1
optimizer_trace = enabled=off,one_line=off
optimizer_trace_features = greedy_search=on, range_optimizer=on, dynamic_range=on, repeated_subselect=on
session_track_system_variables = time_zone, autocommit, character_set_client, character_set_results, character_set_connection
slave_compressed_protocol = ON
slave_rows_search_algorithms = TABLE_SCAN,INDEX_SCAN

相关内容