comparison src/http/ngx_http_file_cache.c @ 7670: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
7669:52b34c3f89b4 7670: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) {