一小小只-音视频开发 2017-08-01 05:23 采纳率: 0%
浏览 1139
已结题

nginx 缓存文件时,不足1m安装1m算,为什么?

我在用nginx做缓存的时候,发现一个现象,nginx会实时管理缓存空间大小,比如我设置缓存max_size=100m,
nginx会实时监控当前缓存空间大小,但是问题是:当nginx缓存的文件大于1m时,nginx的监控正常工作,记录缓存文件大小,
可是nginx缓存的文件小于1m的时候,nginx监控会把新缓存的文件按照1m大小计算。求教

  • 写回答

3条回答 默认 最新

  • 关注

    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);
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况