[PHP/APC] APCIterator haalt sommige entries niet op

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik heb een probleem met de APCIterator. Hij lijkt bepaalde entries niet op te halen, die via apc_cache_info() wel op te vragen zijn. Dit gebeurt echter pas na verloop van tijd (hoe lang weet ik niet precies, wel binnen een paar uur). Deze entries zijn opgeslagen met een TTL van 0 (alle entries met een TTL > 0 lijken wel te worden getoond).

Ook enkele entries die iedere request via apc_fetch() worden opgevraagd worden niet meer door APCIterator opgehaald. Dus aan idle worden van een entry kan het volgens mij niet liggen. Dan zou deze entry via apc_cache_info() ook niet meer opgehaald kunnen worden.

Het verhogen van de chunk size van APCIterator::__construct haalde ook niets uit. Zelfs ophalen van 1 enkele specifieke key lukt voor bepaalde entries niet.

De cache is niet vol (zo'n 50% in gebruik) en de fragmentatie zit nu op zo'n 10%.

Ik heb geen idee waar verder te zoeken. Ik vermoed dat het een bug in APC zelf kan zijn, maar ik kan geen bug reports vinden die iets vergelijkbaars melden.


Enkele configuratiewaarden die van belang zouden kunnen zijn (mocht je waarde van andere willen weten dan kan ik die ook geven):

apc.ttl = 0
apc.user_ttl = 3600
apc.shm_segments = 1
apc.shm_size = 500

Wat info die nog zou kunnen helpen:

APC Version = 3.1.9
PHP Version = 5.3.0

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 20:35
Ik heb geen ervaring met APC maar als ik even snel door de comments blader zie ik dit staan:
Iterating (and specifically using current()) does not expunge cache entries for which $ttl has passed, you need to use apc_fetch to get rid of stale entries.
Weet je zeker dat het niet door de user_ttl komt en je objecten 'stale' zijn waardoor ze niet meer opgehaald worden met de iterator? Als je de user_ttl op 0 zet zou het niet meer voor mogen komen (maar loopt potentieel je cache vol met stale objecten) zodat je dit kunt testen.

...


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Daar heb ik idd. ook aan gedacht. Echter gaat het ook om entries die iedere request opgehaald worden, dus die niet idle worden (niet voor 3600 seconden iig.). Pas als een entry meer dan het aantal seconden van user_ttl idle is wordt deze verwijderd, althans ik denk dat het zo werkt gezien deze beschrijving:
apc.user_ttl integer

The number of seconds a cache entry is allowed to idle in a slot in case this cache entry slot is needed by another entry. Leaving this at zero means that APC's cache could potentially fill up with stale entries while newer entries won't be cached. In the event of a cache running out of available memory, the cache will be completely expunged if ttl is equal to 0. Otherwise, if the ttl is greater than 0, APC will attempt to remove expired entries.
Verder geeft apc_cache_info() aan dat deze entries niet verwijderd zijn.

Noushka's Magnificent Dream | Unity