Home  |  Linux  | Mysql  | PHP  | XML
From:Dmitry Stogov Date:Tue Aug 19 01:22:46 2008
Subject:Re: ZTS as fast as non-ZTS
Hi Arnaud,

Arnaud Le Blanc wrote:
> Hi,
> 
> On Monday 18 August 2008 19:46:46 Dmitry Stogov wrote:
>> Hi Arnaud,
>>
>> The patch looks very interesting.
>> I think it may be committed to the HEAD in the nearest future.
>> I don't have time to look into all details in the moment.
>>
>> Could you explain why --with-tsrm-full-__thread-tls doesn't work with 
>> dlopen() however --with-tsrm-__thread-tls does?
> 
> That's due to the way TLS works internally. Actually I need further reading on 
> that.

I don't see a big difference between --with-tsrm-full-__thread-tls and 
--with-tsrm-__thread-tls from TLS point of view (may be I miss it), so I 
don't understand why one works and the other doesn't.

The patch looks more difficult for me than it should. I would prefer to 
have only --with-tsrm-full-__thread-tls, if it works, as the patch would 
be simple and PHP faster.

Another simple solution, which you probably already tested, is to use 
only global __thread-ed tsrm_ls (and don't pass/fetch it), however, 
access thread-globals in the same way: 
((*type)tsrm_ls[global_module_id])->global_fileld

Anyway you did a great job. I would like to see this idea implemented in 
HEAD. It is little bit late for 5.3 :(

Thanks. Dmitry.

>> Did you test the patch with DSO extensions?
> 
> I will, but I guess that will be behaves like another shared library 
> dlopen()ed by Apache.
> 
>> It would be interesting to try the same idea on Windows with VC.
> 
> I will try too.
> 
>> Thanks. Dmitry.
>>
>> Arnaud Le Blanc wrote:
>>> Hi,
>>>
>>> Currently the way globals work forces to pass a thread-local-storage 
> pointer 
>>> across function calls, which involves some overhead. Also, not all 
> functions 
>>> get the pointer as argument and need to use TSRMLS_FETCH(), which is slow. 
> For 
>>> instance emalloc() involves a TSRMLS_FETCH(). An other overhead is 
> accessing 
>>> globals, using multiple pointers in different locations.
>>>
>>> The following patch caches each global address in a native TLS variable so 
>>> that accessing a global is as simple as global_name->member. This removes 
> the 
>>> requirement of passing the tls pointer across function calls, so that the 
> two 
>>> major overheads of ZTS builds are avoided.
>>>
>>> Globals can optionally be declared statically, which speeds up things a 
> bit.
>>> Results in bench.php:
>>> non-ZTS:						3.7s
>>> ZTS unpatched:					5.2s
>>> ZTS patched:					4.0s
>>> ZTS patched and static globals:	3.8s
>>>
>>> The patch introduces two new macros: TSRMG_D() (declare) and TSRMG_DH() 
>>> (declare, for headers) to declare globals, instead of the current 
> "ts_rsrc_id 
>>> foo_global_id". These macros declare the global id, plus the __thread 
> pointer 
>>> to the global storage.
>>>
>>> ts_allocate_id now takes one more callback function as argument to bind 
> the 
>>> global pointer to its storage. This callback is declared in TSRMG_D[H]().
>>>
>>> As all TSRMLS_* macros now does nothing, it is needed to call 
> ts_resource(0) 
>>> explicitly at least one time in each thread to initialize its storage. A 
> new 
>>> TSRMLS_INIT() macro as been added for this purpose.
>>>
>>> All this is disabled by default. --with-tsrm-__thread-tls enables the 
> features 
>>> of the patch, and --with-tsrm-full-__thread-tls enables static declaration 
> of 
>>> globals.
>>>
>>> It as been tested on Linux compiled with --disable-all in CLI and a bit in 
>>> Apache2 with the worker MPM. Known issues: 
>>> - Declaring globals statically (--with-tsrm-full-__thread-tls) causes 
> troubles 
>>> to dlopen(), actually Apache wont load the module at runtime (it works 
> with 
>>> just --with-tsrm-__thread-tls).
>>> - The patch assumes that all resources are ts_allocate_id()'ed before any 
>>> other thread calls ts_allocate_id or ts_resource_ex(), which is possibly 
> not 
>>> the case.
>>>
>>> The patch needs some tweaks and does not pretend to be included in any 
> branch, 
>>> but I would like to have some comments on it.
>>>
>>> The patch: http://arnaud.lb.s3.amazonaws.com/__thread-tls.patch
>>>
>>> Regards,
>>>
>>> Arnaud
>>>
>>>
> 
> Regards,
> 
> Arnaud
Navigate in group php.internals at sever news.php.net
Previous Next




  
© No Copyright
You are free to use Anything
Site Maintained by PHP Developer
Powered By PHP Consultants