Cache

文件缓存是提升性能的重要手段。毋庸置疑,读缓存(Read caching)在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据),而写缓存(Write caching)则相对复杂。Linux内核将写磁盘的操作分解成了,先写缓存,每隔一段时间再异步地将缓存写入磁盘。这提升了IO读写的速度,但存在一定风险。数据没有及时写入磁盘,所以存在数据丢失的风险。

同样,也存在cache被写爆的情况。还可能出现一次性往磁盘写入过多数据,以致使系统卡顿。之所以卡顿,是因为系统认为,缓存太大用异步的方式来不及把它们都写进磁盘,于是切换到同步的方式写入。(异步,即写入的同时进程能正常运行;同步,即写完之前其他进程不能工作)。

/etc/sysctl.conf 用于控制内核相关的配置参数,而且它的内容全部是对应于 /proc/sys/ 这个目录的子目录及文件

系统配置相关文件

[root@MongoDB ~]# ll /proc/sys
total 0
dr-xr-xr-x 1 root root 0 Apr 18 01:21 abi // 应用的二进制信息
dr-xr-xr-x 1 root root 0 Apr 17 03:56 crypto // 调试相关的系统配置目录
dr-xr-xr-x 1 root root 0 Apr 18 01:21 debug // 设备相关的系统配置目录
dr-xr-xr-x 1 root root 0 Apr 18 01:21 dev    // 文件系统相关的系统配置目录
dr-xr-xr-x 1 root root 0 Apr 17 03:44 fs  // 文件系统相关的系统配置目录
dr-xr-xr-x 1 root root 0 Apr 17 03:44 kernel // 内核相关的系统配置目录
dr-xr-xr-x 1 root root 0 Apr 17 03:44 net // 网络相关的系统配置目录
dr-xr-xr-x 1 root root 0 Apr 18 01:21 user // 用户相关的系统配置目录
dr-xr-xr-x 1 root root 0 Apr 17 03:46 vm // 内存相关的系统配置目录

sysctl.conf 文件内容与内存相关参数说明

vm.overcommit_memory = 0内存分配策略,可选0 1 2
0,表示内存将检查是否有足够的可用内存供应用进程使用,如果有,允许申请,否则,内存申请失败,将错误返回给应用进程
1,表示内存允许分配所有的物理内存,而不管当前的内存状态如何
2,表示内存允许分配所有的物理内存和交换空间所有的内存

//内存相关配置参数
vm.vfs_cache_pressure = 300
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
vm.dirtytime_expire_seconds = 43200
vm.zone_reclaim_mode = 1

参数解释:

vm.vfs_cache_pressure
控制内核回收directory和inode的回收速率,当降低该值会使得内核保留dentry和inode caches,当vfs_cache_pressure=0时,内核不会回收dentry和inode caches,这种情况下可能会导致内存泄漏。增加该值可能会影响系统性能,但会加快回收dentry和inode caches,可以通过slabtop命令查看dentry/inode caches的数值
vm.dirty_background_ratio
是内存可以填充脏数据的百分比。这些脏数据稍后会写入磁盘,pdflush/flush/kdmflush这些后台进程会稍后清理脏数据。比如,我有32G内存,那么有3.2G的脏数据可以待着内存里,超过3.2G的话就会有后台进程来清理。
vm.dirty_ratio
是可以用脏数据填充的绝对最大系统内存量,当系统到达此点时,必须将所有脏数据提交到磁盘,同时所有新的I/O块都会被阻塞,直到脏数据被写入磁盘(脏数据小于dirty_ratio)。这通常是长I/O卡顿的原因,但这也是保证内存中不会存在过量脏数据的保护机制。
vm.dirty_background_bytesvm.dirty_bytes
是另一种指定这些参数的方法。如果设置_bytes版本,则_ratio版本将变为0,反之亦然。
vm.dirty_writeback_centisecs
指定多长时间 pdflush/flush/kdmflush 这些进程会唤醒一次,然后检查是否有缓存需要清理。控制周期回写进程的唤醒时间,默认值为500,单位是厘秒,实际内核中是*10使用,即5s,也就是每隔5秒唤醒脏页回写进程,降低这个值可以把尖峰的写操作削平成多次写操作。
vm.dirty_expire_centisecs
指定脏数据能存活的时间。在这里它的值是30秒。当 pdflush/flush/kdmflush 在运行的时候,他们会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。毕竟数据在内存里待太久也会有丢失风险。
vm.zone_reclaim_mode=1
开启当内存不够用时就直接回收内存

Linux下有个内核参数overcommit_memory,是内存分配策略,程序在启动的时候会先去申请内存,尽管不一定都会用的到那么多。
overcommit_memory此参数决定是否接受超大内存请求的条件。这个参数有三个可能的值:
0 — 默认设置。内核执行启发式内存过量使用处理,方法是估算可用内存量,并拒绝明显无效的请求。遗憾的是因为内存是使用启发式而非准确算法计算进行部署,这个设置有时可能会造成系统中的可用内存超载。
1 — 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。
2 — 内存拒绝等于或者大于总可用 swap 大小以及overcommit_ratio指定的物理RAM比例的内存请求。如果您希望减小内存过度使用的风险,这个设置就是最好的。

通俗理解:
0:内核将检查是否有足够的内存分配给程序。如果没有则申请失败,并把错误返回给应用进程。而在Redis中这个错误就会表现为“Cannot allocate memory”,然后触发OOM
1:表示内核允许超量使用内存直到用完为止
2:表示内核决不超量使用内存,即系统整个内存空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数支持修改

说明:
1.提交background回写work
如果没有设置/proc/sys/vm/dirty_bytes和/proc/sys/vm/dirty_background_bytes,统计空闲页和可回收页面之后,并扣除min_free_kbytes以及系统保留内存;
如何设置了/proc/sys/vm/dirty_bytes,则按dirty_bytes计算脏页阈值,否则使用vm_dirty_ratio计算脏页阈值,默认值20%;
如何设置了/proc/sys/vm/dirty_background_bytes,则按其计算background脏页阈值,否则使用dirty_background_ratio计算background脏页阈值,默认值10%;
background脏页阈值不能大于脏页阈值,也就是background回写要早于进程主动刷脏页;
2.执行background回写work
实际执行background回写时需要再次做一次判断,因为background回写优先级比较低,其他work上可能已经回写了部分脏页,有可能此时已经低于阈值;
3.显式回写
background回写对于进程是无法感知的,但是如果脏页过多,来不及处理,内存消耗过快,此时在进程运行时就出现了内存不足,这是就需要显式的触发脏页回写,并阻塞等待内存释放后,进程才能进一步运行。这种情况主要是在write操作过程中出现

脏数据在内存停留条件为:
a:dirty_expire_centisecs时间以内
b:脏数据没有超过dirty_background_ratio阈值

sysctl 命令

sysctl 命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录“/proc/sys”中

sysctl [-n] [-e] -w variable=value
sysctl [-n] [-e] -p (default /etc/sysctl.conf)
sysctl [-n] [-e] -a
常用参数的意义:
-w 临时改变某个指定参数的值,如
sysctl -w net.ipv4.ip_forward=1
-a 显示所有的系统参数
-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载

如果仅仅是想临时改变某个系统参数的值,可以用两种方法来实现,例如想启用IP路由转发功能:
1) #echo 1 > /proc/sys/net/ipv4/ip_forward
2) #sysctl -w net.ipv4.ip_forward=1
以上两种方法都可能立即开启路由功能,但如果系统重启,或执行了
# service network restart
命令,所设置的值即会丢失,如果想永久保留配置,可以修改/etc/sysctl.conf文件
将 net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1

free 命令

显示当前系统中的内存使用和空闲情况,也可以显示被内核占用的内存缓冲区

列1:total:物理内存的总大小
列2:used:被使用的大小
列3:free:可用内存空闲内存大小
列4:shared:被多个进程共享的内存
列5:buffer/cached:磁盘缓存的大小
列6:available:还可以被进程使用的物理内存大小

cache和buffer详解

buffer 和 cache 应该是两种类型的内存,但是 free 命令为什么会把它们放在一起呢?要回答这个问题需要我们做些准备工作。让我们先来搞清楚 buffer 与 cache 的含义。

buffer 在操作系统中指 buffer cache, 中文一般翻译为 “缓冲区”。要理解缓冲区,必须明确另外两个概念:“扇区” 和 “块”。扇区是设备的最小寻址单元,也叫 “硬扇区” 或 “设备块”。块是操作系统中文件系统的最小寻址单元,也叫 “文件块” 或 “I/O 块”。每个块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示:

buffer cache 只有块的概念而没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。

cache 在操作系统中指 page cache,中文一般翻译为 “页高速缓存”。它主要用来减少对磁盘的 I/O 操作。是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。页高速缓存缓存的是内存页面。缓存中的页来自对普通文件、块设备文件(这个指的就是 buffer cache 呀)和内存映射文件的读写。

页高速缓存对普通文件的缓存:当内核要读一个文件(比如 /etc/hosts)时,它会先检查这个文件的数据是不是已经在页高速缓存中了。如果在,就放弃访问磁盘,直接从内存中读取。这个行为称为缓存命中。如果数据不在缓存中,就是未命中缓存,此时内核就要调度块 I/O 操作从磁盘去读取数据。然后内核将读来的数据放入页高速缓存中。这种缓存的目标是文件系统可以识别的文件(比如 /etc/hosts)。

页高速缓存对块设备文件的缓存就是我们在前面介绍的 buffer cahce。因为独立的磁盘块通过缓冲区也被存入了页高速缓存(缓冲区最终是由页高速缓存来承载的)。

参考链接
原文链接:https://blog.csdn.net/baidu_20608025/article/details/105012723
原文链接:https://blog.csdn.net/longwang155069/article/details/50897026

sysctl 之内存释放及磁盘优化相关推荐

  1. FLEX内存释放优化原则

    FLEX内存释放优化原则: 1. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成垃圾回收处理掉: 2. 父对象内部的子对象被外部其他对象引用了,会导致此子对象不会被删除,子对象不会被删除又会 ...

  2. 《嵌入式linux内存使用与性能优化》读书笔记

    <嵌入式linux内存使用与性能优化>读书笔记 前言 本书的重点分为系统内存和性能优化,前4章着重内存使用,尽量减少进程的内存使用量,定位和发现内存泄漏:后5章着重与如何让系统性能优化,加 ...

  3. 《嵌入式Linux内存使用与性能优化》笔记

    <嵌入式Linux内存使用与性能优化>笔记 这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相 ...

  4. 面向非易失内存的MPI-IO接口优化

    点击上方蓝字关注我们 面向非易失内存的MPI-IO接口优化 邓镇龙, 陈志广 中山大学计算机学院,广东 广州 510006 摘要:在高性能计算环境中,MPI应用多个计算节点同时访问底层存储系统文件时, ...

  5. Unity3D 内存 释放

    最转载自:http://cl314413.blog.163.com/blog/static/190507976201322713921743/ 近网友通过网站搜索Unity3D在手机及其他平台下占用内 ...

  6. Android:最全面详细的性能优化攻略(含内存优化、内存泄漏、绘制优化、布局优化、图片优化、APK优化、多线程优化、列表优化等)

    前言:佛教中有一句话:初学者的心态,拥有初学者心态是件了不起的事情.真正的大师永远怀有一颗学徒的心. 一.概述 在Android中,性能优化是细分领域中最难且也是知识面涉及最深和最广的方向之一. 更快 ...

  7. 你居然还不知道Mysql存储引擎InnoDB分为内存架构、磁盘架构?

    作者:陌北有棵树,Java人,架构师社区合伙人! 关于MySQL对于后端程序员的重要性不言而喻,而InnoDB也已经是MySQL默认的存储引擎.作为我们每天打交道的存储引擎,我们对它可能需要对它有更多 ...

  8. linux内存释放和使用限制

    1.内存释放 命令:echo 1 > /proc/sys/vm/drop_caches 解释: drop_caches的值可以是0-3之间的数字,代表不同的含义: 0:不释放(系统默认值) 1: ...

  9. Java内存泄漏、性能优化、宕机死锁的N种姿势

    导读 本文介绍Java诸多优化实例:第一,排查堆上.堆外内存泄露:第二,使用arthas.jaeger.tcpdump.jstack做性能优化:第三,排查进程异常退出的原因,如被杀.System.ex ...

最新文章

  1. 让电脑通过gns3里的路由器上网
  2. Mysql INSERT、REPLACE、UPDATE的区别
  3. 数据绑定以及Container.DataItem绑定技巧
  4. mysql zookeeper 切换_zookeeper在mysql主库选举切换中的应用
  5. Hive的基本操作-内置函数
  6. 学习笔记-java编程-交通灯管理器设计流程。
  7. ASP.NET MVC 上传图片到项目目录中的文件夹并显示
  8. 长安渝北工厂机器人_长安工厂探秘!解密CS75 PLUS究竟是怎样造出来的
  9. Linux - Redis介绍以及安装 (简易版本)
  10. SpringMVC 解决中文乱码的过滤器
  11. 5年外包码农,拿到阿里offer,成功上岸,凭什么?
  12. 关于Andrdoid编程中出现BufferQueue的“queueBuffer: fence is NULL”的一种解决方案
  13. 每天一道剑指offer-调整数组顺序使奇数位于偶数前面
  14. 人工智能 —— 计算智能概述
  15. python傅里叶变换相位谱图_图像傅里叶变换的幅度谱、相位谱以及双谱重构原图像...
  16. c语言printf输出格式
  17. vcpkg: bootstrap-vcpkg.bat下载失败问题
  18. 场景管理:四叉树算法C++实现
  19. S3C22440 JTAG连接不上
  20. 美团买单与微信分付入局后,蚂蚁花呗和京东白条地位不保了?

热门文章

  1. 解除Windows系统网速限制
  2. MatLab中的fft变换(快速傅里叶变换)
  3. 小技能:校园网客户端屏保、息屏和合盖都可工作方法
  4. css div快捷键,div+css基础
  5. 电脑照片删除了怎么恢复回来
  6. MySQL 六.数据库锁
  7. 微信小程序 php 健身教练私教预约系统
  8. 全国各大城市地铁站数据(更新至2023-05)
  9. MPC5744-SIUL2
  10. 真实DOM操作和虚拟DOM操作的比较