Re: Questions about OPcache interned strings buffer
| From: | Christoph M. Becker | Date: | Thu, 02 Dec 2021 13:49:15 +0000 |
| Subject: | Re: Questions about OPcache interned strings buffer | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-327849@lists.php.net to get a copy of this message | ||
On 28.11.2021 at 03:44, Micha wrote:
> I have two questions regarding the OPcache interned strings bugger, I
> hope this mailing list is the right place to ask them, else feel free to
> redirect me to a more fitting place.
>
> 1. What is the logic behind the assigned strings buffer size and the
> actually usable size? When using powers of 2, it seems to be exactly 75%
> of it being usable, but for values between powers of 2, the usable
> buffer size seems to increase by exactly what was added to the setting,
> so that the used percentage increases until the next power of 2 is
> reached. So basically it is possible that an increase of the settings
> value leads to a decrease of the actually usable strings buffer. I'm
> just wondering about what the remaining <=25% are used for, whether
> using a power of 2 is preferable, or the opposite to have a batter
> ratio. To avoid confusion it may be reasonable to add the <=25% always
> to the usage statistics output, so that setting and statistics match.
> Also Asked on stackoverflow:
>
> https://stackoverflow.com/questions/67853338/opcache-interned-strings-buffer-size-lower-than-opcache-interned-strings-buffer•Å]û
> :TŒô¸c]¼—d
First, interned_string_buffer is indeed supposed to be a power of
two[1]. Then it is important to understand that the HashTable which
stores references to the actual strings, is placed at the beginning of
the interned string buffer, so the reported buffer_size is the size of
the actual string buffer, i.e. always smaller than was has been set as
interned_string_buffer.
That should be documented in the PHP manual.
> 2. I have a PHP8.1 instance where I can increase the interned strings
> buffer size as much as I want, it is always nearly fully used based on
> the statistics. Currently it's 256 MiB assigned, 100% used with 512 MiB
> overall OPcache size ~90% used. This doesn't look reasonable, as the
> interned strings buffer is also meant to reduce the actual OPcache usage
> (? bundling strings),
No. The interned string buffer is not meant to reduce the general
OPcache SHM size, but rather to avoid re-allocating strings for each
request (which would slow down the processing).
> so it looks wrong that it is used with more MiB
> than the remaining OPcache. Or is it somehow expected that every smaller
> and larger fraction is a string is stored in the interned strings buffer
> as long as it is available, so that it basically always fills up? If so,
> how can one estimate a good size for ones individual instance?
Hard to say. You need to try, and settle on some acceptable value.
Note that a full interned string buffer won't stop scripts from
executing; they may just run a bit slower.
[1]
<https://github.com/php/php-src/blob/php-7.4.26/ext/opcache/ZendAccelerator.c#L2599>
--
Christoph M. Becker