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函数,这个函数就是用于每个步骤以后去检查是否有需要回调的信号,如果有的话就触发预先设置的函数。所以考虑在此处忽略掉这些关于信号的设置。
注释代码后问题解决。
标签: linux php pcntl rt_sigprocmask



