Hi, Turning off the cache isn't really an option for us due to our (relatively) large number of routes and the number of calls to them. Our config_routing.yml.php contains 615 routes. For 56 links, we'd be back to 1.3 secs just for the routing to work out the links.
re: lookup_cache_dedicated_keys in #5811 - this is an option, however I think it suffers from the same problem i.e. a cache per instance of url. Please correct me if i'm wrong. With APC cache i think we will start getting short of ram pretty quick. On Sep 16, 1:47 pm, Fabian Lange <fabian.la...@symfony-project.com> wrote: > Hi, > not an complete answer, but try "cache: null" instead of the sfNoCache, > because null will prevent any serialisation calls like here: > > if (!is_null($this->cache)) > { > $this->cache->set('symfony.routing.configuration', > serialize($this->routes)); > } > > sfNoCache will not prevent these lines to run. cache==null will > > Fabian > > On Wed, Sep 16, 2009 at 2:10 PM, Jarno Rantanen > <jarno.ranta...@mederra.fi>wrote: > > > Hi, > > > We recently ran to a similar issue after upgrading from 1.2.4 to 1.2.8 on a > > site with busy forums and hence quite a lot of different URLs; the size of > > the routing data cache became huge (the file was around 30 MB). Needless to > > say, unserialize()ing a string of 30 MB or so is a bit inefficient. > > Combined with some obscure bug in PHP (5.2.8) which allowed this operation > > to bypass the memory_limit-directive, our server quickly ate up its 16 GB or > > RAM and started swapping. Down we went. > > > It was particularly troublesome to identify what caused the huge memory > > consumption, since because of the bug we didn't get any "memory exhausted" > > PHP fatal errors in our logs. When we finally did, the situation was > > immediately resolved by turning off the routing data cache (substituting > > sfFileCache with sfNoCache in factories.yml). The performance penalty of > > not having this cache on seems negligible. > > > I found some related discussion in: > > >http://www.symfony-project.org/blog/2009/04/03/lazy-routing-deseriali... > >http://trac.symfony-project.org/ticket/6308and > >http://trac.symfony-project.org/ticket/5811 > > > Especially depressing was the comment in #5811 "cause sites encountering > > the issue have people that know how to fix it". :) I realize producing a > > one-size-fits-all solution for this is nontrivial, but this really took us > > by surprise and caused quite a headache. Since, according to the benchmarks > > by "rs" in #5811, the single-key caching strategy doesn't really serve any > > number of URLs well, should the default strategy be somehow changed in a > > future release? > > > My 0.02 €, > > > - Jarno > > > On Wed, 2009-09-16 at 03:24 -0700, arri...@gmail.com wrote: > > > Hi. > > > Noticed the routing has had performance changes in 1.3 which is great. > > The cache is now recommended to be off but we have a severe impact on > > our system if we do that. > > > Would like to open a discussion re: possible improvement if this is > > ok. > > > We have lots of routes - our app is built around admin generator and > > therefore sfPropelRouteCollection. The routing performance changes in > > 1.3 appear to be when loading routes, but the performance penalty for > > our app is when matching a route i.e. url_for(). > > > e.g. below is output from xhprof > > > Current Function > > sfPatternRouting::getRouteThatMatchesParameters 56 0.1% 1,360,102 > > 82.9% > > Exclusive Metrics for Current Function 173,620 12.8% > > > Parent function > > sfPatternRouting::generate 56 100.0% 1,360,102 100.0% > > > Child functions > > sfObjectRoute::matchesParameters 22,455 48.5% 1,115,255 82.0% > > sfRoute::setDefaultParameters 23,148 50.0% 50,048 3.7% > > sfRoute::matchesParameters 693 1.5% 21,179 1.6% > > > Bit difficult to read sorry, but basically > > sfPatternRouting::getRouteThatMatchesParameters() is called 56 times > > (for the 56 links we have) but it takes 1.3 seconds to execute this > > code. This is on athlon x2 4600+. > > > The problem seems to be that sfObjectRoute::matchesParameters() is > > called 22,455 times taking 1.1 seconds of the total time. > > > OK, so if we enable the file cache we get good speeds again, however > > the problem is the amount of data in this cache. Because we have so > > many routes and are using admin gen, we hit this problem: > > > route is > > supplier: > > class: sfPropelRouteCollection > > options: > > model: Supplier > > module: supplier > > prefix_path: supplier > > with_wildcard_routes: true > > > if we have 1000 suppliers, we get an entry in the routing cache for > > each of these urls. Also, in the layout of the pages we have menu > > links. e.g. menu/admin, menu/stock. (there's approx 100 of these) > > > The problem is, because the url is supplier/1/edit, supplier/2/edit, > > supplier/3/edit the context when generating the cache key is different > > because the uri changes. This means for every supplier, we also have > > all the menu links stored in the cache for that instance of supplier. > > So in the cache we have 1,000*100 = 100,000 entries in the cache - and > > that is for one module (we currently have 64 admin generated modules + > > 30 odd non-admin gen). e.g. our routing cache contains this: > > > ["parse_/supplier/1/edit_2ed71130b65896bc589714492c3cc85c"]=> > > array(3) { > > ... > > > ["parse_/supplier/2/edit_8179119534b860346bafa3dedb2bad53"]=> > > array(3) { > > ... > > ["parse_/supplier/3/edit_118c94f897cfc7ae68a124e8dd692f4a"]=> > > array(3) { > > > and > > > ["generate_logout_e4ed1a882c44f3cf31e7ed18e8686b65_516891fa3258fae54e8eaed2b2727dcb"] > > => > > string(7) "/logout" > > ... > > ["generate_logout_e4ed1a882c44f3cf31e7ed18e8686b65_54e6d2c24d12203af92e3f785f1a567d"] > > => > > string(7) "/logout" > > ... > > ["generate_logout_e4ed1a882c44f3cf31e7ed18e8686b65_2ed71130b65896bc589714492c3cc85c"] > > => > > string(7) "/logout" > > > i.e. a application "logout" link for each of the 3 supplier pages I > > have just visited - the last md5 is different for each one (different > > context) > > > Other concern is the size of the data will get so large that the > > overhead of read/unserialize()/serialize()/write() will cause a large > > performance penalty. > > > Specifying each route by name is an option, though not one I wish to > > go down if possible - plus I don't think it will correct the 'size of > > data' issue. > > > Possible solution (though I do not understand the routing enough) but > > is it possible to not generate the cache key on the parameter values, > > but just on the parameter keys? so, md5(serialize(array_keys > > ($params))) instead. Or can the value of a param determine a different > > route? Similarly, is it possible for the context to not include the > > uri, or use the internal uri instead of real one e.g. supplier/:id/ > > edit - that way the context would be the same regardless of id. > > > Hope this makes sense. I'm sure it's not an easy one to resolve... > > > Thanks, > > Andy. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "symfony developers" group. To post to this group, send email to symfony-devs@googlegroups.com To unsubscribe from this group, send email to symfony-devs+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/symfony-devs?hl=en -~----------~----~----~----~------~----~------~--~---