Mercurial > hg > nginx-quic
comparison src/http/ngx_http_file_cache.c @ 7973:ccb5ff87ab3e
Cache: introduced min_free cache clearing.
Clearing cache based on free space left on a file system is
expected to allow better disk utilization in some cases, notably
when disk space might be also used for something other than nginx
cache (including nginx own temporary files) and while loading
cache (when cache size might be inaccurate for a while, effectively
disabling max_size cache clearing).
Based on a patch by Adam Bambuch.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Mon, 22 Jun 2020 18:03:00 +0300 |
parents | bddacdaaec9e |
children | 847fd35f94de |
comparison
equal
deleted
inserted
replaced
7972:52b34c3f89b4 | 7973:ccb5ff87ab3e |
---|---|
1957 static ngx_msec_t | 1957 static ngx_msec_t |
1958 ngx_http_file_cache_manager(void *data) | 1958 ngx_http_file_cache_manager(void *data) |
1959 { | 1959 { |
1960 ngx_http_file_cache_t *cache = data; | 1960 ngx_http_file_cache_t *cache = data; |
1961 | 1961 |
1962 off_t size; | 1962 off_t size, free; |
1963 time_t wait; | 1963 time_t wait; |
1964 ngx_msec_t elapsed, next; | 1964 ngx_msec_t elapsed, next; |
1965 ngx_uint_t count, watermark; | 1965 ngx_uint_t count, watermark; |
1966 | 1966 |
1967 cache->last = ngx_current_msec; | 1967 cache->last = ngx_current_msec; |
1986 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, | 1986 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, |
1987 "http file cache size: %O c:%ui w:%i", | 1987 "http file cache size: %O c:%ui w:%i", |
1988 size, count, (ngx_int_t) watermark); | 1988 size, count, (ngx_int_t) watermark); |
1989 | 1989 |
1990 if (size < cache->max_size && count < watermark) { | 1990 if (size < cache->max_size && count < watermark) { |
1991 break; | 1991 |
1992 if (!cache->min_free) { | |
1993 break; | |
1994 } | |
1995 | |
1996 free = ngx_fs_available(cache->path->name.data); | |
1997 | |
1998 ngx_log_debug1(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, | |
1999 "http file cache free: %O", free); | |
2000 | |
2001 if (free > cache->min_free) { | |
2002 break; | |
2003 } | |
1992 } | 2004 } |
1993 | 2005 |
1994 wait = ngx_http_file_cache_forced_expire(cache); | 2006 wait = ngx_http_file_cache_forced_expire(cache); |
1995 | 2007 |
1996 if (wait > 0) { | 2008 if (wait > 0) { |
2302 char * | 2314 char * |
2303 ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | 2315 ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |
2304 { | 2316 { |
2305 char *confp = conf; | 2317 char *confp = conf; |
2306 | 2318 |
2307 off_t max_size; | 2319 off_t max_size, min_free; |
2308 u_char *last, *p; | 2320 u_char *last, *p; |
2309 time_t inactive; | 2321 time_t inactive; |
2310 ssize_t size; | 2322 ssize_t size; |
2311 ngx_str_t s, name, *value; | 2323 ngx_str_t s, name, *value; |
2312 ngx_int_t loader_files, manager_files; | 2324 ngx_int_t loader_files, manager_files; |
2339 manager_threshold = 200; | 2351 manager_threshold = 200; |
2340 | 2352 |
2341 name.len = 0; | 2353 name.len = 0; |
2342 size = 0; | 2354 size = 0; |
2343 max_size = NGX_MAX_OFF_T_VALUE; | 2355 max_size = NGX_MAX_OFF_T_VALUE; |
2356 min_free = 0; | |
2344 | 2357 |
2345 value = cf->args->elts; | 2358 value = cf->args->elts; |
2346 | 2359 |
2347 cache->path->name = value[1]; | 2360 cache->path->name = value[1]; |
2348 | 2361 |
2470 if (max_size < 0) { | 2483 if (max_size < 0) { |
2471 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 2484 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
2472 "invalid max_size value \"%V\"", &value[i]); | 2485 "invalid max_size value \"%V\"", &value[i]); |
2473 return NGX_CONF_ERROR; | 2486 return NGX_CONF_ERROR; |
2474 } | 2487 } |
2488 | |
2489 continue; | |
2490 } | |
2491 | |
2492 if (ngx_strncmp(value[i].data, "min_free=", 9) == 0) { | |
2493 | |
2494 #if (NGX_WIN32 || NGX_HAVE_STATFS || NGX_HAVE_STATVFS) | |
2495 | |
2496 s.len = value[i].len - 9; | |
2497 s.data = value[i].data + 9; | |
2498 | |
2499 min_free = ngx_parse_offset(&s); | |
2500 if (min_free < 0) { | |
2501 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
2502 "invalid min_free value \"%V\"", &value[i]); | |
2503 return NGX_CONF_ERROR; | |
2504 } | |
2505 | |
2506 #else | |
2507 ngx_conf_log_error(NGX_LOG_WARN, cf, 0, | |
2508 "min_free is not supported " | |
2509 "on this platform, ignored"); | |
2510 #endif | |
2475 | 2511 |
2476 continue; | 2512 continue; |
2477 } | 2513 } |
2478 | 2514 |
2479 if (ngx_strncmp(value[i].data, "loader_files=", 13) == 0) { | 2515 if (ngx_strncmp(value[i].data, "loader_files=", 13) == 0) { |
2605 | 2641 |
2606 cache->use_temp_path = use_temp_path; | 2642 cache->use_temp_path = use_temp_path; |
2607 | 2643 |
2608 cache->inactive = inactive; | 2644 cache->inactive = inactive; |
2609 cache->max_size = max_size; | 2645 cache->max_size = max_size; |
2646 cache->min_free = min_free; | |
2610 | 2647 |
2611 caches = (ngx_array_t *) (confp + cmd->offset); | 2648 caches = (ngx_array_t *) (confp + cmd->offset); |
2612 | 2649 |
2613 ce = ngx_array_push(caches); | 2650 ce = ngx_array_push(caches); |
2614 if (ce == NULL) { | 2651 if (ce == NULL) { |