shmem:
在/proc/meminfo中发现,cached不等于ActiveFile + InActiveFile,我们来看看cache到底都包括啥内存
1)首先肯定包含activeFile 和 inactiveFile
58 cached = global_node_page_state(NR_FILE_PAGES) -
59 total_swapcache_pages() - i.bufferram;
所以在/proc/meminfo中的cache的内存就是activeFile+inactiveFile+shmMem-bufferRam
Memory availbale中的内存是啥?
那么所有的NR_FILE_PAGEa是啥子呢?
=
所以cache的计算公式是:nr_file_pages是怎么计算出来的,是所有的问题集
---------------------------------------
内核中的 tmpfs 就是 share memory
内核中的tmpfs就是share memory
是一个虚拟的文件系统,都是在一个share memory的文件系统中存储的,所以所有对共享内存的申请,将来都是落到tmpfs中去的,所以我们看下集中典型的内存的申请的方式:shmget和mmap的方式是不是都是从tmpfs文件系统中去分配inode,并且这种inode是不能被flush掉的,所以有三种方式来处理,shget/mmap/write /dev/shm
那么我通过mmap的方式申请内存
方式二:
ptr = mmap(NULL, 4096000, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0);
这种方式的内存既会统计在share memory中,也会统计在page cache里,所以说到底,这里应该是统计到文件系统中了;
方式三:
直接向/dev/shm中写数据,share memory确实是增加了,也被统计到page cache里,匪夷所思啊
这种也是从share memory里分配的内存么?刚开始也是没有内存吧?然后真正写的时候发生缺页中断
方式四:
使用shmat之后,内存的分配
为什么释放之后,shm还没有被释放掉呢,但是
mmap发生缺页中断之后,这个page会添加到tmp的page cache里吗?
虽然在shm中的内存是在tmpfs中管理的,但是,这些内存是算到shared里的,这种是共享
在/proc/meminfo中存储的
ret = vma->vm_ops->fault(vma, &vmf);
每一段vma也都会注册一套函数,这里就是一个内存段发生缺页时会调用的函数,Call Trace:
[<ffffffff8114668b>] shmem_getpage_gfp+0x41b/0xab0
[<ffffffff81146de9>] shmem_fault+0x69/0x1a0
[<ffffffff811b790c>] ? __mark_inode_dirty+0x32c/0x390
[<ffffffff8130a8fe>] shm_fault+0x1e/0x20
[<ffffffff81158e91>] __do_fault+0x71/0xe0
[<ffffffff8115dc09>] handle_mm_fault+0x3b9/0xde0
[<ffffffff8116417d>] ? do_mmap+0x44d/0x500
[<ffffffff81046eb4>] __do_page_fault+0x244/0x4e0
[<ffffffff8104715c>] do_page_fault+0xc/0x10
[<ffffffff8187f362>] page_fault+0x22/0x30
shm_fault: syslogd
真正的匿名页是不会走到这里的真正的匿名页不是在虚拟的文件系统中管理的,而是直接管理,二者是在那个地方分的叉的呢?handle_pte_fault,在这里分为了两个流向了不同的防线1)do_anonymous_page2) do_fault --> __do_fault所以这里怎么判断一块区域到底是不是匿名页呢?是通过vma_is_aonnymous的:!vma->vm_ops,只有这种page才需要特殊的映射的方法
shm_mem_fault->shmem_getpage_gfp ---> shmem_add_to_page_cache
shm_mem_fault是大家都要经历过的一环
shmem:的更多相关文章
- Linux主机内存评估手册-从零到无
--时间:2020年10月22日 --作者:飞翔的小胖猪 文档基于Centos Linux操作系统作为生产服务器运行环境.实时的查看分析当前系统内存的使用情况是否存在内存瓶颈,结合应用及现行业务需求分 ...
- java web 开发三剑客 -------电子书
Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知In ...
- 所有selenium相关的库
通过爬虫 获取 官方文档库 如果想获取 相应的库 修改对应配置即可 代码如下 from urllib.parse import urljoin import requests from lxml im ...
- Nginx学习笔记(四) 源码分析&socket/UDP/shmem
源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_socket.h&Ngx_s ...
- 戴文的Linux内核专题:07内核配置(3)
转自Linux中国 OK,我们还继续配置内核.还有更多功能等待着去配置. 下一个问题(Enable ELF core dumps (ELF_CORE))询问的是内核是否可以生成内核转储文件.这会使内核 ...
- PostgreSQL的存储系统二:REDOLOG文件存储结构二
REDOLOG文件里的用户数据和数据文件里的用户数据存储结构相同 几个月前同事给台湾一家公司培训<pg9 ad admin>时,有个学员提及WAL里记录的内容为Query时的SQL语句(比 ...
- warn_alloc():page allocation failure问题分析
关键词:warn_alloc().__GFP_XXX.order.CMA等等. 在内存申请的时候经常会遇到类似“ xxx: page allocation failure: order:10...”类 ...
- linux 内存查看方法:meminfo\maps\smaps\status 文件解析
linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍 ...
- Linux性能优化实战学习笔记:第十六讲
一.free数据的来源 1.碰到看不明白的指标时该怎么办吗? 不懂就去查手册.用 man 命令查询 free 的文档.就可以找到对应指标的详细说明.比如,我们执行 man fre... 2.free数 ...
随机推荐
- js闭包的理解-目前网上分析的最透彻文章
js的闭包对于大家实际上并不陌生,但是真正敢说自己完全理解的人并不多.笔者在网上看到分析闭包的文章非常多,篇幅用的非常多,但是实际上分析的并不到位,或者根本就是不正确的.我有时候都在想,写这些文章的人 ...
- HDL代码风格建议(1)使用示例和IP
Recommended HDL Coding Styles HDL coding styles can have a significant effect on the quality of resu ...
- vue.js使用axios
使用axios的两种调用方式 1.安装axios $ cnpm install axios 2.在vue入口文件main.js中引入(推荐全局引入),或是在当前页面中引入(局部) import axi ...
- 阿里巴巴Java开发手册——速读记录
本随笔基于阿里巴巴Java开发手册V1.2,陆陆续续记录一些现阶段能理解的,有启发的内容,并将持续更新 最佳实践——插件使用已经发布为随笔!http://www.cnblogs.com/jiangbe ...
- Homebrew安装Redis找不到redis.conf文件
使用Homebrew安装redis完成后,使用命令 redis-server 启动redis,如下图所示: 启动信息中存在一条警告信息:没有指定的配置文件 然而在安装目录中并没有发现redis.con ...
- 使用CRF做命名实体识别(三)
摘要 本文主要是对近期做的命名实体识别做一个总结,会给出构造一个特征的大概思路,以及对比所有构造的特征对结构的影响.先给出我最近做出来的特征对比: 目录 整体操作流程 特征的构造思路 用CRF++训练 ...
- 92套AE抖音快闪模板(精品)
包含很多场景和类型,直接用即可,下载地址:百度网盘,https://pan.baidu.com/s/1bRFql1zFWyfpTAwa6MhuPA 内容截图:
- java 创建具有参数化类型的数组
1. List<String>[] ls; Object[] objects = ls; objects[1] = new ArrayList<Integer>(); 先把数组 ...
- C 数数位 while循环
#include <stdio.h> int main(int argc, char **argv) { //定义两个变量 x n 把n初始化 int x; int n=0; //输入x ...
- lintcode702 连接两个字符串中的不同字符
连接两个字符串中的不同字符 给出两个字符串, 你需要修改第一个字符串,将所有与第二个字符串中相同的字符删除, 并且第二个字符串中不同的字符与第一个字符串的不同字符连接 思路:遍历两个字符串,找到互 ...