加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

80%的 Linux 运维都不懂的内核题目

发布时间:2018-12-08 02:46:32 所属栏目:业界 来源:luodw
导读:媒介 之前在演习时,听了 OOM 的分享之后,就对 Linux 内核内存打点布满乐趣,可是这块常识很是复杂,没有必然蕴蓄,不敢写下,担忧误人后辈,以是颠末一个一段时刻的蕴蓄,对内核内存有必然相识之后,记录以及分享。 【OOM - Out of Memory】内存溢出 内

从这个先容可以看出,当 drop_caches 文件为1时,这时将开释 pagecache 中可开释的部门(有些 cache 是不能通过这个开释的),当 drop_caches 为2时,这时将开释 dentries 和 inodes 缓存,当 drop_caches 为3时,这同时开释上述两项。

要害尚有最后一句,意思是说假如 pagecache 中有脏数据时,操纵 drop_caches 是不能开释的,必需通过 sync 呼吁将脏数据革新到磁盘,才气通过操纵 drop_caches 开释 pagecache。

ok,之前有提到有些pagecache是不能通过drop_caches开释的,那么除了上述提文件映射和共享匿名映射外,尚有有哪些对象是存在pagecache了?

4.2 tmpfs

我们先来看下 tmpfs ,tmpfs 和 procfs,sysfs 以及 ramfs 一样,都是基于内存的文件体系,tmpfs 和 ramfs 的区别就是 ramfs 的文件基于纯内存的,和 tmpfs 除了纯内存外,还会行使 swap 互换空间,以及 ramfs 也许会把内存耗尽,而 tmpfs 可以限制行使内存巨细,可以用呼吁 df -T -h 查察系同一些文件体系,个中就有一些是 tmpfs,较量着名的是目次 /dev/shm

tmpfs 文件体系源文件在内核源码 mm/shmem.c,tmpfs实现很伟大,之前有先容假造文件体系,基于 tmpfs 文件体系建设文件和其他基于磁盘的文件系同一样,也会有 inode,super_block,identry,file 等布局,区别首要是在读写上,由于读写才涉及到文件的载体是内存照旧磁盘。

而 tmpfs 文件的读函数 shmem_file_read,进程首要为通过 inode 布局找到 address_space 地点空间,着实就是磁盘文件的 pagecache,然后通过读偏移定位cache 页以及页内偏移。

这时就可以直接从这个 pagecache 通过函数 __copy_to_user 将缓存页内数据拷贝到用户空间,当我们要读物的数据不pagecache中时,这时要判定是否在 swap 中,假如在则先将内存页 swap in,再读取。

tmpfs 文件的写函数 shmem_file_write,进程首要为先判定要写的页是否在内存中,假如在,则直接将用户态数据通过函数__copy_from_user拷贝至内核pagecache中包围老数据,并标为 dirty。

假如要写的数据不再内存中,则判定是否在swap 中,假如在,则先读取出来,用新数据包围老数据并标为脏,假如即不在内存也不在磁盘,则新天生一个 pagecache 存储用户数据。

由上面说明,我们知道基于 tmpfs 的文件也是行使 cache 的,我们可以在/dev/shm上建设一个文件来检测下:

80%的 Linux 运维都不懂的内核题目

看到了吧,cache 增添了1G,验证了 tmpfs 简直行使的 cache 内存。

着实 mmap 匿名映射道理也是用了 tmpfs,在 mm/mmap.c->do_mmap_pgoff 函数内部,有判定假如 file 布局为空以及为 SHARED 映射,则挪用 shmem_zero_setup(vma) 函数在 tmpfs 上用新建一个文件

80%的 Linux 运维都不懂的内核题目

这里就表明白为什么共享匿名映射内存初始化为0了,可是我们知道用 mmap 分派的内存初始化为0,就是说 mmap 私有匿名映射也为0,那么表此刻哪了?

这个在 do_mmap_pgoff 函数内部可没有浮现出来,而是在缺页非常,然后分派一种非凡的初始化为0的页。

那么这个 tmpfs 占据的内存页可以接纳吗?

80%的 Linux 运维都不懂的内核题目

也就是说 tmpfs 文件占据的 pagecache 是不能接纳的,原理也很明明,由于有文件引用这些页,就不能接纳。

4.3 共享内存

posix 共享内存着实和 mmap 共享映射是统一个原理,都是操作在 tmpfs 文件体系上新建一个文件,然后再映射到用户态,最后两个历程操纵统一个物理内存,那么 System V 共享内存是否也是操作 tmpfs 文件辖档退?

我们可以跟踪到下述函数

80%的 Linux 运维都不懂的内核题目

这个函数就是新建一个共享内存段,个中函数

  1. shmem_kernel_file_setup 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读