Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
1bcf296c
Commit
1bcf296c
authored
Aug 06, 2013
by
antirez
Browse files
Some activeExpireCycle() refactoring.
parent
97f5e867
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/redis.c
View file @
1bcf296c
...
@@ -648,33 +648,37 @@ int activeExpireCycleTryExpire(redisDb *db, struct dictEntry *de, long long now)
...
@@ -648,33 +648,37 @@ int activeExpireCycleTryExpire(redisDb *db, struct dictEntry *de, long long now)
* No more than REDIS_DBCRON_DBS_PER_CALL databases are tested at every
* No more than REDIS_DBCRON_DBS_PER_CALL databases are tested at every
* iteration.
* iteration.
*
*
* If fast is non-zero the function will try to run a "fast" expire cycle that
* takes no longer than EXPIRE_FAST_CYCLE_DURATION microseconds, and is not
* repeated again before the same amount of time.
*
* This kind of call is used when Redis detects that timelimit_exit is
* This kind of call is used when Redis detects that timelimit_exit is
* true, so there is more work to do, and we do it more incrementally from
* true, so there is more work to do, and we do it more incrementally from
* the beforeSleep() function of the event loop. */
* the beforeSleep() function of the event loop.
*
#define EXPIRE_FAST_CYCLE_DURATION 1000
* Expire cycle type:
*
* If type is ACTIVE_EXPIRE_CYCLE_FAST the function will try to run a
* "fast" expire cycle that takes no longer than EXPIRE_FAST_CYCLE_DURATION
* microseconds, and is not repeated again before the same amount of time.
*
* If type is ACTIVE_EXPIRE_CYCLE_SLOW, that normal expire cycle is
* executed, where the time limit is a percentage of the REDIS_HZ period
* as specified by the REDIS_EXPIRELOOKUPS_TIME_PERC define. */
void
activeExpireCycle
(
int
fast
)
{
void
activeExpireCycle
(
int
type
)
{
/* This function has some global state in order to continue the work
/* This function has some global state in order to continue the work
* incrementally across calls. */
* incrementally across calls. */
static
unsigned
int
current_db
=
0
;
/* Last DB tested. */
static
unsigned
int
current_db
=
0
;
/* Last DB tested. */
static
int
timelimit_exit
=
0
;
/* Time limit hit in previous call? */
static
int
timelimit_exit
=
0
;
/* Time limit hit in previous call? */
static
long
long
last_fast_cycle
=
0
;
/* When last fast cycle ran. */
unsigned
int
j
,
iteration
=
0
;
unsigned
int
j
,
iteration
=
0
;
unsigned
int
dbs_per_call
=
REDIS_DBCRON_DBS_PER_CALL
;
unsigned
int
dbs_per_call
=
REDIS_DBCRON_DBS_PER_CALL
;
long
long
start
=
ustime
(),
timelimit
;
long
long
start
=
ustime
(),
timelimit
;
static
long
long
last_fast_cycle
=
0
;
if
(
fast
)
{
if
(
type
==
ACTIVE_EXPIRE_CYCLE_FAST
)
{
/* Don't start a fast cycle if the previous cycle did not exited
/* Don't start a fast cycle if the previous cycle did not exited
* for time limt. Also don't repeat a fast cycle for the same period
* for time limt. Also don't repeat a fast cycle for the same period
* as the fast cycle total duration itself. */
* as the fast cycle total duration itself. */
if
(
!
timelimit_exit
)
return
;
if
(
!
timelimit_exit
)
return
;
if
(
start
<
last_fast_cycle
+
EXPIRE_FAST_CYCLE
_DURATION
)
return
;
if
(
start
<
last_fast_cycle
+
ACTIVE_EXPIRE_CYCLE_FAST
_DURATION
)
return
;
last_fast_cycle
=
start
;
last_fast_cycle
=
start
;
}
}
...
@@ -688,15 +692,16 @@ void activeExpireCycle(int fast) {
...
@@ -688,15 +692,16 @@ void activeExpireCycle(int fast) {
if
(
dbs_per_call
>
server
.
dbnum
||
timelimit_exit
)
if
(
dbs_per_call
>
server
.
dbnum
||
timelimit_exit
)
dbs_per_call
=
server
.
dbnum
;
dbs_per_call
=
server
.
dbnum
;
/* We can use at max
REDIS
_EXPIRE
LOOKUPS
_TIME_PERC percentage of CPU time
/* We can use at max
ACTIVE
_EXPIRE
_CYCLE_SLOW
_TIME_PERC percentage of CPU time
* per iteration. Since this function gets called with a frequency of
* per iteration. Since this function gets called with a frequency of
* server.hz times per second, the following is the max amount of
* server.hz times per second, the following is the max amount of
* microseconds we can spend in this function. */
* microseconds we can spend in this function. */
timelimit
=
1000000
*
REDIS
_EXPIRE
LOOKUPS
_TIME_PERC
/
server
.
hz
/
100
;
timelimit
=
1000000
*
ACTIVE
_EXPIRE
_CYCLE_SLOW
_TIME_PERC
/
server
.
hz
/
100
;
timelimit_exit
=
0
;
timelimit_exit
=
0
;
if
(
timelimit
<=
0
)
timelimit
=
1
;
if
(
timelimit
<=
0
)
timelimit
=
1
;
if
(
fast
)
timelimit
=
EXPIRE_FAST_CYCLE_DURATION
;
/* in microseconds. */
if
(
type
==
ACTIVE_EXPIRE_CYCLE_FAST
)
timelimit
=
ACTIVE_EXPIRE_CYCLE_FAST_DURATION
;
/* in microseconds. */
for
(
j
=
0
;
j
<
dbs_per_call
;
j
++
)
{
for
(
j
=
0
;
j
<
dbs_per_call
;
j
++
)
{
int
expired
;
int
expired
;
...
@@ -727,8 +732,8 @@ void activeExpireCycle(int fast) {
...
@@ -727,8 +732,8 @@ void activeExpireCycle(int fast) {
/* The main collection cycle. Sample random keys among keys
/* The main collection cycle. Sample random keys among keys
* with an expire set, checking for expired ones. */
* with an expire set, checking for expired ones. */
expired
=
0
;
expired
=
0
;
if
(
num
>
REDIS
_EXPIRELOOKUPS_PER_
CRON
)
if
(
num
>
ACTIVE
_EXPIRE
_CYCLE_
LOOKUPS_PER_
LOOP
)
num
=
REDIS
_EXPIRELOOKUPS_PER_
CRON
;
num
=
ACTIVE
_EXPIRE
_CYCLE_
LOOKUPS_PER_
LOOP
;
while
(
num
--
)
{
while
(
num
--
)
{
dictEntry
*
de
;
dictEntry
*
de
;
...
@@ -745,7 +750,9 @@ void activeExpireCycle(int fast) {
...
@@ -745,7 +750,9 @@ void activeExpireCycle(int fast) {
timelimit_exit
=
1
;
timelimit_exit
=
1
;
}
}
if
(
timelimit_exit
)
return
;
if
(
timelimit_exit
)
return
;
}
while
(
expired
>
REDIS_EXPIRELOOKUPS_PER_CRON
/
4
);
/* We don't repeat the cycle if there are less than 25% of keys
* found expired in the current DB. */
}
while
(
expired
>
ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP
/
4
);
}
}
}
}
...
@@ -865,7 +872,7 @@ void databasesCron(void) {
...
@@ -865,7 +872,7 @@ void databasesCron(void) {
/* Expire keys by random sampling. Not required for slaves
/* Expire keys by random sampling. Not required for slaves
* as master will synthesize DELs for us. */
* as master will synthesize DELs for us. */
if
(
server
.
active_expire_enabled
&&
server
.
masterhost
==
NULL
)
if
(
server
.
active_expire_enabled
&&
server
.
masterhost
==
NULL
)
activeExpireCycle
(
0
);
activeExpireCycle
(
ACTIVE_EXPIRE_CYCLE_SLOW
);
/* Perform hash tables rehashing if needed, but only if there are no
/* Perform hash tables rehashing if needed, but only if there are no
* other processes saving the DB on disk. Otherwise rehashing is bad
* other processes saving the DB on disk. Otherwise rehashing is bad
...
@@ -1098,7 +1105,7 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
...
@@ -1098,7 +1105,7 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
redisClient
*
c
;
redisClient
*
c
;
/* Run a fast expire cycle. */
/* Run a fast expire cycle. */
activeExpireCycle
(
1
);
activeExpireCycle
(
ACTIVE_EXPIRE_CYCLE_FAST
);
/* Try to process pending commands for clients that were just unblocked. */
/* Try to process pending commands for clients that were just unblocked. */
while
(
listLength
(
server
.
unblocked_clients
))
{
while
(
listLength
(
server
.
unblocked_clients
))
{
...
...
src/redis.h
View file @
1bcf296c
...
@@ -74,8 +74,6 @@
...
@@ -74,8 +74,6 @@
#define REDIS_MAXIDLETIME 0
/* default client timeout: infinite */
#define REDIS_MAXIDLETIME 0
/* default client timeout: infinite */
#define REDIS_DEFAULT_DBNUM 16
#define REDIS_DEFAULT_DBNUM 16
#define REDIS_CONFIGLINE_MAX 1024
#define REDIS_CONFIGLINE_MAX 1024
#define REDIS_EXPIRELOOKUPS_PER_CRON 20
/* lookup 20 expires per loop */
#define REDIS_EXPIRELOOKUPS_TIME_PERC 25
/* CPU max % for keys collection */
#define REDIS_DBCRON_DBS_PER_CALL 16
#define REDIS_DBCRON_DBS_PER_CALL 16
#define REDIS_MAX_WRITE_PER_EVENT (1024*64)
#define REDIS_MAX_WRITE_PER_EVENT (1024*64)
#define REDIS_SHARED_SELECT_CMDS 10
#define REDIS_SHARED_SELECT_CMDS 10
...
@@ -96,6 +94,12 @@
...
@@ -96,6 +94,12 @@
#define REDIS_OPS_SEC_SAMPLES 16
#define REDIS_OPS_SEC_SAMPLES 16
#define REDIS_BGSAVE_RETRY_DELAY 5
/* Wait a few secs before trying again. */
#define REDIS_BGSAVE_RETRY_DELAY 5
/* Wait a few secs before trying again. */
#define ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20
/* Loopkups per loop. */
#define ACTIVE_EXPIRE_CYCLE_FAST_DURATION 1000
/* Microseconds */
#define ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 25
/* CPU max % for keys collection */
#define ACTIVE_EXPIRE_CYCLE_SLOW 0
#define ACTIVE_EXPIRE_CYCLE_FAST 1
/* Protocol and I/O related defines */
/* Protocol and I/O related defines */
#define REDIS_MAX_QUERYBUF_LEN (1024*1024*1024)
/* 1GB max query buffer. */
#define REDIS_MAX_QUERYBUF_LEN (1024*1024*1024)
/* 1GB max query buffer. */
#define REDIS_IOBUF_LEN (1024*16)
/* Generic I/O buffer size */
#define REDIS_IOBUF_LEN (1024*16)
/* Generic I/O buffer size */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment