PHP 5.3下rt_sigprocmask频繁调用解决

作者:墨鱼 发布于:2011-4-24 20:42 Sunday 分类:PHP

在PHP 5.3下,设置了declare和pcntl_signal后,出现了大量的rt_sigprocmask调用,造成性能骤降。

 

strace记录:

rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0

rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

 

查了一下,rt_sigprocmask调用是用于设置接收的信号列表,相对应的函数是sigprocmask,于是使用GDB打断点:

 

(gdb) bt

#0  0xb7ca8340 in sigprocmask () from /lib/libc.so.6

#1  0x08172d58 in pcntl_signal_dispatch () at /data/software/php-5.3.6/ext/pcntl/pcntl.c:1273

#2  0x082aff48 in php_tick_iterator (data=0x86e3870, arg=0xbfffd0e0) at /data/software/php-5.3.6/main/php_ticks.c:69

#3  0x082e85e4 in zend_llist_apply_with_argument (l=0x8672ca4, func=0x82aff30 <php_tick_iterator>, arg=0xbfffd0e0)

    at /data/software/php-5.3.6/Zend/zend_llist.c:236

#4  0x082aff21 in php_run_ticks (count=1) at /data/software/php-5.3.6/main/php_ticks.c:76

#5  0x08311c0b in ZEND_TICKS_SPEC_CONST_HANDLER (execute_data=0xbfffcfb4)

    at /data/software/php-5.3.6/Zend/zend_vm_execute.h:2365

#6  0x0831407e in execute (op_array=0x876d638) at /data/software/php-5.3.6/Zend/zend_vm_execute.h:107

#7  0x082f0616 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /data/software/php-5.3.6/Zend/zend.c:1194

#8  0x0829fb76 in php_execute_script (primary_file=0xbffff4f0) at /data/software/php-5.3.6/main/main.c:2268

#9  0x08371c47 in main (argc=2, argv=0xbffff654) at /data/software/php-5.3.6/sapi/cli/php_cli.c:1193

(gdb) 

 

用GDB的结果中可以看到,这个调用产生于declare设置了tick=1时,每个操作的OPCODE后回调了pcntl_signal_dispatch。

 

很快就有了两个解决的想法:

1、是否可以让他不调pcntl_signal_dispatch?不调有没有功能上的问题?

2、能否简化pcntl_signal_dispatch?

 

通过grep发现,回调的设置点是在pcntl扩展的模块初始化时期,与使用register_tick_function大致相同。尝试过去除这个设置点,发现信号无法被程序所接收并处理,所以第一种方法不成立。

于是看了下pcntl_signal_dispatch函数,这个函数就是用于每个步骤以后去检查是否有需要回调的信号,如果有的话就触发预先设置的函数。所以考虑在此处忽略掉这些关于信号的设置。

PHP 5.3中pcntl_signal_dispatch函数注释点

注释代码后问题解决。

标签: linux php pcntl rt_sigprocmask

评论(0) 引用(0) 浏览(126)

Powered by emlog 粤ICP备11086334号 sitemap