CentOS 7.4.1708 上的 PHP 7.1.13
即使使用空脚本或只是为了获取版本信息,仅调用 php 也会出现莫名其妙的延迟(2 到 10 秒)。我以前从未在任何系统上见过这种情况,而且我不知道如何调试或修复它。
延迟范围为 2 到 10 秒。与其他系统一样,它应该只需要几毫秒。没有其他程序遇到这种延迟。
系统负载可以忽略不计:
08:32:00 up 8 days, 2:23, 1 user, load average: 0.26, 0.29, 0.35
有人可以就此提供建议吗?
基准:
$ time php -v
PHP 7.1.13 (cli) (built: Jan 4 2018 15:22:08) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.1.13, Copyright (c) 1999-2017, by Zend Technologies
real 0m1.916s
user 0m0.015s
sys 0m0.012s
$ time php -r ''
real 0m9.841s
user 0m0.015s
sys 0m0.009s
我不是这台机器的管理员,尽管我正在与他一起解决这个问题。
我不能说这个特定的软件包是如何安装的。
[编辑]
建议运行 strace,我注意到 POLL 处有暂停。 PHP poll 是做什么的?
轮询([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}])
我试图从 sys adm 中找出 10.226.139.110 上的内容(或应该是什么)。它的 ping 效果很好,没有特别的延迟。
socket(AF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.226.139.110")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}])
sendmmsg(3, {{{msg_name(0)=NULL, msg_iov(1)=[{"!\24\1\0\0\1\0\0\0\0\0\0\xxx\yyy"..., 50}], msg_controllen=0, msg_flags=MSG_DONTWAIT|MSG_EOR|MSG_CONFIRM|MSG_RST|MSG_ERRQUEUE|MSG_MORE|MSG_FASTOPEN|0x6620010}, 50}, {{msg_name(0)=NULL, msg_iov(1)=[{"!\367\1\0\0\1\0\0\0\0\0\0\xxx\yyy"..., 50}], msg_controllen=0, msg_flags=MSG_CONFIRM}, 50}}, 2, MSG_NOSIGNAL) = 2
poll([{fd=3, events=POLLIN}], 1, 5000) = 0 (Timeout)
socket(AF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.226.143.110")}, 16) = 0
poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}])
sendmmsg(4, {{{msg_name(0)=NULL, msg_iov(1)=[{"!\24\1\0\0\1\0\0\0\0\0\0\xxx\yyy"..., 50}], msg_controllen=0, msg_flags=MSG_DONTWAIT|MSG_EOR|MSG_CONFIRM|MSG_RST|MSG_ERRQUEUE|MSG_MORE|MSG_FASTOPEN|0x6620010}, 50}, {{msg_name(0)=NULL, msg_iov(1)=[{"!\367\1\0\0\1\0\0\0\0\0\0\xxx\yyy"..., 50}], msg_controllen=0, msg_flags=MSG_CONFIRM}, 50}}, 2, MSG_NOSIGNAL) = 2
poll([{fd=4, events=POLLIN}], 1, 5000) = 1 ([{fd=4, revents=POLLIN}])
ioctl(4, FIONREAD, [148]) = 0
recvfrom(4, "!\24\201\200\0\1\0\0\0\1\0\0\vcoloscrmweb\16indepen"..., 2048, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.226.143.110")}, [16]) = 148
poll([{fd=4, events=POLLIN}], 1, 2769) = 1 ([{fd=4, revents=POLLIN}])
ioctl(4, FIONREAD, [148]) = 0
recvfrom(4, "!\367\201\200\0\1\0\0\0\1\0\0\xxx\yyy"..., 65536, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.226.143.110")}, [16]) = 148
close(3) = 0
close(4) = 0
socket(AF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.226.139.110")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}])
--
php-m
[PHP Modules]
apcu
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
igbinary
imap
json
libxml
mbstring
mcrypt
memcached
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
sqlsrv
standard
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xml
xmlreader
xmlwriter
xsl
Zend OPcache
zip
zlib
[Zend Modules]
Zend OPcache
答案1
问题是 /etc/hostname 的值未在 /etc/hosts 中映射到本地 IP 地址。以及 IMAP 模块(imap.so)尝试在初始化时解析主机名(出于我无法理解的原因),查询 DNS。该特定主机的主机名未在公司的 DNS 中注册。
解决办法:编辑/etc/hosts
127.0.0.1 [whatever the /etc/hostname is]
(或其他一些本地IP地址)
感谢您的帮助@ramansailopal
https://serverfault.com/questions/586141/php-cli-with-imap-5-second-startup-delay