我在用nginx做缓存的时候,发现一个现象,nginx会实时管理缓存空间大小,比如我设置缓存max_size=100m,
nginx会实时监控当前缓存空间大小,但是问题是:当nginx缓存的文件大于1m时,nginx的监控正常工作,记录缓存文件大小,
可是nginx缓存的文件小于1m的时候,nginx监控会把新缓存的文件按照1m大小计算。求教
nginx 缓存文件时,不足1m安装1m算,为什么?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
一小小只-音视频开发 2017-08-01 05:25关注nginx缓存的源码:
ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
{
off_t fs_size;
ngx_int_t rc;
ngx_file_uniq_t uniq;
ngx_file_info_t fi;
ngx_http_cache_t *c;
ngx_ext_rename_file_t ext;
ngx_http_file_cache_t *cache;c = r->cache; if (c->updated) { return; } ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http file cache update"); cache = c->file_cache; c->updated = 1; c->updating = 0; uniq = 0; fs_size = 0; ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http file cache rename: \"%s\" to \"%s\"", tf->file.name.data, c->file.name.data); ext.access = NGX_FILE_OWNER_ACCESS; ext.path_access = NGX_FILE_OWNER_ACCESS; ext.time = -1; ext.create_path = 1; ext.delete_file = 1; ext.log = r->connection->log; rc = ngx_ext_rename_file(&tf->file.name, &c->file.name, &ext); if (rc == NGX_OK) { if (ngx_fd_info(tf->file.fd, &fi) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, ngx_fd_info_n " \"%s\" failed", tf->file.name.data); rc = NGX_ERROR; } else { uniq = ngx_file_uniq(&fi); //change by liangc //fs_size = (ngx_file_fs_size(&fi) + cache->bsize - 1) / cache->bsize; fs_size = ((&fi)->st_size + cache->bsize - 1) / cache->bsize; } } ngx_shmtx_lock(&cache->shpool->mutex); c->node->count--; c->node->error = 0; c->node->uniq = uniq; c->node->body_start = c->body_start; ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, "0............................ngx_http_file_cache_update : cache->sh->size = %d ,c->node->fs_size = %d fs_size = %d ",cache->sh->size, c->node->fs_size, fs_size); cache->sh->size += fs_size - c->node->fs_size; c->node->fs_size = fs_size; if (rc == NGX_OK) { c->node->exists = 1; } c->node->updating = 0; ngx_shmtx_unlock(&cache->shpool->mutex);}
解决 无用评论 打赏 举报