我有一个如下所示的查询:
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。
我知道的事情,或者知道没有引起问题:
有没有人知道还有什么要检查?在我看来,这似乎是一个网络问题,但我需要能够看到它并找到问题来解决它,而且我已经没有地方可以检查下一步了。有什么想法吗?
答案 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上。没有明显的负载,锁定或螺纹堆积。
我曾怀疑这是因为清除了脏页,刷新磁盘更改或隐藏的互斥锁,但我还没有将其缩小。
也排除了
服务器负载 - 与高
加载引擎 - 使用InnoDB / MyISAM /内存MySQL查询
缓存 - 无论是开启还是关闭
记录轮换 - 事件中没有相关性
答案 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延迟。现成的典型工具包括ping
或traceroute
。但有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未显示硬件警报或问题。尽管如此,硬件的一个举措解决了这个问题。很奇怪。