Hi Dmitry,

> -----Original Message-----
> From: Dmitry Stogov [mailto:dmi...@zend.com]
> Sent: Friday, February 17, 2017 1:46 PM
> To: Anatol Belski <anatol....@belski.net>; 'Nikita Popov' <ni...@php.net>;
> 'Xinchen Hui' <larue...@php.net>; 'Joe Watkins' <krak...@php.net>
> Cc: 'PHP internals list' <internals@lists.php.net>
> Subject: [PHP-DEV] Re: Thread safe interned strings
> 
> Hi Anatol,
> 
> 
> Great progress!
> 
> I didn't look into the code careful yet, but the explanation looks
reasonable.
> 
> For now, I see one missing part - opcache can't work completely out of the
box,
> because its interned string related functions are wrapped with #ifndef ZTS
> 
Oh, indeed. Getting to this part now then :)

Thanks

Anatol

> 
> Thanks. Dmitry.
> 
> ________________________________
> From: Anatol Belski <anatol....@belski.net>
> Sent: Friday, February 17, 2017 3:17:05 PM
> To: Dmitry Stogov; 'Nikita Popov'; 'Xinchen Hui'; 'Joe Watkins'
> Cc: 'PHP internals list'
> Subject: Thread safe interned strings
> 
> Hi,
> 
> I was working on a patch to support interned strings in thread safe builds
of PHP.
> ATM there seems to be a good progress on this. The proposed patch unifies
> TS/NTS builds in regard to the interned strings handling and fixes issues
in TS
> builds.
> 
> https://github.com/php/php-src/pull/2390
> 
> The basic idea is like this
> 
> - CG(interned_strings) is removed
> - there are two tables
> - one table is persistent only, can be filled only at startup and is
maintained per
> process
> - second table is allocated per thread in TS builds and per process in NTS
builds
> - second table is filled/emptied at every request, separate for every
> process/thread
> - in the startup phase, any interned string is saved into the first table
> - once a snapshot was made, that table stays unchanged until the process
exit
> - after startup, any call to zend_new_interned_string saves into the
second table,
> which is cleaned up per request
> 
> There was also another idea we discussed with Dmitry, to have only one
> interned strings table, initially filled with permanent strings, which
would be
> copied into every new thread. In my early implementation I had to abandon
it,
> as a multiple tables idea seems to have more perspective. Especially in TS
builds
> it means the long living strings reside in memory only once. The second
table
> overhead is neglecting, the API can also be extended to override the
storages,
> thus giving the full control over where and how things are stored.
> 
> Additionally, I've defined three stages, where the interned string tables
init/dtor
> happens. Those are
> 
> - SAPI
> - TSRM
> - Zend
> 
> The functions for init/dtor will record the stage, and will call the dtor
accordingly.
> For the TS Apache variant it is required, because the main thread holds
all the
> globals and the final interned strings destruction needs to happen after
the main
> thread globals destruction. In general, it also useful in any build kind,
as the
> permanent storage can be then used even before the engine is actually
> initialized. To do so, the SAPI can define init/dtor calls at the
outermost places.
> The TSRM stage will be ATM missing in NTS builds, and if nothing else is
defined,
> the old way of init/dtor in Zend is taken. The init function can be called
at any
> stage, but the subsequent calls will be ignored and the dtor will be
called only
> when the matching stage argument is passed.
> 
> From what I can tell so far, at least the bugs here are fixed
> https://bugs.php.net/bug.php?id=74015
> https://bugs.php.net/bug.php?id=72451
> 
> These are likely to have been fixed, too, but some harder to test
> https://bugs.php.net/bug.php?id=71115
> https://bugs.php.net/bug.php?id=74011
> 
> On my side, I tested quite hard with several small snippets from the bug
reports
> and with WP and Symfony and could observe a huge stability increase.
> Unfortunately it is not really sensible to tell a performance diff, as
same snippets
> were crashing quite quickly without the patch. The test setup I have is
Apache
> worker/winnt penetrated by 8/16 simultaneous clients on a machine with 4
> (Linux) or 8 (Windows) real processor cores.
> 
> Regarding Opcache, this solution seems to work out of the box. As many the
> strings are overridden, there seems to be no impact. Though this should be
> double checked.
> 
> I have to mention, that there might be also other issues regarding TS, fe
with
> resources. I for now was only concentrated on the interned strings, as
this is the
> most urgent part we still miss. Some general refactoring to the TS layer
could be
> targeted later. Possible improvements to strings could be
> 
> - intern more strings on startup -  the constants, the ini directive
names, etc.
> - introduce static interned strings, those that are already hardcoded into
the
> text/data segment
> - introduce fixed size interned zend_string for short strings
> - introduce a special zend_string to hold path, thus saving strlen at many
places,
> maybe also fixed size
> 
> Thanks
> 
> Anatol
> 
> 



-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to