当前位置: 首页 > news >正文

NGINX源码之:ngx_open_cached_file

在NGINX中,缓存静态文件,通常只是缓存了打开文件的描述符fd,在客户端访问静态资源的时候,NGINX通过sendfile机制,由DMA将数据读到输出流,响应到客户端,因此ngx_open_cached_file()中,并没有缓存文件内容。
在解读ngx_open_cached_file前,先来写个debug的demo:

void testOpenFileCache(){

    /**
     *    需先对时间初始化,否则now = ngx_time();这句会报错
     */
    ngx_time_init();

    ngx_open_file_info_t          of;
    ngx_memzero(&of, sizeof(ngx_open_file_info_t));
    of.read_ahead = 128;
//    of.directio = clcf->directio;
    of.valid = 30;
//    of.min_uses = clcf->open_file_cache_min_uses;
//    of.test_only = 1;
    of.errors = 0;
//    of.events = clcf->open_file_cache_events;
    ngx_pool_t * pool = ngx_create_pool(POOL_SIZE,NULL);
    ngx_open_file_cache_t  *open_file_cache = ngx_open_file_cache_init(pool, 32, 60);
    ngx_str_t name = ngx_string("/root/a.txt");
//    ngx_open_cached_file(NULL,&name,&of,pool);
    ngx_open_cached_file(open_file_cache,&name,&of,pool);
    //第二次访问,通过cache访问
    ngx_open_cached_file(open_file_cache,&name,&of,pool);
}

void main(){
    testOpenFileCache();
}

先来看看打开open_file_cache 的配置

http{
open_file_cache max=1000 inactive=20s;
#表示最大打开文件缓存1000个,inative表示失效时间,到达失效时间未再次访问的将从缓存移除并关闭,默认关闭该配置

open_file_cache_valid 30s;
#指多长时间检查一次缓存的有效信息

open_file_cache_min_uses 1;
#指在失效时间范围内,最少访问多少次,文件描述符才是一直打开状态
}

一、不使用文件缓存的情形:
在这里插入图片描述
ngx_pool_cleanup_add()
在这里插入图片描述
ngx_open_and_stat_file()
在这里插入图片描述

direct io
使用DMA直接将硬盘上的数据读到用户空间buffer, 或者将用户空间buffer中的数据通过DMA直接写到硬盘上。避免多次系统调用及CPU拷贝(用户态内核态之间的拷贝)动作;
使用directIO时,用户态buffer需与系统page大小对齐,即,当系统page大小为4096,那么用户态buff需是4096的正整数倍。

location /video/ { 
    sendfile on; 
    aio on; 
    directio 1024m; 
}

使用AIO时,应该同时使directIO生效,AIO从内核版本2.6.22后开始支持;
当文件大小大于 directio 值后,使用「异步 I/O + 直接 I/O」这两者不需使用pagecache,文件大小小于directio 或者关闭directIO时,使用「零拷贝技术:sendfile或mmap」
官网AIO配置 或 配置Nginx I/O 或 零拷贝

二、使用文件缓存情形
使用文件缓存时,需要先初始化缓存:当配置了open_file_cache ,那么在解析配置时,会执行ngx_open_file_cache_init()
在这里插入图片描述
这里使用的就是cleanup handler就是ngx_open_file_cache_cleanup这个是清理cache的,而ngx_pool_cleanup_file是清理单个缓存文件的
此时cache就不为空了,那么ngx_open_cached_file()中就跳过cache为空的部分:
在这里插入图片描述
在这里插入图片描述

现在来看看对于create代码块中对超时file缓存的处理:ngx_expire_old_cached_files()

在这里插入图片描述
其中ngx_close_cached_file方法接下来一起解读。
最后,来看看两个cleanup方法:
ngx_open_file_cleanup(): 这个是在pool销毁时触发执行:
在这里插入图片描述
ngx_open_file_cache_cleanup,也是在销毁对应的pool时,执行
在这里插入图片描述

相关文章:

  • 【路径规划-机器人栅格地图】基于蚁群算法求解大规模栅格地图路径规划及避障附Matlab代码
  • SpringCache的介绍和使用
  • java-php-python-ssm艾灸减肥管理网站计算机毕业设计
  • 力扣每日一题2022-09-23中等题:设计链表
  • 内存数据库简介-内存数据库性能排行
  • 【云原生】Hadoop on k8s 环境部署
  • 不同编码格式(Unicode、多字节字符)vs环境下使用printf、scanf应注意事项
  • 使用Express获取jquery数据 使用模块化 共享自己的数据库
  • Python算法:决策树分类
  • IDEA插件开发-学习
  • python工具方法35 实现SWA,再一次提升模型的性能
  • mysql查询优化实战:查询用时一分半降到三毫秒
  • 你用什么方法做副业赚钱?
  • 十五:Fiddler抓包教程(15)-Fiddler弱网测试
  • 【最长公共子序列】两行字符串,不交叉相连,最多连线
  • crontab执行失败的多种原因
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • HTTP那些事
  • php的插入排序,通过双层for循环
  • Python3爬取英雄联盟英雄皮肤大图
  • sessionStorage和localStorage
  • Zsh 开发指南(第十四篇 文件读写)
  • 微服务框架lagom
  • 微信小程序填坑清单
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #1014 : Trie树
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $(function(){})与(function($){....})(jQuery)的区别
  • (2)Java 简介
  • (solr系列:一)使用tomcat部署solr服务
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)springcloud实战之config配置中心
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Mobi域名介绍
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net core 6.0 升8.0
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @ResponseBody
  • [20170728]oracle保留字.txt
  • [ActionScript][AS3]小小笔记
  • [Angular] 笔记 6:ngStyle
  • [BT]BUUCTF刷题第8天(3.26)
  • [BZOJ2850]巧克力王国
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [c]扫雷