10569 Commits

Author SHA1 Message Date
antirez
1aaeeaa537 LRU simulator: fix new entry creation decr time. 2016-07-14 15:55:17 +02:00
antirez
f50dc38bc2 LRU simulator: fix new entry creation. 2016-07-14 15:51:51 +02:00
antirez
c8a6d75f1c LRU simulator: fix new entry creation. 2016-07-14 15:51:51 +02:00
antirez
09fcb00249 LFU: Simulation of the algorithm planned for Redis.
We have 24 total bits of space in each object in order to implement
an LFU (Least Frequently Used) eviction policy.

We split the 24 bits into two fields:

      8 bits      16 bits
    +--------+----------------+
    | LOG_C  | Last decr time |
    +--------+----------------+

LOG_C is a logarithmic counter that provides an indication of the access
frequency. However this field must also be deceremented otherwise what used
to be a frequently accessed key in the past, will remain ranked like that
forever, while we want the algorithm to adapt to access pattern changes.

So the remaining 16 bits are used in order to store the "decrement time",
a reduced-precision unix time (we take 16 bits of the time converted
in minutes since we don't care about wrapping around) where the LOG_C
counter is halved if it has an high value, or just decremented if it
has a low value.

New keys don't start at zero, in order to have the ability to collect
some accesses before being trashed away, so they start at COUNTER_INIT_VAL.
The logaritmic increment performed on LOG_C takes care of COUNTER_INIT_VAL
when incrementing the key, so that keys starting at COUNTER_INIT_VAL
(or having a smaller value) have a very high chance of being incremented
on access.

The simulation starts with a power-law access pattern, and later converts
into a flat access pattern in order to see how the algorithm adapts.
Currenty the decrement operation period is 1 minute, however note that
it is not guaranteed that each key will be scanned 1 time every minute,
so the actual frequency can be lower. However under high load, we access
3/5 keys every newly inserted key (because of how Redis eviction works).

This is a work in progress at this point to evaluate if this works well.
2016-07-14 15:21:48 +02:00
antirez
cd969573ed LFU: Simulation of the algorithm planned for Redis.
We have 24 total bits of space in each object in order to implement
an LFU (Least Frequently Used) eviction policy.

We split the 24 bits into two fields:

      8 bits      16 bits
    +--------+----------------+
    | LOG_C  | Last decr time |
    +--------+----------------+

LOG_C is a logarithmic counter that provides an indication of the access
frequency. However this field must also be deceremented otherwise what used
to be a frequently accessed key in the past, will remain ranked like that
forever, while we want the algorithm to adapt to access pattern changes.

So the remaining 16 bits are used in order to store the "decrement time",
a reduced-precision unix time (we take 16 bits of the time converted
in minutes since we don't care about wrapping around) where the LOG_C
counter is halved if it has an high value, or just decremented if it
has a low value.

New keys don't start at zero, in order to have the ability to collect
some accesses before being trashed away, so they start at COUNTER_INIT_VAL.
The logaritmic increment performed on LOG_C takes care of COUNTER_INIT_VAL
when incrementing the key, so that keys starting at COUNTER_INIT_VAL
(or having a smaller value) have a very high chance of being incremented
on access.

The simulation starts with a power-law access pattern, and later converts
into a flat access pattern in order to see how the algorithm adapts.
Currenty the decrement operation period is 1 minute, however note that
it is not guaranteed that each key will be scanned 1 time every minute,
so the actual frequency can be lower. However under high load, we access
3/5 keys every newly inserted key (because of how Redis eviction works).

This is a work in progress at this point to evaluate if this works well.
2016-07-14 15:21:48 +02:00
antirez
e423f76e75 LRU: Make cross-database choices for eviction.
The LRU eviction code used to make local choices: for each DB visited it
selected the best key to evict. This was repeated for each DB. However
this means that there could be DBs with very frequently accessed keys
that are targeted by the LRU algorithm while there were other DBs with
many better candidates to expire.

This commit attempts to fix this problem for the LRU policy. However the
TTL policy is still not fixed by this commit. The TTL policy will be
fixed in a successive commit.

This is an initial (partial because of TTL policy) fix for issue #2647.
2016-07-13 13:12:30 +02:00
antirez
bb5b1c5991 LRU: Make cross-database choices for eviction.
The LRU eviction code used to make local choices: for each DB visited it
selected the best key to evict. This was repeated for each DB. However
this means that there could be DBs with very frequently accessed keys
that are targeted by the LRU algorithm while there were other DBs with
many better candidates to expire.

This commit attempts to fix this problem for the LRU policy. However the
TTL policy is still not fixed by this commit. The TTL policy will be
fixed in a successive commit.

This is an initial (partial because of TTL policy) fix for issue #2647.
2016-07-13 13:12:30 +02:00
antirez
e64bf05f43 LRU: cache SDS strings in the eviction pool.
To destroy and recreate the pool[].key element is slow, so we allocate
in pool[].cached SDS strings that can account up to 255 chars keys and
try to reuse them. This provides a solid 20% performance improvement
in real world workload alike benchmarks.
2016-07-12 12:31:37 +02:00
antirez
8934a2a78a LRU: cache SDS strings in the eviction pool.
To destroy and recreate the pool[].key element is slow, so we allocate
in pool[].cached SDS strings that can account up to 255 chars keys and
try to reuse them. This provides a solid 20% performance improvement
in real world workload alike benchmarks.
2016-07-12 12:31:37 +02:00
antirez
965905c9f2 Move the struct evictionPoolEntry() into only file using it.
Local scope is always better when possible.
2016-07-12 12:22:38 +02:00
antirez
8464262b28 Move the struct evictionPoolEntry() into only file using it.
Local scope is always better when possible.
2016-07-12 12:22:38 +02:00
antirez
d8e92a8207 Move prototype of evictionPoolAlloc() in server.h. 2016-07-12 12:22:35 +02:00
antirez
4ef07b3f9d Move prototype of evictionPoolAlloc() in server.h. 2016-07-12 12:22:35 +02:00
antirez
3b9495d20d LRU: use C99 variable len stack array in evictionPoolPopulate(). 2016-07-12 12:05:45 +02:00
antirez
9f47c5a53b LRU: use C99 variable len stack array in evictionPoolPopulate(). 2016-07-12 12:05:45 +02:00
antirez
2a1247309a redis-benchmark: new option to show server errors on stdout.
Disabled by default, can be activated with -e. Maybe the reverse was
more safe but departs from the past behavior.
2016-07-12 11:23:31 +02:00
antirez
f07cc50f89 redis-benchmark: new option to show server errors on stdout.
Disabled by default, can be activated with -e. Maybe the reverse was
more safe but departs from the past behavior.
2016-07-12 11:23:31 +02:00
antirez
382991f82e Remove useless memmove() from freeMemoryIfNeeded().
We start from the end of the pool to the initial item, zero-ing
every entry we use or every ghost entry, there is nothing to memmove
since to the right everything should be already set to NULL.
2016-07-11 19:18:17 +02:00
antirez
f708bf2a14 Remove useless memmove() from freeMemoryIfNeeded().
We start from the end of the pool to the initial item, zero-ing
every entry we use or every ghost entry, there is nothing to memmove
since to the right everything should be already set to NULL.
2016-07-11 19:18:17 +02:00
antirez
b19b2dff46 LRU: Fix output fixes to new test-lru.rb. 2016-07-11 16:26:02 +02:00
antirez
bbac261b64 LRU: Fix output fixes to new test-lru.rb. 2016-07-11 16:26:02 +02:00
antirez
6a1c00c9ea Merge branch 'unstable' of github.com:/antirez/redis into unstable 2016-07-11 16:24:21 +02:00
antirez
22be3d06e3 Merge branch 'unstable' of github.com:/antirez/redis into unstable 2016-07-11 16:24:21 +02:00
antirez
32a549432b LRU: test-lru.rb improved in different ways.
1. Scan keys with pause to account for actual LRU precision.
2. Test cross-DB with 100 keys allocated in DB1.
3. Output results that don't fluctuate depending on number of keys.
4. Output results in percentage to make more sense.
5. Save file instead of outputting to STDOUT.
6. Support running multiple times with average of outputs.
7. Label each square (DIV) with its ID as HTML title.
2016-07-11 16:23:50 +02:00
antirez
c35d315148 LRU: test-lru.rb improved in different ways.
1. Scan keys with pause to account for actual LRU precision.
2. Test cross-DB with 100 keys allocated in DB1.
3. Output results that don't fluctuate depending on number of keys.
4. Output results in percentage to make more sense.
5. Save file instead of outputting to STDOUT.
6. Support running multiple times with average of outputs.
7. Label each square (DIV) with its ID as HTML title.
2016-07-11 16:23:50 +02:00
antirez
51c1d40d08 redis_check_rdb(): the rio structure must be global.
The rio structure is referenced in the global 'riostate' structure
in order for the logging functions to be always able to access the state
of the "pseudo-loading" of the RDB, needed for the check.

Courtesy of Valgrind.
2016-07-06 19:12:24 +02:00
antirez
2e7ab9a360 redis_check_rdb(): the rio structure must be global.
The rio structure is referenced in the global 'riostate' structure
in order for the logging functions to be always able to access the state
of the "pseudo-loading" of the RDB, needed for the check.

Courtesy of Valgrind.
2016-07-06 19:12:24 +02:00
antirez
eee878cbc5 redis_check_rdb_main(): create shared objects only if needed.
Otherwise Valgrind will complain a memory leak under certain tests where
RDB checking is invoked from within Redis.
2016-07-06 19:06:22 +02:00
antirez
3b5a3c7249 redis_check_rdb_main(): create shared objects only if needed.
Otherwise Valgrind will complain a memory leak under certain tests where
RDB checking is invoked from within Redis.
2016-07-06 19:06:22 +02:00
antirez
24882e31f2 Fix redis_check_rdb() return value. 2016-07-06 19:00:43 +02:00
antirez
4e3fea4f1a Fix redis_check_rdb() return value. 2016-07-06 19:00:43 +02:00
antirez
1e6bb9ef0c Remove dead code from geohash_helper.c.
The function removed also had potential bugs related to signess of the
expression, and is not used anyway.
2016-07-06 16:39:23 +02:00
antirez
6430ab2861 Remove dead code from geohash_helper.c.
The function removed also had potential bugs related to signess of the
expression, and is not used anyway.
2016-07-06 16:39:23 +02:00
antirez
3961071b20 Fix signess issue in geohashEstimateStepsByRadius(). 2016-07-06 16:38:05 +02:00
antirez
ceaa949cb8 Fix signess issue in geohashEstimateStepsByRadius(). 2016-07-06 16:38:05 +02:00
antirez
504ccad1fa Fix definition of M_PI in geohash_helper.c.
Without the right feature macros M_PI is not defined in math.h.
2016-07-06 16:31:11 +02:00
antirez
173cdcaccd Fix definition of M_PI in geohash_helper.c.
Without the right feature macros M_PI is not defined in math.h.
2016-07-06 16:31:11 +02:00
antirez
eaa713e93b geohash.c and geohash_helper.c are part of Redis.
They were under /deps since they originate from a different source tree,
however at this point they are very modified and we took ownership of
both the files making changes, fixing bugs, so there is no upgrade path
from the original code tree.

Given that, better to move the code under /src with proper dependencies
and with a more simpler editing experience.
2016-07-06 16:02:38 +02:00
antirez
d7322b6f2f geohash.c and geohash_helper.c are part of Redis.
They were under /deps since they originate from a different source tree,
however at this point they are very modified and we took ownership of
both the files making changes, fixing bugs, so there is no upgrade path
from the original code tree.

Given that, better to move the code under /src with proper dependencies
and with a more simpler editing experience.
2016-07-06 16:02:38 +02:00
antirez
4a140d320f Add expire.c and evict.c. 2016-07-06 15:28:18 +02:00
antirez
0ed805f7f4 Add expire.c and evict.c. 2016-07-06 15:28:18 +02:00
antirez
b46239e58b Expire and LRU related code moved into different files. 2016-07-06 15:24:06 +02:00
antirez
0df4deada4 Expire and LRU related code moved into different files. 2016-07-06 15:24:06 +02:00
antirez
0610683d5e Makefile: don't build dependencies file for clean, distclean. 2016-07-06 12:56:43 +02:00
antirez
d14ec7e975 Makefile: don't build dependencies file for clean, distclean. 2016-07-06 12:56:43 +02:00
antirez
10361829f9 Generate Makefile.dep at every build.
Normally we used to update it from time to time. Too fragile... better
to generate dependencies at every run and delete them on 'make clean'.
2016-07-06 12:24:48 +02:00
antirez
262bc9d095 Generate Makefile.dep at every build.
Normally we used to update it from time to time. Too fragile... better
to generate dependencies at every run and delete them on 'make clean'.
2016-07-06 12:24:48 +02:00
antirez
abb3385e8d Regression test for issue #3333. 2016-07-06 11:50:20 +02:00
antirez
669db62ae1 Regression test for issue #3333. 2016-07-06 11:50:20 +02:00
antirez
23791828f1 getLongLongFromObject: use string2ll() instead of strict_strtoll().
strict_strtoll() has a bug that reports the empty string as ok and
parses it as zero.

Apparently nobody ever replaced this old call with the faster/saner
string2ll() which is used otherwise in the rest of the Redis core.

This commit close #3333.
2016-07-06 11:43:33 +02:00