php 7.2.1 + redis 3.1.6 超时问题
2018-05-23
在升级php 7.2.1之后发现某集群的超时时间骤增,从平均80ms变成了120ms。
同时在报错日志中发现了较多的如下错误:
本来设置的超时都没生效,可能导致性能下降。
然后strace看一下进程执行记录:
发现poll的时候的timeout都是60000,而php 7.0.13 + redis 3.0.0的机器的timeout都是pconnect对应的时间,由此可以看出pconnect传的参数在这个版本搭配下并未生效。
看一下源码:
pconnect->redis_sock_create->redis_sock_server_open->redis_sock_connect。
tv.tv_sec = (time_t)redis_sock->timeout;
tv.tv_usec = (int)((redis_sock->timeout - tv.tv_sec) * 1000000);
if(tv.tv_sec != 0 || tv.tv_usec != 0) {
tv_ptr = &tv;
}
redis_sock->stream = php_stream_xport_create(host, host_len,
0, STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT,
persistent_id, tv_ptr, NULL, NULL, &err);
在php源码里看一下php_stream_xport_create
PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, int options,
int flags, const char *persistent_id,
struct timeval *timeout,
php_stream_context *context,
zend_string **error_string,
int *error_code
STREAMS_DC)
{
struct timeval default_timeout = { 0, 0 };
default_timeout.tv_sec = FG(default_socket_timeout);
if (timeout == NULL) {
timeout = &default_timeout;
}
发现在timeout是NULL的情况下会把timeout设置成默认的timeout,而默认的timeout在php.ini中时60s,问题可能暂时定位,需要debug查一下为什么出现这个问题。