IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> NGINX源码之:ngx_open_cached_file -> 正文阅读

[系统运维]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时,执行
在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:30:38  更:2022-09-24 21:34:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:23:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码