[转帖]vm 缓存相关参数配置

vm,缓存,相关,参数,配置 · 浏览次数 : 0

小编点评

**脏数据相关参数:** **vm.dirty_background_ratio:** * 确定脏数据可以填充的最大比例。 * 当内存满时,该参数指定将哪些数据写入磁盘。 **vm.dirty_bytes:** * 指定脏数据可以填充的最大字节数。 * 该参数用于设置 vm.dirty_background_ratio。 **vm.dirty_expire_centisecs:** * 脏数据可以存活的最大时间(以秒为单位)。 * 当脏数据超过该时间时,会异步写入磁盘。 **vm.dirty_writeback_centisecs:** * 脏数据写入磁盘的延迟时间(以秒为单位)。 * 该参数用于控制脏数据写入磁盘的异步延迟。 **其他参数:** * **vm.dirty_ratio:** * 设置脏数据比例。 * 当内存使用率超过该比例时,将脏数据写入磁盘。 * **vm.dirty_background_ratio:** * 设置脏数据背景写入的比例。 * 当内存使用率超过该比例时,将脏数据写入磁盘。 * **vm.dirty_expire_centisecs:** * 设置脏数据可以存活的最大时间。 * **vm.dirty_writeback_centisecs:** * 设置脏数据写入磁盘的延迟时间。 **vm.swapiness:** * 控制换出运行时内存的相对权重。 * 值越大,表示越积极使用swap分区,越小表示越积极使用物理内存。 * 默认值为 60,表示内存使用率超过 100-60=40%时开始使用交换分区。 **注意:** * 调整这些参数可能会影响应用程序性能,因此需要根据实际需求进行调整。 * 对于 swap 和 dirty 数据相关参数的设置,建议参考相关博客或文档。

正文

https://www.cnblogs.com/JennyYu/p/16664523.html

 

一、脏数据相关参数:

文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。

当然,也存在缓存被写爆的情况。还可能出现一次性往磁盘写入过多数据,以致使系统卡顿。这些卡顿是因为系统认为,缓存太大用异步的方式来不及把它们都写进磁盘,于是切换到同步的方式写入。

这些都是可控制的选项,根据工作负载和数据,你可以决定如何设置它们:

$ sysctl -a | grep dirty
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.dirty_background_ratio 是内存可以填充脏数据的百分比。这些脏数据稍后会写入磁盘,pdflush/flush/kdmflush这些后台进程会稍后清理脏数据。

比如,我有32G内存,那么有3.2G的脏数据可以待着内存里,超过3.2G的话就会有后台进程来清理。

  • vm.dirty_ratio是可以用脏数据填充的绝对最大系统内存量,当系统到达此点时,必须将所有脏数据提交到磁盘,同时所有新的I/O块都会被阻塞,直到脏数据被写入磁盘。这通常是长I/O卡顿的原因,但这也是保证内存中不会存在过量脏数据的保护机制。
  • vm.dirty_background_bytesvm.dirty_bytes是另一种指定这些参数的方法。如果设置_bytes版本,则_ratio版本将变为0,反之亦然。
  • vm.dirty_expire_centisecs 指定脏数据能存活的时间。在这里它的值是30秒。当 pdflush/flush/kdmflush 在运行的时候,他们会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。毕竟数据在内存里待太久也会有丢失风险。
  • vm.dirty_writeback_centisecs 指定多长时间 pdflush/flush/kdmflush 这些进程会唤醒一次,然后检查是否有缓存需要清理。

可以通过下面方式看内存中有多少脏数据:一共有106页的脏数据

$ cat /proc/vmstat | egrep "dirty|writeback"
nr_dirty 106
nr_writeback 0
nr_writeback_temp 0
nr_dirty_threshold 3934012
nr_dirty_background_threshold 1964604

方法1:减少缓存

在很多情况下,我们有快速的磁盘子系统,它们有自己的大电池支持的NVRAM缓存,所以将东西保存在系统页面缓存中是有风险的。让我们尝试以更及时的方式向磁盘发送I/O,并减少本地操作系统(借用服务行业的话)“陷入困境”的机会。为了做到这一点,我们减小/etc/sysctl.confvm.dirty_background_ratiovm.dirty_ratio的数值,并执行sysctl -p命令:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

这是基于Linux的虚拟机管理程序的典型方法。不建议将这些参数设置为0,一些后台I/O可以很好地将应用程序性能与磁盘阵列在SAN(“峰值”)上的较短时间的较高延迟解耦。

方法2:增加缓存

在某些情况下,显著提高缓存对性能有积极的影响。在这些情况下,Linux客户机上包含的数据不是关键的,可能会丢失,而且应用程序通常会重复或以可重复的方式写入相同的文件。理论上,通过允许内存中存在更多脏页,你将在缓存中一遍又一遍地重写相同的块,只需要每隔一段时间向实际磁盘写一次。为此,我们提出了以下参数:

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80

有时候还会提高vm.dirty_expire_centisecs 这个参数的值,来允许脏数据更长时间地停留。除了增加数据丢失的风险之外,如果缓存已满并需要同步,还会有长时间I/O卡顿的风险,因为在大型虚拟机缓存中有大量数据。

方法3:增减都用

有时候系统需要应对突如其来的高峰数据,它可能会拖慢磁盘。比如说:每小时或者午夜进行批处理作业、在Raspberry Pi上写SD卡等等。这种情况下,我们可以允许大量的写I/O存储在缓存中,这样后台刷新操作就可以慢慢异步处理它:

vm.dirty_background_ratio = 5
vm.dirty_ratio = 80

这个时候,系统后台进程在脏数据达到5%时就开始异步清理,但在80%之前系统不会强制同步写磁盘。在此基础上,你只需要调整RAMvm.dirty_ratio大小以便能缓存所有的写数据。当然,磁盘上的数据一致性也存在一定风险。

 

二、vm.swapiness的设置:

内核参数vm.swappiness控制换出运行时内存的相对权重,参数值大小对如何使用swap分区有很大联系。值越大,表示越积极使用swap分区,越小表示越积极使用物理内存。默认值swappiness=60,表示内存使用率超过100-60=40%时开始使用交换分区。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间;swappiness=100的时候表示积极使用swap分区,并把内存上的数据及时搬运到swap空间。(网上有的说,对于3.5以后的内核和RedHat 2.6.32之后的内核,设置为0会禁止使用swap,从而引发out of memory,这种情况可以设置为1。)

需要根据服务器运行的程序类型,来设置不同的参数值。例如,对于Oracle一般设置为10;对于MySQL一般设置为1,尽可能不用swap分区。
调整vm.swappiness的方法:

1、查看参数值:

cat /proc/sys/vm/swappiness
2、临时调整:

sysctl vm.swappiness = 10
cat /proc/sys/vm/swappiness
3、永久调整:

vi /etc/sysctl.conf
修改vm.swappiness=10

然后加载参数:

sysctl -p

 

参考博文:
 修改Linux内核参数vm.swappiness_andyguan01_2的博客-CSDN博客_vm.swappiness

Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能_简单IoT的博客-CSDN博客_vm.dirty_background_ratio

与[转帖]vm 缓存相关参数配置相似的内容:

[转帖]vm 缓存相关参数配置

https://www.cnblogs.com/JennyYu/p/16664523.html 一、脏数据相关参数: 文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们

[转帖]vm内核参数之缓存回收drop_caches

注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.4 1、关于drop_caches 通常在内存不足时,我们习惯通过echo 3 > /proc/sys/vm/drop_caches 的方式手动清理系统缓存, [root@localhost ~]# free -m total

[转帖]Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能

文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。 当然,也存在缓存被写爆的

[转帖]vm overcommit参数

https://www.cnblogs.com/ExMan/p/11586756.html overcommit参数需要根据不同服务来进行调整,使内存得到充分利用的同时保证系统的稳定性。比如redis服务器建议把vm.overcommit_memory设置为1. 1、vm.overcommit_ra

[转帖]聊聊HotSpot VM的Native Memory Tracking

https://cloud.tencent.com/developer/article/1406522 序 本文主要研究一下HotSpot VM的Native Memory Tracking Native Memory Tracking java8给HotSpot VM引入了Native Memor

[转帖]linux中 vm.overcommit_memory 的含义

https://www.cnblogs.com/wshenjin/p/15500202.html vm.overcommit_memory 表示内核在分配内存时候做检查的方式。这个变量可以取到0,1,2三个值。对取不同的值时的处理方式都定义在内核源码 mm/mmap.c 的 __vm_enough_

[转帖]适用于 Azure VM 的 TCP/IP 性能优化

https://learn.microsoft.com/zh-cn/azure/virtual-network/virtual-network-tcpip-performance-tuning?context=%2Fazure%2Fvirtual-machines%2Fcontext%2Fconte

[转帖]谨慎调整内核参数:vm.min_free_kbytes

https://www.cnblogs.com/muahao/p/8082997.html 内核参数:内存相关 内存管理从三个层次管理内存,分别是node, zone ,page; 64位的x86物理机内存从高地址到低地址分为: Normal DMA32 DMA.随着地址降低。 [root@loca

[转帖]内存优化(开启内存大页vm.nr_hugepages)

大页内存(hugepages) 为优化内存管理引入了hugepages 可以自定义设置、将原来标准内存也4k设置为更大。 hugepages 优点: 使得Oracle SGA 不可交换; 减轻 TLB 的压力; 减少页表的开销; 减少页表查询的开销; 提升内存访问的整体性能; oracle建议设置h

[转帖]Linux修改文件句柄数及vm.max_map_count、stack size的大小

文章目录 一、修改文件句柄数`1.1.查看当前大小``1.2.临时修改``1.3.永久修改` 二、修改max user processes进程数`2.1.临时修改``2.1.永久修改` 三、调整vm.max_map_count的大小`报错“max virtual memory areas vm.ma