现象
php 进程: THREAD_PHP_RD_\Service\Process\Deploy 不干活了,进程堆栈如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# pstack 157380 #0 0x00007f4396a440d8 in poll () from /lib64/libc.so.6 #1 0x0000000000745639 in php_sockop_read () #2 0x00007f438c90c601 in php_openssl_sockop_io () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/openssl.so #3 0x000000000073aed4 in _php_stream_fill_read_buffer () #4 0x000000000073b073 in _php_stream_get_line () #5 0x00007f438c4d938f in redis_sock_read () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/redis.so #6 0x00007f438c4db9dc in ps_write_redis () from /data1/php/lib/php/extensions/no-debug-non-zts-20121212/redis.so #7 0x0000000000613090 in php_session_save_current_state () #8 0x00000000006143d6 in zm_deactivate_session () #9 0x0000000000787914 in zend_deactivate_modules () #10 0x0000000000722f45 in php_request_shutdown () #11 0x000000000083200f in do_cli () #12 0x0000000000833478 in main () |
4个cli进程都阻塞在了这里;
大概意思为,PHP要回写session,先要一些其它交互,期望能读一行,但是,怎么也读不够一行,于是就死等
问题1:
如果没有什么意外的话,不应该让死等
问题2:
debug发现,这个stream的数据结构中,设置的超时时间为86400秒:
难怪一直阻塞住不干活。
解决办法:
添加超时时间的配置:
1 |
session.save_path = "tcp://127.0.0.1:6379?weight=1&timeout=3 |
问题:
你问我gdb的时候是如何知道stream中如何获取超时时间的?如何知道stream->abstract 的真实数据类型的?
翻代码看到的:
注: 还以为此事为偶发,进程刚刚工作几个小时就全部进入到了这个场景了,还好我解决了; 其实,这并没有找到问题的根源,不找到原因的话,后续会有更加莫名其妙的的事情发生的
Redis 版本号
(然而现在该扩展已经开发到了4.x.y 了