comparison src/http/ngx_http_file_cache.c @ 6727:ca709bca4b77

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).
author Dmitry Volyntsev <xeioex@nginx.com>
date Wed, 05 Oct 2016 14:22:30 +0300
parents 8bf484eef9ab
children 3fbb3bdff824
comparison
equal deleted inserted replaced
6726:631753428ecb 6727:ca709bca4b77
1757 { 1757 {
1758 u_char *name, *p; 1758 u_char *name, *p;
1759 size_t len; 1759 size_t len;
1760 time_t now, wait; 1760 time_t now, wait;
1761 ngx_path_t *path; 1761 ngx_path_t *path;
1762 ngx_msec_t elapsed;
1762 ngx_queue_t *q; 1763 ngx_queue_t *q;
1763 ngx_http_file_cache_node_t *fcn; 1764 ngx_http_file_cache_node_t *fcn;
1764 u_char key[2 * NGX_HTTP_CACHE_KEY_LEN]; 1765 u_char key[2 * NGX_HTTP_CACHE_KEY_LEN];
1765 1766
1766 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, 1767 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
1808 fcn->count, fcn->exists, 1809 fcn->count, fcn->exists,
1809 fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]); 1810 fcn->key[0], fcn->key[1], fcn->key[2], fcn->key[3]);
1810 1811
1811 if (fcn->count == 0) { 1812 if (fcn->count == 0) {
1812 ngx_http_file_cache_delete(cache, q, name); 1813 ngx_http_file_cache_delete(cache, q, name);
1813 continue; 1814 goto next;
1814 } 1815 }
1815 1816
1816 if (fcn->deleting) { 1817 if (fcn->deleting) {
1817 wait = 1; 1818 wait = 1;
1818 break; 1819 break;
1834 ngx_queue_insert_head(&cache->sh->queue, &fcn->queue); 1835 ngx_queue_insert_head(&cache->sh->queue, &fcn->queue);
1835 1836
1836 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0, 1837 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,
1837 "ignore long locked inactive cache entry %*s, count:%d", 1838 "ignore long locked inactive cache entry %*s, count:%d",
1838 (size_t) 2 * NGX_HTTP_CACHE_KEY_LEN, key, fcn->count); 1839 (size_t) 2 * NGX_HTTP_CACHE_KEY_LEN, key, fcn->count);
1840
1841 next:
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 }
1839 } 1856 }
1840 1857
1841 ngx_shmtx_unlock(&cache->shpool->mutex); 1858 ngx_shmtx_unlock(&cache->shpool->mutex);
1842 1859
1843 ngx_free(name); 1860 ngx_free(name);
1895 cache->sh->count--; 1912 cache->sh->count--;
1896 } 1913 }
1897 } 1914 }
1898 1915
1899 1916
1900 static time_t 1917 static ngx_msec_t
1901 ngx_http_file_cache_manager(void *data) 1918 ngx_http_file_cache_manager(void *data)
1902 { 1919 {
1903 ngx_http_file_cache_t *cache = data; 1920 ngx_http_file_cache_t *cache = data;
1904 1921
1905 off_t size; 1922 off_t size;
1906 time_t next, wait; 1923 time_t next, wait;
1924 ngx_msec_t elapsed;
1907 ngx_uint_t count, watermark; 1925 ngx_uint_t count, watermark;
1908
1909 next = ngx_http_file_cache_expire(cache);
1910 1926
1911 cache->last = ngx_current_msec; 1927 cache->last = ngx_current_msec;
1912 cache->files = 0; 1928 cache->files = 0;
1929
1930 next = ngx_http_file_cache_expire(cache);
1931
1932 if (next == 0) {
1933 return cache->manager_sleep;
1934 }
1913 1935
1914 for ( ;; ) { 1936 for ( ;; ) {
1915 ngx_shmtx_lock(&cache->shpool->mutex); 1937 ngx_shmtx_lock(&cache->shpool->mutex);
1916 1938
1917 size = cache->sh->size; 1939 size = cache->sh->size;
1923 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0, 1945 ngx_log_debug3(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
1924 "http file cache size: %O c:%ui w:%i", 1946 "http file cache size: %O c:%ui w:%i",
1925 size, count, (ngx_int_t) watermark); 1947 size, count, (ngx_int_t) watermark);
1926 1948
1927 if (size < cache->max_size && count < watermark) { 1949 if (size < cache->max_size && count < watermark) {
1928 return next; 1950 return (ngx_msec_t) next * 1000;
1929 } 1951 }
1930 1952
1931 wait = ngx_http_file_cache_forced_expire(cache); 1953 wait = ngx_http_file_cache_forced_expire(cache);
1932 1954
1933 if (wait > 0) { 1955 if (wait > 0) {
1934 return wait; 1956 return (ngx_msec_t) wait * 1000;
1935 } 1957 }
1936 1958
1937 if (ngx_quit || ngx_terminate) { 1959 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;
1939 } 1973 }
1940 } 1974 }
1941 } 1975 }
1942 1976
1943 1977
2209 u_char *last, *p; 2243 u_char *last, *p;
2210 time_t inactive; 2244 time_t inactive;
2211 size_t len; 2245 size_t len;
2212 ssize_t size; 2246 ssize_t size;
2213 ngx_str_t s, name, *value; 2247 ngx_str_t s, name, *value;
2214 ngx_int_t loader_files; 2248 ngx_int_t loader_files, manager_files;
2215 ngx_msec_t loader_sleep, loader_threshold; 2249 ngx_msec_t loader_sleep, manager_sleep, loader_threshold,
2250 manager_threshold;
2216 ngx_uint_t i, n, use_temp_path; 2251 ngx_uint_t i, n, use_temp_path;
2217 ngx_array_t *caches; 2252 ngx_array_t *caches;
2218 ngx_http_file_cache_t *cache, **ce; 2253 ngx_http_file_cache_t *cache, **ce;
2219 2254
2220 cache = ngx_pcalloc(cf->pool, sizeof(ngx_http_file_cache_t)); 2255 cache = ngx_pcalloc(cf->pool, sizeof(ngx_http_file_cache_t));
2228 } 2263 }
2229 2264
2230 use_temp_path = 1; 2265 use_temp_path = 1;
2231 2266
2232 inactive = 600; 2267 inactive = 600;
2268
2233 loader_files = 100; 2269 loader_files = 100;
2234 loader_sleep = 50; 2270 loader_sleep = 50;
2235 loader_threshold = 200; 2271 loader_threshold = 200;
2272
2273 manager_files = 100;
2274 manager_sleep = 50;
2275 manager_threshold = 200;
2236 2276
2237 name.len = 0; 2277 name.len = 0;
2238 size = 0; 2278 size = 0;
2239 max_size = NGX_MAX_OFF_T_VALUE; 2279 max_size = NGX_MAX_OFF_T_VALUE;
2240 2280
2397 2437
2398 loader_threshold = ngx_parse_time(&s, 0); 2438 loader_threshold = ngx_parse_time(&s, 0);
2399 if (loader_threshold == (ngx_msec_t) NGX_ERROR) { 2439 if (loader_threshold == (ngx_msec_t) NGX_ERROR) {
2400 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, 2440 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
2401 "invalid loader_threshold value \"%V\"", &value[i]); 2441 "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]);
2402 return NGX_CONF_ERROR; 2484 return NGX_CONF_ERROR;
2403 } 2485 }
2404 2486
2405 continue; 2487 continue;
2406 } 2488 }
2423 cache->path->conf_file = cf->conf_file->file.name.data; 2505 cache->path->conf_file = cf->conf_file->file.name.data;
2424 cache->path->line = cf->conf_file->line; 2506 cache->path->line = cf->conf_file->line;
2425 cache->loader_files = loader_files; 2507 cache->loader_files = loader_files;
2426 cache->loader_sleep = loader_sleep; 2508 cache->loader_sleep = loader_sleep;
2427 cache->loader_threshold = loader_threshold; 2509 cache->loader_threshold = loader_threshold;
2510 cache->manager_files = manager_files;
2511 cache->manager_sleep = manager_sleep;
2512 cache->manager_threshold = manager_threshold;
2428 2513
2429 if (ngx_add_path(cf, &cache->path) != NGX_OK) { 2514 if (ngx_add_path(cf, &cache->path) != NGX_OK) {
2430 return NGX_CONF_ERROR; 2515 return NGX_CONF_ERROR;
2431 } 2516 }
2432 2517