wappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体如下:

[root@timeserver ~]# cat /proc/sys/vm/swappiness
60

你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用,内存的速度会比磁盘快很多,这样会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。

临时调整的方法如下,我们调成10:
[root@timeserver ~]# sysctl vm.swappiness=10
vm.swappiness = 10
[root@timeserver ~]# cat /proc/sys/vm/swappiness
10

需要在/etc/sysctl.conf修改,加上:
[root@timeserver ~]# cat /etc/sysctl.conf

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
vm.swappiness=10

重新加载

[root@localhot~]# sysctl -p

在linux中,可以通过修改swappiness内核参数,降低系统对swap的使用,从而提高系统的性能。

在调优数据库 和应用 性能的过程中需要降低操作系统文件Cache对数据库性能的影响,故调研了一些降低文件系统缓存大小的方法,其中一种是通过修改/proc/sys/vm/dirty_background_ration以及/proc/sys/vm/dirty_ratio两个参数的大小来实现。看了不少相关博文的介绍,不过一直弄不清楚这两个参数的区别在哪里,后来看了下面的一篇英文博客才大致了解了它们的不同。

vm.dirty_background_ratio:这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存;
 
vm.dirty_ratio:而这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。
 
之前一直错误的一位dirty_ratio的触发条件不可能达到,因为每次肯定会先达到vm.dirty_background_ratio的条件,后来才知道自己理解错了。确实是先达到vm.dirty_background_ratio的条件然后触发flush进程进行异步的回写操作,但是这一过程中应用进程仍然可以进行写操作,如果多个应用进程写入的量大于flush进程刷出的量那自然会达到vm.dirty_ratio这个参数所设定的坎,此时操作系统会转入同步地处理脏页的过程,阻塞应用进程
 
 
 

关于vm.swappiness 参数设定, 文件缓存是一项重要的性能改进,在大多数情况下,读缓存是一个明显的胜利,与使用RAM的应用程序直接平衡。写缓存比较棘手。Linux内核将磁盘写入缓存,并随着时间的推移异步将它们刷新到磁盘。这对加速磁盘I / O有很好的效果,但风险很大。当数据未写入磁盘时,丢失数据的可能性会增加。

也有很多I / O也有可能压倒缓存。曾经一次将大量数据写入磁盘,并且在尝试处理所有数据时看到系统出现大量暂停?这些暂停是缓存决定异步写入太多数据的结果(作为非阻塞后台操作,让应用程序进程继续),并切换到同步写入(阻塞并使进程等到I / O致力于磁盘)。当然,文件系统也必须保留写入顺序,因此当它开始同步写入时,它首先必须降级缓存。因此长时间停顿。

好处是这些是可控制的选项,根据您的工作负载和数据,您可以决定如何设置它们。让我们来看看:

$ sysctl -a | grep dirty 
vm.dirty_background_ratio =
vm.dirty_background_bytes =
vm.dirty_ratio =
vm.dirty_bytes =
vm.dirty_writeback_centisecs =
vm.dirty_expire_centisecs =

vm.dirty_background_ratio
 是可以填充“脏”页面的系统内存的百分比 - 仍然需要写入磁盘的内存页 - 在pdflush / flush / kdmflush后台进程启动以将其写入磁盘之前。我的例子是10%,所以如果虚拟服务器有32 GB的内存,那么3.2 GB的数据可以在完成任务之前就位于RAM中。

vm.dirty_ratio 是在必须将所有内容提交到磁盘之前可以用脏页填充的绝对最大系统内存量。当系统到达此点时,所有新的I / O块都会被阻塞,直到脏页被写入磁盘。这通常是长I / O暂停的来源,但是可以防止太多数据在内存中被不安全地缓存。

vm.dirty_background_bytes 和  vm.dirty_bytes 是另一种指定这些参数的方法。如果设置_bytes版本,则_ratio版本将变为0,反之亦然。

vm.dirty_expire_centisecs 是在需要写入之前缓存中的某些内容。在这种情况下,它是30秒。当pdflush / flush / kdmflush进程启动时,他们将检查脏页的年龄,如果它比这个值旧,它将被异步写入磁盘。由于在内存中保存脏页不安全,因此也可以防止数据丢失。

vm.dirty_writeback_centisecs 是pdflush / flush / kdmflush进程唤醒的频率,并检查是否需要完成工作。

您还可以在/ proc / vmstat中查看页面缓存的统计信息:

$ cat /proc/vmstat | egrep "dirty|writeback" 
nr_dirty
nr_writeback
nr_writeback_temp

在我的情况下,我有878个脏页等待写入磁盘。

方法1:减少缓存

与计算机世界中的大多数事情一样,您如何调整这些取决于您要做的事情。在许多情况下,我们的快速磁盘子系统都有自己的大电池备份NVRAM缓存,因此保留OS页面缓存中的内容是有风险的。让我们尝试以更及时的方式将I / O发送到阵列,并减少我们本地操作系统的机会,借用服务行业中的短语,“ 在杂草中”。为此,我们降低vm.dirty_background_ratio和vm .dirty_ratio通过向/etc/sysctl.conf添加新数字并使用“sysctl -p”重新加载:

vm.dirty_background_ratio =  
vm.dirty_ratio =

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

方法2:增加缓存

有些情况下,提高缓存会对性能产生积极影响。这些情况是Linux guest虚拟机中包含的数据并不重要且可能丢失的情况,通常是应用程序反复写入或以可重复的突发形式写入相同文件的情况。理论上,通过允许更多脏页存在于内存中,您将在缓存中反复重写相同的块,并且只需要经常对实际磁盘进行一次写入。为此,我们提出参数:

vm.dirty_background_ratio =  
vm.dirty_ratio =

有时人们也会增加vm.dirty_expire_centisecs参数以允许更多时间在缓存中。除了数据丢失风险增加之外,如果缓存已满并且需要降级,您还会面临长时间I / O暂停的风险,因为在大型VM上,缓存中会有大量数据。

方法3:两种方式

还有一些情况下,系统必须处理不频繁的突发流量以减慢磁盘(一小时之前的批处理作业,午夜,写入Raspberry Pi上的SD卡等)。在这种情况下,一种方法可能是允许所有写入I / O都存放在缓存中,以便后台刷新操作可以随时间异步处理它:

vm.dirty_background_ratio =  
vm.dirty_ratio =

这里后台进程将在达到5%上限时立即开始写入,但系统不会强制同步I / O直到达到80%满。从那里你可以调整系统RAM和vm.dirty_ratio的大小,以便能够使用所有写入的数据。同样,在磁盘上存在数据一致性的权衡,这转化为数据风险。购买UPS并确保在UPS电量耗尽之前可以降级缓存。:)

dirty_background_ration 与 /proc/sys/vm/dirty_ratio的更多相关文章

  1. /proc/sys/vm/参数

    1) /proc/sys/vm/block_dump该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作.缺省设置:0,禁用Block Debug模式2) ...

  2. /proc/sys/vm/ 内存参数

    linux下proc里关于磁盘性能的参数 http://blog.csdn.net/eroswang/article/details/6126646  我们在磁盘写操作持续繁忙的服务器上曾经碰到一个特 ...

  3. linux /proc/sys/vm/中各个文件含义

    1)      /proc/sys/vm/block_dump该文件表示是否打开Block Debug模式,用于记录所有的读写及Dirty Block写回动作. 缺省设置:0,禁用Block Debu ...

  4. Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches

    Linux下清理内存和Cache方法 /proc/sys/vm/drop_caches 频繁的文件访问会导致系统的Cache使用量大增 $ free -m total used free shared ...

  5. /proc/sys/vm man手册

    Manual page proc(5) line 1967 (press h for help or q to quit) /proc/sys/vm This directory contains f ...

  6. linux内存——/proc/sys/vm/drop_caches

      原贴:http://www.linuxfly.org/post/320/ http://blog.csdn.net/chinalinuxzend/article/category/265273/2 ...

  7. 手工释放linux内存——/proc/sys/vm/drop_caches

    --手工释放linux内存——/proc/sys/vm/drop_caches 总有很多朋友对于Linux的内存管理有疑问,之前一篇日志似乎也没能清除大家的疑虑.而在新版核心中,似乎对这个问题提供了新 ...

  8. (转)手工释放linux内存——/proc/sys/vm/drop_cache

    linux的内存查看: [root@localhost 0.1.0]# free -m                   total       used       free     shared ...

  9. /proc/sys/vm/drop_caches 清理缓存

    1. 使用方法 /proc/sys/vm/drop_caches默认是0 # echo 1 > /proc/sys/vm/drop_caches; free pagecache, use# ec ...

随机推荐

  1. 数据库部分(MySql)_1

    SQL规范 以 “ ; ” 结尾:关键字之间要有空格(可以由多个空格):SQL语句中可以一个或多个换行:关键字不区分大小写. 数据库相关SQL 查询所有数库库: show databases; 创建数 ...

  2. c# API接受图片文件以文件格式上传图片

    /// 文件图片上传 /// </summary> /// <returns>成功上传返回上传后的文件名</returns> [HttpPost] public a ...

  3. WebFrom 小程序【条件查询】

    实现按照各种条件对数据库进行综合查询 基本功能:可以根据用户需要灵活查询 重难点:各种条件的可能.限制. public List<users> selectA( string str,Ha ...

  4. 安装Java语言的jdk,配置java环境变量

    一.windows 安装jdk win7 下载jdk: 地址   https://www.oracle.com/technetwork/java/javase/downloads/index.html ...

  5. C#中的out、ref、params详解

    out参数: 如果你在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组.但是,如果返回多个不同类型的值的时候,返回数组就不行了,那么这个时候,我们可以考虑使用out参数.out参数就侧重于 ...

  6. [工作总结]jQuery在工作开发中常用代码片段集锦(1-10)

    1.jQuery,JS实现tab切换 原生JS实现 HTML代码如下: <div class="wrap"> <ul id="tag"> ...

  7. 【代码笔记】Web-ionic-toggle(切换开关)

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  8. Docker简单使用

    镜像是一种轻量级.可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 容器是镜像的运行时实例 - 实际执行时镜像会在内存中变成什么.默认情况下,它完全独立 ...

  9. C# 6 元组应用 Part 2:C# 也玩模式匹配

    C# 7给我们带来了一个半吊子的 switch 语句模式匹配,只能简单的匹配类型而已,完全没有什么用处.这里我提供个更好的简单实现,用 C# 6 的 ValueTuple 模拟函数式语言的模式匹配功能 ...

  10. (后端)excel设置日期格式的步骤

    在excel中设置日期格式,分直接设置和代码设置. 一.直接设置: 选取日期所在的单元格,单元格右键菜单中--设置单元格格式.在单元格格式窗口中选数字类型为“日期”在右边的列表框中选取相应的日期格式即 ...