Changeset 6727:ca709bca4b77 in nginx


Ignore:
Timestamp:
10/05/16 11:22:30 (3 years ago)
Author:
Dmitry Volyntsev <xeioex@…>
Branch:
default
Phase:
public
Message:

Cache: cache manager limits.

The new parameters "manager_files", "manager_sleep"
and "manager_threshold" were added to proxy_cache_path
and friends.

Note that ngx_path_manager_pt was changed to return ngx_msec_t
instead of time_t (API change).

Location:
src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/core/ngx_file.h

    r6709 r6727  
    4343
    4444
    45 typedef time_t (*ngx_path_manager_pt) (void *data);
     45typedef ngx_msec_t (*ngx_path_manager_pt) (void *data);
    4646typedef ngx_msec_t (*ngx_path_purger_pt) (void *data);
    4747typedef void (*ngx_path_loader_pt) (void *data);
  • src/http/ngx_http_cache.h

    r6709 r6727  
    167167    ngx_msec_t                       loader_threshold;
    168168
     169    ngx_uint_t                       manager_files;
     170    ngx_msec_t                       manager_sleep;
     171    ngx_msec_t                       manager_threshold;
     172
    169173    ngx_shm_zone_t                  *shm_zone;
    170174};
  • src/http/ngx_http_file_cache.c

    r6617 r6727  
    17601760    time_t                       now, wait;
    17611761    ngx_path_t                  *path;
     1762    ngx_msec_t                   elapsed;
    17621763    ngx_queue_t                 *q;
    17631764    ngx_http_file_cache_node_t  *fcn;
     
    18111812        if (fcn->count == 0) {
    18121813            ngx_http_file_cache_delete(cache, q, name);
    1813             continue;
     1814            goto next;
    18141815        }
    18151816
     
    18371838                      "ignore long locked inactive cache entry %*s, count:%d",
    18381839                      (size_t) 2 * NGX_HTTP_CACHE_KEY_LEN, key, fcn->count);
     1840
     1841next:
     1842
     1843        if (++cache->files >= cache->manager_files) {
     1844            wait = 0;
     1845            break;
     1846        }
     1847
     1848        ngx_time_update();
     1849
     1850        elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
     1851
     1852        if (elapsed >= cache->manager_threshold) {
     1853            wait = 0;
     1854            break;
     1855        }
    18391856    }
    18401857
     
    18981915
    18991916
    1900 static time_t
     1917static ngx_msec_t
    19011918ngx_http_file_cache_manager(void *data)
    19021919{
     
    19051922    off_t       size;
    19061923    time_t      next, wait;
     1924    ngx_msec_t  elapsed;
    19071925    ngx_uint_t  count, watermark;
    1908 
    1909     next = ngx_http_file_cache_expire(cache);
    19101926
    19111927    cache->last = ngx_current_msec;
    19121928    cache->files = 0;
     1929
     1930    next = ngx_http_file_cache_expire(cache);
     1931
     1932    if (next == 0) {
     1933        return cache->manager_sleep;
     1934    }
    19131935
    19141936    for ( ;; ) {
     
    19261948
    19271949        if (size < cache->max_size && count < watermark) {
    1928             return next;
     1950            return (ngx_msec_t) next * 1000;
    19291951        }
    19301952
     
    19321954
    19331955        if (wait > 0) {
    1934             return wait;
     1956            return (ngx_msec_t) wait * 1000;
    19351957        }
    19361958
    19371959        if (ngx_quit || ngx_terminate) {
    1938             return next;
     1960            return (ngx_msec_t) next * 1000;
     1961        }
     1962
     1963        if (++cache->files >= cache->manager_files) {
     1964            return cache->manager_sleep;
     1965        }
     1966
     1967        ngx_time_update();
     1968
     1969        elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last));
     1970
     1971        if (elapsed >= cache->manager_threshold) {
     1972            return cache->manager_sleep;
    19391973        }
    19401974    }
     
    22122246    ssize_t                 size;
    22132247    ngx_str_t               s, name, *value;
    2214     ngx_int_t               loader_files;
    2215     ngx_msec_t              loader_sleep, loader_threshold;
     2248    ngx_int_t               loader_files, manager_files;
     2249    ngx_msec_t              loader_sleep, manager_sleep, loader_threshold,
     2250                            manager_threshold;
    22162251    ngx_uint_t              i, n, use_temp_path;
    22172252    ngx_array_t            *caches;
     
    22312266
    22322267    inactive = 600;
     2268
    22332269    loader_files = 100;
    22342270    loader_sleep = 50;
    22352271    loader_threshold = 200;
     2272
     2273    manager_files = 100;
     2274    manager_sleep = 50;
     2275    manager_threshold = 200;
    22362276
    22372277    name.len = 0;
     
    24002440                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
    24012441                           "invalid loader_threshold value \"%V\"", &value[i]);
     2442                return NGX_CONF_ERROR;
     2443            }
     2444
     2445            continue;
     2446        }
     2447
     2448        if (ngx_strncmp(value[i].data, "manager_files=", 14) == 0) {
     2449
     2450            manager_files = ngx_atoi(value[i].data + 14, value[i].len - 14);
     2451            if (manager_files == NGX_ERROR) {
     2452                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
     2453                           "invalid manager_files value \"%V\"", &value[i]);
     2454                return NGX_CONF_ERROR;
     2455            }
     2456
     2457            continue;
     2458        }
     2459
     2460        if (ngx_strncmp(value[i].data, "manager_sleep=", 14) == 0) {
     2461
     2462            s.len = value[i].len - 14;
     2463            s.data = value[i].data + 14;
     2464
     2465            manager_sleep = ngx_parse_time(&s, 0);
     2466            if (manager_sleep == (ngx_msec_t) NGX_ERROR) {
     2467                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
     2468                           "invalid manager_sleep value \"%V\"", &value[i]);
     2469                return NGX_CONF_ERROR;
     2470            }
     2471
     2472            continue;
     2473        }
     2474
     2475        if (ngx_strncmp(value[i].data, "manager_threshold=", 18) == 0) {
     2476
     2477            s.len = value[i].len - 18;
     2478            s.data = value[i].data + 18;
     2479
     2480            manager_threshold = ngx_parse_time(&s, 0);
     2481            if (manager_threshold == (ngx_msec_t) NGX_ERROR) {
     2482                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
     2483                           "invalid manager_threshold value \"%V\"", &value[i]);
    24022484                return NGX_CONF_ERROR;
    24032485            }
     
    24262508    cache->loader_sleep = loader_sleep;
    24272509    cache->loader_threshold = loader_threshold;
     2510    cache->manager_files = manager_files;
     2511    cache->manager_sleep = manager_sleep;
     2512    cache->manager_threshold = manager_threshold;
    24282513
    24292514    if (ngx_add_path(cf, &cache->path) != NGX_OK) {
  • src/os/unix/ngx_process_cycle.c

    r6651 r6727  
    11491149ngx_cache_manager_process_handler(ngx_event_t *ev)
    11501150{
    1151     time_t        next, n;
    11521151    ngx_uint_t    i;
     1152    ngx_msec_t    next, n;
    11531153    ngx_path_t  **path;
    11541154
    1155     next = 60 * 60;
     1155    next = 60 * 60 * 1000;
    11561156
    11571157    path = ngx_cycle->paths.elts;
     
    11711171    }
    11721172
    1173     ngx_add_timer(ev, next * 1000);
     1173    ngx_add_timer(ev, next);
    11741174}
    11751175
  • src/os/win32/ngx_process_cycle.c

    r6651 r6727  
    922922{
    923923    u_long        ev;
    924     time_t        next, n;
    925924    ngx_uint_t    i;
     925    ngx_msec_t    next, n;
    926926    ngx_path_t  **path;
    927927
    928     next = 60 * 60;
     928    next = 60 * 60 * 1000;
    929929
    930930    path = ngx_cycle->paths.elts;
     
    944944    }
    945945
    946     ev = WaitForSingleObject(ngx_cache_manager_event, (u_long) next * 1000);
     946    ev = WaitForSingleObject(ngx_cache_manager_event, (u_long) next);
    947947
    948948    if (ev != WAIT_TIMEOUT) {
Note: See TracChangeset for help on using the changeset viewer.