#28977: Change Local Memory Cache to Use LRU
-------------------------------------+-------------------------------------
Reporter: Grant Jenks | Owner: Grant
| Jenks
Type: New feature | Status: assigned
Component: Core (Cache system) | Version: master
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Grant Jenks):
One more set of benchmarks. The above results benchmark in a single-
process and single-thread environment. There's therefore never a time when
the locks contend with one another for access. I thought it would be
useful to observe performance with more contention and my development
machine has eight logical processors so here's the results in a single-
process and eight-thread environment.
The current implementation:
{{{
========= ========= ========= ========= ========= ========= =========
=========
Timings for locmem
-------------------------------------------------------------------------------
Action Count Miss Median P90 P99 Max
Total
========= ========= ========= ========= ========= ========= =========
=========
get 712648 85412 14.067us 863.075us 2.461ms 14.337ms
160.973s
set 71226 0 204.563us 238.180us 282.288us 7.419ms
12.356s
delete 8118 0 201.941us 235.081us 281.811us 410.080us
1.395s
Total 791992
174.724s
========= ========= ========= ========= ========= ========= =========
=========
}}}
The new implementation:
{{{
========= ========= ========= ========= ========= ========= =========
=========
Timings for locmem
-------------------------------------------------------------------------------
Action Count Miss Median P90 P99 Max
Total
========= ========= ========= ========= ========= ========= =========
=========
get 712637 84222 146.151us 165.224us 201.225us 9.591ms
106.855s
set 71241 0 149.012us 167.847us 204.802us 9.604ms
10.875s
delete 8114 0 144.958us 163.078us 195.026us 552.893us
1.200s
Total 791992
118.930s
========= ========= ========= ========= ========= ========= =========
=========
}}}
The results overall display less variation but the median "get" time is
10x slower (14 microseconds vs 146 microseconds). Despite that large
slowdown, the total time for "get" operations is ~33% faster (160 seconds
vs 106 seconds). The "set" and "delete" operations have comparable
performance.
The LRU eviction policy turns every read into a write which obsoletes the
django.utils.synch.RWLock used in the current implementation. The RWLock
was capable of giving multiple readers concurrent access but with the
additional overhead. Therefore we see in the "no contention" scenario that
the overhead is less by using threading.RLock. In the "high contention"
scenario the additional overhead gives reads an advantage at the median
but a larger penalty at the 99th percentile.
I think these tradeoffs are easy to accept. Note that the benchmark does
not include a miss-rate penalty which the LRU-eviction policy will almost
certainly improve compared with the current random-eviction policy.
--
Ticket URL: <https://code.djangoproject.com/ticket/28977#comment:6>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/068.018ba6c1d5800e6209316e19316044a6%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.