我在用nginx做缓存的时候,发现一个现象,nginx会实时管理缓存空间大小,比如我设置缓存max_size=100m,
nginx会实时监控当前缓存空间大小,但是问题是:当nginx缓存的文件大于1m时,nginx的监控正常工作,记录缓存文件大小,
可是nginx缓存的文件小于1m的时候,nginx监控会把新缓存的文件按照1m大小计算。求教
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);
}
主要是上述代码中的:fs_size = (ngx_file_fs_size(&fi) + cache->bsize - 1) / cache->bsize;这段代码会获取当前缓存的文件 大小,
ngx_file_fs_size方法的代码:#define ngx_file_fs_size(sb) ngx_max((sb)->st_size, (sb)->st_blocks * 512),这段代码会把换的文件大小与1m比较,去大值
,求教,有人知道这个是为什么吗
有点钻牛角啦,类似 小孩子不满一岁按一岁算,