【问题标题】:What means (timeout) in "strace" -output? (mysql / php analyse)“strace”输出中的(超时)是什么意思? (mysql/php分析)
【发布时间】:2015-09-25 10:29:35
【问题描述】:

我的 SQL 查询有问题,由于原因(我不明白),根据“strace”a(超时)并且会起床运行 X 次?

poll([{fd=6, events=POLLIN|POLLPRI}], 1, 0) = 0(超时)

执行查询的 PHP 脚本首先在数据库中查找相应的电子邮件地址是否已在数据库中,如果没有,则将其添加,如果没有发生错误,则发送电子邮件。

服务器: Ubuntu 14.04.3 LTS

数据库: mysql Ver 14.14 Distrib 5.5.44,适用于使用 readline 6.3 的 debian-linux-gnu (x86_64)

表: InnoDB

SQL:(示例 | 1 个查询的持续时间:0,031 秒。)

SELECT SQL_NO_CACHE user_email FROM mail_logging
WHERE mail_id_fk IN (142)
AND user_email = 'tester@foo.bar'

SQL:(解释)

id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE mail_logging ref id_mail,mail_id_fk,user_email id_mail 775 const,const 1 使用 where;使用索引

strace: http://pastebin.com/FbYUZ1a3

lsof: http://pastebin.com/RyQcbWmj

编辑:感谢@VolkerK,现在我看到了问题:P

【问题讨论】:

  • a) 电子邮件字段上的唯一索引使用 SELECT-if-nothing-found-INSERT 组合解决了问题,而不会出现可能的竞争条件。只需检查 errno 1022 ER_DUP_KEY b) 您能否将 EXPLAIN SELECT SQL_NO_CACHE user_email FROM mail_logging WHERE mail_id_fk IN (142) AND user_email = 'tester@foo.bar' 的结果添加到您的问题文本中?
  • @VolkerK 所说的是您问题的真正解决方案。如果你能避免在 PHP 中检查完整性,你根本不会遇到超时问题。
  • 根据日志poll(..., ..., int timeout) 已被调用,超时为0,即它应该立即返回报告状态和timeout(如果我没记错的话)在这种情况下只是意思是“没有报告”。所以,目前,我什至没有在这里看到timeout problem ;-)

标签: php mysql linux strace


【解决方案1】:

我认为这表明轮询呼叫已超时结束。从投票手册页:

超时参数指定 poll() 将阻塞的最小毫秒数。 (这个时间间隔会向上取整到系统时钟粒度,内核调度延迟意味着阻塞时间间隔可能会出现少量溢出。) timeout 中指定负值意味着无限超时。指定超时为零会导致 poll() 立即返回,即使没有准备好文件描述符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2015-06-07
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多