Mercurial > hg > nginx
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 |