New Firefox HTTP cache now enabled on Nightly builds

Yes, it’s on!  After a little bit more than a year of a development by me and Michal Novotný all bugs we could find in our labs, offices and homes were fixed.  The new cache back-end is now enabled on Firefox Nightly builds as of version 32 and should stay like that.

The old cache data are for now left on disk but we have handles to remove them automatically from users’ machines to not waste space since it’s now just a dead data.  This will happen after we confirm the new cache sticks on Nightlies.

The new HTTP cache back end has many improvements like request prioritization optimized for first-paint time, ahead of read data preloading to speed up large content load, delayed writes to not block first paint time, pool of most recently used response headers to allow 0ms decisions on reuse or re-validation of a cached payload, 0ms miss-time look-up via an index, smarter eviction policies using frecency algorithm, resilience to crashes and zero main thread hangs or jank.  Also it eats less memory, but this may be subject to change based on my manual measurements with my favorite microSD card which shows that keeping at least data of html, css and js files critical for rendering in memory may be wise.  More research to come.

Thanks to everyone helping with this effort.  Namely Joel Maher and Avi Halachmi for helping to chase down Talos regressions and JW Wang for helping to find cause of one particular hard to analyze test failure spike.  And also all early adopters who helped to find and fix bugs.  Thanks!

 

New preferences to play with:

 

browser.cache.disk.metadata_memory_limit
Number of kBs we reserve for keeping recently loaded cache entries metadata (i.e. response headers etc.) for quick access and re-validation or reuse decisions.  By default this is at 250kB.
browser.cache.disk.preload_chunk_count
Number of data chunks we always preload ahead of read to speed up load of larger content like images.  Currently size of one chunk is 256kB, and by default we preload 4 chunks – i.e. 1MB of data in advance.

 

Load times compare:

Since these tests are pretty time consuming and usually not very precise, I was only testing with page 2 of my blog that links some 460 images.  Media storage devices available were: internal SSD, an SDHC card and a very slow microSD via a USB reader on a Windows 7 box.

 

[ complete page load time / first paint time ]

SSD
Cache versionFirst visitCold go to 1)Warm go to 2)Reload
cache v17.4s / 450ms880ms / 440ms510ms / 355ms5s / 430ms
cache v26.4s / 445ms610ms / 470ms470ms / 360ms5s / 440ms

 

Class 10 SDHC
Cache versionFirst visitCold go to 1)Warm go to 2)Reload
cache v17.4s / 635ms760ms / 480ms545ms / 365ms5s / 430ms
cache v26.4s / 485ms1.3s / 450ms530ms / 400ms*5.1s / 460ms*

 

Edit: I found one more place to optimize – preload of data sooner in case an entry has already been used during the browser session (bug 1013587).  We are winning around 100ms for both first paint and load times!  Also stddev of first-paint time is smaller (36) than before (80).  I have also measured more precisely the load time for non-patched cache v2 code.  It’s actually better.

Slow microSD
Cache versionFirst visitCold go to 1)Warm go to 2)Reload
cache v113s / 1.4s1.1s / 540ms560ms / 440ms5.1s / 430ms
cache v26.4s / 450ms1.7s / 450ms710ms / 540ms*5.4s / 470ms*
cache v2 (with bug 1013587)--615ms / 455ms*-

* We are not keeping any data in memory (bug 975367 and 986179) what seems to be too restrictive.  Some data memory caching will be needed.

 

“Jankiness” compare:

The way I have measured browser UI jank (those hangs when everything is frozen) was very simple: summing every stuck of the browser UI, taking more then 100ms, between pressing enter and end of the page load.

 

[ time of all UI thread events running for more then 100ms each during the page load ]

SSD
Cache versionFirst visitCold go to 1)Warm go to 2)Reload
cache v10ms600ms0ms0ms
cache v20ms0ms0ms0ms

 

Class 10 SDHC
Cache versionFirst visitCold go to 1)Warm go to 2)Reload
cache v1600ms600ms0ms0ms
cache v20ms0ms0ms0ms

 

Slow microSD
Cache versionFirst visitCold go to 1)Warm go to 2)Reload
cache v12500ms740ms0ms0ms
cache v20ms0ms0ms0ms

 

All load time values are medians, jank values averages, from at least 3 runs without extremes in attempt to lower the noise.

 

1) Open a new tab and navigate to a page right after the Firefox start.

2) Open a new tab and navigate to a page that has already been visited during the browser session.

 

58 thoughts on “New Firefox HTTP cache now enabled on Nightly builds

  1. I think you have units slightly messed up in slow microSD load times. 1.7ms of “cold to go” vs. 830s of “warn to go” would be pretty strange. ;-)

  2. Congratulations! New cache and OMTC Windows should make 32 a VERY exciting Firefox release! :-D Time to play with a nightly.

    PS: Load Times -> Slow microSD -> cache v2 -> Warm go to has a strange measurement (830s).

  3. 0 Jankiness? Cant wait to test things out. You have at least restore a tiny bit of hope in me for Firefox.

  4. “* We are not keeping any data in memory (bug 975367 and 986179) what seems to be too restrictive. Some data memory caching will be needed.”

    Can you use mmap(file) instead? Having a copy in [private application memory] and a copy in the filesystem can lead to unnecessary swapping, IIUC.

    1. There were suggestions on using mmap. Michal unfortunately have chosen not to use it without much explanation or wider discussion. I would be happier to migrate to use mmap as well. Worth filing a bug.

  5. Do you think a somewhat different implementtion, designed specially for SSD’s would be beneficial ?

    1. This needs some further study. No immediate plans since we are focusing on general performance and stability now. But I don’t here this suggestion the first time. Definitely an area to explore.

    2. Is it possible to choose where caches can be placed? I’d like to use a CompactFlash card that I use for another cache.
      I cannot find anything relevant in config or in Mozilla Help.

      Thanks,

      BWD

      1. Of course, there is “browser.cache.disk.parent_directory” preference that you can change in about:config.

  6. Hi there, interesting news, but how to manage files stored in:
    C:\Documents and Settings\user\\Dati applicazioni\Mozilla\Firefox\Profiles\\cache2\entries

    Here I have found a lot of file (around 1GB).

    How can I manage these files?

    Thanks

    1. I have no idea what you mean by “managing files” in that location. There is no need to manage them at all in any way. This is the place where cache entries are stored. We take care to not overreach smart (default) or hard limit you may set manually. That’s all.

  7. The new HTTP cache seems to store a LOT more than the old cache. When I set FF to clear caches on exit, and then use Recuva tosecurely erase deleted cache images, pre-v32 FF had maybe a few hundred recoverable images. Now with v32.x, Recuva finds literally thousands of recoverable images that need to be erased

    1. Yes, since now we store each URL to a separate file. You can easily have 20000 files in the cache directory now.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.