MySQL查询随机丢失

时间:2013-12-15 00:47:53

标签: php mysql pdo

我有一个如下所示的查询:

SELECT id FROM user WHERE id='47'

对ID进行索引,并且在使用分析数据时,此查询的读取总是很快。

SET profiling = 1;
SHOW PROFILES;

查询总是在0.0002秒左右执行。

但是,如果我从PHP端分析查询,如下所示:

$current = microtime(true);
$data = $conn->query($full_query);
$elapsed = microtime(true) - $current;

然后偶尔这些查询中有一半可能会花费0.2秒。但是,在我的测试脚本中,我有代码来测试它,使用SET profiling = 1来描述查询;即使PHP通过PDO往返可能是0.2秒,查询时间仍然是0.0002。

我知道的事情,或者知道没有引起问题:

  1. 查询速度不慢。当我查看相同的查询时,从同一个查询运行,在PHP中进行分析并使用SET PROFILING进行分析,查询总是很快,并且永远不会记录在慢查询日志中,即使它显示从PHP端获取.2秒。
  2. 这不是与skip-name-resolve相关的 - 这是不一致的,我已经在上面使用skip-name-resolve
  3. 这不是与查询缓存相关的,
  4. 中存在这种行为
  5. 即使是从缓存中发出的查询,也会发生此行为。
  6. 查询实际上并未选择ID,但我使用此查询进行测试,以表明它不是磁盘访问问题,因为该字段已明确编入索引。
  7. 这张表只有10-20 megs,类似1 meg索引。机器显示非常小的负载,并且innodb没有使用它的所有缓冲区。
  8. 针对除了我的测试查询之外没有其他任何活动的表进行测试。
  9. 有没有人知道还有什么要检查?在我看来,这似乎是一个网络问题,但我需要能够看到它并找到问题来解决它,而且我已经没有地方可以检查下一步了。有什么想法吗?

7 个答案:

答案 0 :(得分:11)

我会描述一下这台机器。

你说这种情况每50次发生1次,并且每个查询都有0.2秒的基准。您应该能够在屏幕中放置顶部,然后在PHP中运行查询循环以加载测试RDBMS并收集性能统计信息。

您可能需要运行超过50 * 0.2 = 10 seconds ,因为您的“50分之一”统计信息可能基于手动运行的个别查询 - 基于我在你的描述中读到的内容。尝试30秒和90秒的负载测试。

在此期间,请观看top进程屏幕。按P按CPU对其进行排序。每按一次'P',它将改变进程CPU消耗的排序顺序,因此请确保您的消费最多。 (按M按内存使用情况排序。请查看the man page以获取更多信息)

在负载测试的时间内寻找任何冒泡的东西。你应该看到跳跃更高的东西 - 但是暂时 (注意,这样的过程可能无法到达列表的顶部 - 它不需要,但仍然可能引入足够的磁盘负载或其他活动来延迟MySQL服务器)

答案 1 :(得分:7)

我在系统上发现了同样的现象。通常需要一毫秒的查询将突然需要1-2秒。我的所有情况都是简单的单表INSERT / UPDATE / REPLACE语句---不在任何SELECT上。没有明显的负载,锁定或螺纹堆积。

我曾怀疑这是因为清除了脏页,刷新磁盘更改或隐藏的互斥锁,但我还没有将其缩小。

也排除了

  1. 服务器负载 - 与高

  2. 无关
  3. 加载引擎 - 使用InnoDB / MyISAM /内存MySQL查询

  4. 缓存 - 无论是开启还是关闭

  5. 记录轮换 - 事件中没有相关性

答案 2 :(得分:6)

您已经使用了查询分析器,这对您有好处。如果您使用的是MySQL 5.6,那么您还可以在PERFORMANCE_SCHEMA中访问许多新的性能测量。与查询分析器相比,它具有测量更多细节的能力,并且还可以全局测量而不是仅测量一个会话。据报道,P_S将取代查询分析器。

要诊断您的问题,我首先要确认或排除TCP / IP问题。例如,测试PHP脚本以查看在通过UNIX套接字连接时是否会出现相同的间歇性延迟。您可以通过连接到localhost来执行此操作,这意味着PHP脚本必须在与数据库相同的服务器上运行。如果绕过TCP / IP时问题消失,这将告诉您根本原因可能是TCP / IP。

如果您处于虚拟环境(如云托管)中,则可以轻松体验性能变化,因为同一云的其他用户会间歇性地耗尽所有带宽。这是云的缺点之一。

如果您怀疑它是TCP / IP问题,您可以独立于PHP或MySQL测试TCP / IP延迟。现成的典型工具包括pingtraceroute。但有many others。你也可以test network speed with netcat。使用可以随时间重复测量的工具,因为听起来你大多数时候都有很好的表现,偶尔会出现故障。

另一种可能性是错误在于PHP。您可以尝试使用XHProf对PHP进行分析,以找出它花费时间的位置。

答案 3 :(得分:4)

尝试隔离问题。像这样运行一个小脚本:

https://drive.google.com/file/d/0B0P3JM22IdYZYXY3Y0h5QUg2WUk/edit?usp=sharing

...看看链中的哪些步骤正在飙升。如果您安装了ssh2,它也会在运行时间最长的测试循环后立即返回ps axu,以查看正在运行的内容。

在我的家庭开发盒上运行localhost,结果如下所示:

Array
(
    [tests summary] => Array
        (
            [host_ping] => Array
                (
                    [total_time] => 0.010216474533081
                    [max_time] => 0.00014901161193848
                    [min_time] => 9.7036361694336E-5
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 9.8943710327148E-5
                    [average] => 0.00010216474533081
                )

            [db_connect] => Array
                (
                    [total_time] => 0.11583232879639
                    [max_time] => 0.0075201988220215
                    [min_time] => 0.0010058879852295
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 0.0010249614715576
                    [average] => 0.0011583232879639
                )

            [db_select_db] => Array
                (
                    [total_time] => 0.011744260787964
                    [max_time] => 0.00031399726867676
                    [min_time] => 0.00010991096496582
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 0.0001530647277832
                    [average] => 0.00011744260787964
                )

            [db_dataless_query] => Array
                (
                    [total_time] => 0.023221254348755
                    [max_time] => 0.00026106834411621
                    [min_time] => 0.00021100044250488
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 0.00021481513977051
                    [average] => 0.00023221254348755
                )

            [db_data_query] => Array
                (
                    [total_time] => 0.075078248977661
                    [max_time] => 0.0010559558868408
                    [min_time] => 0.00023698806762695
                    [tests] => 100
                    [failed] => 0
                    [last_run] => 0.00076413154602051
                    [average] => 0.00075078248977661
                )

        )

    [worst full loop] => 0.039211988449097
    [times at worst loop] => Array
        (
            [host_ping] => 0.00014400482177734
            [db_connect] => 0.0075201988220215
            [db_select_db] => 0.00012803077697754
            [db_dataless_query] => 0.00023698806762695
            [db_data_query] => 0.00023698806762695
        )

    [ps_at_worst] => USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   2884  1368 ?        Ss   Sep19   0:29 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Sep19   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Sep19   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    Sep19   0:06 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    Sep19   0:00 [migration/0]
root         6  0.0  0.0      0     0 ?        S    Sep19   0:25 [watchdog/0]
root         7  0.0  0.0      0     0 ?        S    Sep19   7:42 [events/0]
root         8  0.0  0.0      0     0 ?        S    Sep19   0:00 [cgroup]
root         9  0.0  0.0      0     0 ?        S    Sep19   0:00 [khelper]
root        10  0.0  0.0      0     0 ?        S    Sep19   0:00 [netns]
root        11  0.0  0.0      0     0 ?        S    Sep19   0:00 [async/mgr]
root        12  0.0  0.0      0     0 ?        S    Sep19   0:00 [pm]
root        13  0.0  0.0      0     0 ?        S    Sep19   0:23 [sync_supers]
root        14  0.0  0.0      0     0 ?        S    Sep19   0:24 [bdi-default]
root        15  0.0  0.0      0     0 ?        S    Sep19   0:00 [kintegrityd/0]
root        16  0.0  0.0      0     0 ?        S    Sep19   0:47 [kblockd/0]
root        17  0.0  0.0      0     0 ?        S    Sep19   0:00 [kacpid]
root        18  0.0  0.0      0     0 ?        S    Sep19   0:00 [kacpi_notify]
root        19  0.0  0.0      0     0 ?        S    Sep19   0:00 [kacpi_hotplug]
root        20  0.0  0.0      0     0 ?        S    Sep19   0:00 [ata/0]
root        21  0.0  0.0      0     0 ?        S    Sep19   0:00 [ata_aux]
root        22  0.0  0.0      0     0 ?        S    Sep19   0:00 [ksuspend_usbd]
root        23  0.0  0.0      0     0 ?        S    Sep19   0:00 [khubd]
root        24  0.0  0.0      0     0 ?        S    Sep19   0:00 [kseriod]
root        25  0.0  0.0      0     0 ?        S    Sep19   0:00 [md/0]
root        26  0.0  0.0      0     0 ?        S    Sep19   0:00 [md_misc/0]
root        27  0.0  0.0      0     0 ?        S    Sep19   0:01 [khungtaskd]
root        28  0.0  0.0      0     0 ?        S    Sep19   0:00 [kswapd0]
root        29  0.0  0.0      0     0 ?        SN   Sep19   0:00 [ksmd]
root        30  0.0  0.0      0     0 ?        S    Sep19   0:00 [aio/0]
root        31  0.0  0.0      0     0 ?        S    Sep19   0:00 [crypto/0]
root        36  0.0  0.0      0     0 ?        S    Sep19   0:00 [kthrotld/0]
root        38  0.0  0.0      0     0 ?        S    Sep19   0:00 [kpsmoused]
root        39  0.0  0.0      0     0 ?        S    Sep19   0:00 [usbhid_resumer]
root        70  0.0  0.0      0     0 ?        S    Sep19   0:00 [iscsi_eh]
root        74  0.0  0.0      0     0 ?        S    Sep19   0:00 [cnic_wq]
root        75  0.0  0.0      0     0 ?        S<   Sep19   0:00 [bnx2i_thread/0]
root        87  0.0  0.0      0     0 ?        S    Sep19   0:00 [kstriped]
root       123  0.0  0.0      0     0 ?        S    Sep19   0:00 [ttm_swap]
root       130  0.0  0.0      0     0 ?        S<   Sep19   0:04 [kslowd000]
root       131  0.0  0.0      0     0 ?        S<   Sep19   0:05 [kslowd001]
root       231  0.0  0.0      0     0 ?        S    Sep19   0:00 [scsi_eh_0]
root       232  0.0  0.0      0     0 ?        S    Sep19   0:00 [scsi_eh_1]
root       291  0.0  0.0      0     0 ?        S    Sep19   0:35 [kdmflush]
root       293  0.0  0.0      0     0 ?        S    Sep19   0:00 [kdmflush]
root       313  0.0  0.0      0     0 ?        S    Sep19   2:11 [jbd2/dm-0-8]
root       314  0.0  0.0      0     0 ?        S    Sep19   0:00 [ext4-dio-unwrit]
root       396  0.0  0.0   2924  1124 ?        S<s  Sep19   0:00 /sbin/udevd -d
root       705  0.0  0.0      0     0 ?        S    Sep19   0:00 [kdmflush]
root       743  0.0  0.0      0     0 ?        S    Sep19   0:00 [jbd2/sda1-8]
root       744  0.0  0.0      0     0 ?        S    Sep19   0:00 [ext4-dio-unwrit]
root       745  0.0  0.0      0     0 ?        S    Sep19   0:00 [jbd2/dm-2-8]
root       746  0.0  0.0      0     0 ?        S    Sep19   0:00 [ext4-dio-unwrit]
root       819  0.0  0.0      0     0 ?        S    Sep19   0:18 [kauditd]
root      1028  0.0  0.0   3572   748 ?        Ss   Sep19   0:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0
root      1072  0.0  0.0  13972   828 ?        S<sl Sep19   2:13 auditd
root      1090  0.0  0.0   2052   512 ?        Ss   Sep19   0:00 /sbin/portreserve
root      1097  0.0  0.2  37568  3940 ?        Sl   Sep19   2:01 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
rpc       1120  0.0  0.0   2568   800 ?        Ss   Sep19   0:09 rpcbind
rpcuser   1138  0.0  0.0   2836  1224 ?        Ss   Sep19   0:00 rpc.statd
root      1161  0.0  0.0      0     0 ?        S    Sep19   0:00 [rpciod/0]
root      1165  0.0  0.0   2636   472 ?        Ss   Sep19   0:00 rpc.idmapd
root      1186  0.0  0.0   2940   756 ?        Ss   Sep19  13:27 lldpad -d
root      1195  0.0  0.0      0     0 ?        S    Sep19   0:00 [scsi_tgtd/0]
root      1196  0.0  0.0      0     0 ?        S    Sep19   0:00 [fc_exch_workque]
root      1197  0.0  0.0      0     0 ?        S    Sep19   0:00 [fc_rport_eq]
root      1199  0.0  0.0      0     0 ?        S    Sep19   0:00 [fcoe_work/0]
root      1200  0.0  0.0      0     0 ?        S<   Sep19   0:00 [fcoethread/0]
root      1201  0.0  0.0      0     0 ?        S    Sep19   0:00 [bnx2fc]
root      1202  0.0  0.0      0     0 ?        S<   Sep19   0:00 [bnx2fc_l2_threa]
root      1203  0.0  0.0      0     0 ?        S<   Sep19   0:00 [bnx2fc_thread/0]
root      1206  0.0  0.0   2184   564 ?        Ss   Sep19   1:08 /usr/sbin/fcoemon --syslog
root      1240  0.0  0.0   8556   976 ?        Ss   Sep19   1:22 /usr/sbin/sshd
root      1415  0.0  0.1  12376  2088 ?        Ss   Sep19   6:09 sendmail: accepting connections
smmsp     1424  0.0  0.0  12168  1680 ?        Ss   Sep19   0:02 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
root      1441  0.0  0.0   5932  1260 ?        Ss   Sep19   0:56 crond
root      1456  0.0  0.0   2004   504 tty2     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty2
root      1458  0.0  0.0   2004   504 tty3     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty3
root      1460  0.0  0.0   2004   508 tty4     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty4
root      1462  0.0  0.0   2004   504 tty5     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty5
root      1464  0.0  0.0   2004   508 tty6     Ss+  Sep19   0:00 /sbin/mingetty /dev/tty6
root      1467  0.0  0.0   3316  1740 ?        S<   Sep19   0:00 /sbin/udevd -d
root      1468  0.0  0.0   3316  1740 ?        S<   Sep19   0:00 /sbin/udevd -d
apache    3796  0.0  0.4  32668  9452 ?        S    Dec16   0:08 /usr/sbin/httpd
apache    3800  0.0  0.4  32404  9444 ?        S    Dec16   0:08 /usr/sbin/httpd
apache    3801  0.0  0.4  33184  9556 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    3821  0.0  0.4  32668  9612 ?        S    Dec16   0:08 /usr/sbin/httpd
apache    3840  0.0  0.4  32668  9612 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    3841  0.0  0.4  32404  9464 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4032  0.0  0.4  32668  9632 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4348  0.0  0.4  32668  9460 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4355  0.0  0.4  32664  9464 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4356  0.0  0.5  32660  9728 ?        S    Dec16   0:07 /usr/sbin/httpd
apache    4422  0.0  0.4  32676  9460 ?        S    Dec16   0:06 /usr/sbin/httpd
root      5002  0.0  0.0   2004   504 tty1     Ss+  Nov21   0:00 /sbin/mingetty /dev/tty1
root      7540  0.0  0.0   5112  1380 ?        S    Dec17   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql     7642  0.1  1.0 136712 20140 ?        Sl   Dec17   2:35 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root      8001  0.0  0.4  31028  9600 ?        Ss   Dec13   0:18 /usr/sbin/httpd
root      8092  0.0  0.0      0     0 ?        S    13:47   0:00 [flush-253:2]
root      8511  0.0  0.0      0     0 ?        S    13:48   0:00 [flush-8:0]
root      8551 16.0  0.4  28612  8008 pts/0    S+   13:49   0:00 php test-mysql-connection.php exit
root      8552 44.0  0.1  11836  3252 ?        Ss   13:49   0:00 sshd: root@notty 
root      8560  0.0  0.0   4924  1032 ?        Rs   13:49   0:00 ps axu
root     12520  0.0  0.1  11500  3212 ?        Ss   09:05   0:00 sshd: jonwire [priv]
jonwire  12524  0.0  0.1  11832  1944 ?        S    09:05   0:05 sshd: jonwire@pts/0
jonwire  12525  0.0  0.0   5248  1736 pts/0    Ss   09:05   0:00 -bash
root     16309  0.0  0.0   5432  1436 pts/0    S    12:01   0:00 su -
root     16313  0.0  0.0   5244  1732 pts/0    S    12:01   0:00 -bash
apache   16361  0.0  0.5  32908  9836 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16363  0.0  0.5  32908  9784 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16364  0.0  0.4  32660  9612 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16365  0.0  0.4  32668  9608 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16366  0.0  0.7  35076 13948 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16367  0.0  0.4  32248  9264 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   16859  0.0  0.5  32916  9844 ?        S    Dec15   0:08 /usr/sbin/httpd
apache   20379  0.0  0.4  32248  8904 ?        S    Dec15   0:08 /usr/sbin/httpd
root     28368  0.0  0.0      0     0 ?        S    Nov01   0:21 [flush-253:0]
apache   31973  0.0  0.4  31668  8608 ?        S    Dec16   0:08 /usr/sbin/httpd

)

这里ps axu的结果非常无用,因为我正在连接到localhost。但是,从这些结果我可以看出,DB连接延迟偶尔会出现峰值,“网络”延迟(某些TCP / IP缓冲区?)也是如此。

如果我是你,我会将测试周期数增加到5000或50000。

答案 4 :(得分:0)

我只能猜测,但是由于你消除了服务器负载,我认为你在InnoDb-Stats中检查了红旗(phpmyadmin对那个有很大的帮助,尽管有更专业的工具),剩下的是密钥的不一致用法。可能是您的查询略有不同,并且存在使用次优索引的星座?

请添加FORCE INDEX PRIMARY或类似的重复测试。

答案 5 :(得分:0)

我发现在这方面诊断MySQL问题非常有用的东西是mysqltuner。这是一个PERL脚本,它会查看您的MySQL实例并提出各种调优改进建议。老实说,你很难跟踪你可以做的所有调整,这个脚本很棒,可以让你分清潜在的阻塞点。

其他需要考虑的是Linux本身的工作方式,这也可以解释为什么你会随机滞后。当你在Linux机器上加载top(任何盒子,无论负载如何)时,你会注意到你的内存几乎被完全使用(除非你刚刚重启)。这不是问题或您的盒子超载。 Linux尽可能多地加载到RAM中以节省时间并将不常用的东西交换到交换文件,就像所有现代操作系统(称为虚拟RAM)一样。通常情况下并不是什么大不了但你可能会使用InnoDB作为表类型(当前默认值),它会将内容加载到RAM中以节省时间。可能发生的事情是你的查询被加载到RAM(快速),但是空闲时间足够长以换到交换文件(慢得多)。因此,当Linux将其移回RAM时,您将获得较小的性能损失(交换文件在此处比MySQL将其从磁盘移动更高效)。 MySQL和InnoDB都没有办法告诉它,因为就它们而言,它仍然在RAM中。 this blog详细描述了该问题,相关部分为

  

通常一点点交换使用都可以(我们真的很担心   关于活动交换进出),但在很多情况下,“真实”有用   正在交换内存:主要是InnoDB缓冲池的一部分。什么时候   再次需要它,一个重大的性能打击来换回它   in,导致随机查询中的随机延迟。这可能导致整体   在生产系统上无法预测的性能,通常是一次   交换开始,系统可能会进入性能死亡螺旋。

答案 6 :(得分:0)

我们发现底层硬件的问题导致了这个问题。我们使用VMotion将服务器移动到新硬件,问题就消失了。 VMWare未显示硬件警报或问题。尽管如此,硬件的一个举措解决了这个问题。很奇怪。