我正在使用 VestCP,它为我安装了 Apache2.2、PHP 5.5.25、MySQL Percona 和 Nginx。
我有一个用 ZF1 构建的应用程序,它在我的所有开发计算机上都能正常工作,但在这台服务器上,该应用程序有几个页面的加载时间约为 1 分钟。我获取了查询并在 PhpMyAdmin 中运行它们,查询在 0.7 秒内完成,因此查询没有问题。从数据库检索此数据后,除了将其转换为 JSON 外,无需进行其他 php 处理。
运行 mysqladmin processlist 显示查询处于 Sleep 命令约 1 分钟。其他页面运行正常。
我尝试跟踪 http 进程,但是什么也没有弹出。
我需要帮助来调试这个问题,因为我已经连续挣扎了三天,而且我没有主意了。
谢谢!
编辑:mysql 上的 Strace:
[root@gameiki mysql]# ps ax|grep mysql
6310 pts/0 S 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql/ --pid-file=/var/run/mysqld/mysqld.pid
6807 pts/0 Sl 0:08 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql/ --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --open-files-limit=65535 --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
10612 pts/0 S+ 0:00 grep mysql
[root@gameiki mysql]# strace -p 6807
Process 6807 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...>) = 1
fcntl(10, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(10, F_SETFL, O_RDWR|O_NONBLOCK) = 0
accept(10, {sa_family=AF_INET, sin_port=htons(33878), sin_addr=inet_addr("127.0.0.1")}, [16]) = 31
fcntl(10, F_SETFL, O_RDWR) = 0
getsockname(31, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
gettimeofday({1432578937, 481232}, NULL) = 0
fcntl(31, F_SETFL, O_RDONLY) = 0
fcntl(31, F_GETFL) = 0x2 (flags O_RDWR)
setsockopt(31, SOL_SOCKET, SO_RCVTIMEO, "\36\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
setsockopt(31, SOL_SOCKET, SO_SNDTIMEO, "<\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
setsockopt(31, SOL_IP, IP_TOS, [8], 4) = 0
setsockopt(31, SOL_TCP, TCP_NODELAY, [1], 4) = 0
futex(0x103f2c4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x103f2c0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
poll([{fd=10, events=POLLIN}, {fd=12, events=POLLIN}], 2, -1
EDIT2:我相信我找到了罪魁祸首,这个 strace 在 httpd 服务器挂起之前就在它上面:
10779 0.000048 socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 20
10779 0.000047 connect(20, {sa_family=AF_INET6, sin6_port=htons(0), inet_pton(AF_INET6, "2607:f8b0:4002:c06::5b", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
10779 0.000114 getsockname(20, {sa_family=AF_INET6, sin6_port=htons(36601), inet_pton(AF_INET6, "2604:4300:a:6e:0:45ff:fec5:bfdb", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
10779 0.000056 close(20) = 0
10779 0.000063 gettimeofday({1432580645, 65863}, NULL) = 0
10779 0.000060 socket(PF_INET6, SOCK_STREAM, IPPROTO_IP) = 20
10779 0.000060 fcntl(20, F_GETFL) = 0x2 (flags O_RDWR)
10779 0.000046 fcntl(20, F_SETFL, O_RDWR|O_NONBLOCK) = 0
10779 0.000045 connect(20, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "2607:f8b0:4002:c06::5b", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINPROGRESS (Operation now in progress)
10779 0.000148 poll([{fd=20, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 60000) = 0 (Timeout)
我感觉已经很接近了,但是 strace 的作用不大,可能是 ipv6 的问题吗?如果是这样,我该如何强制 php/httpd 不使用它?
答案1
该问题是由 IPV6 引起的,我通过添加禁用了 ipv6
#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
到 /etc/sysctl.conf 并且不再有延迟。