我们讨论了Linux客户机上的内存如何用于操作系统本身(内核、缓冲区等)、应用程序和文件缓存。文件缓存是一项重要的性能改进,而读取缓存在大多数情况下明显胜出,与直接使用RAM的应用程序相平衡。写缓存比较棘手。Linux内核将磁盘写入缓存并随着时间的推移将它们异步刷新到磁盘。这对加速磁盘I/O有很好的效果,但也有风险。当数据未写入磁盘时,丢失数据的机会增加。也有可能大量I/O也会使缓存不堪重负。是否曾一次将大量数据写入磁盘并在尝试处理所有数据时看到系统出现大量暂停?这些暂停是缓存决定它有太多数据要异步写入(作为非阻塞后台操作,让应用程序进程继续)并切换到同步写入(阻塞并使进程等待I/O致力于磁盘)。当然,文件系统还必须保持写入顺序,所以当它开始同步写入时,它首先必须转储缓存。因此长时间的停顿。好消息是这些都是可控的选项,您可以根据您的工作量和数据来决定如何设置它们。让我们来看看:$sysctl-a|grepdirtyvm.dirty_background_ratio=10vm.dirty_background_bytes=0vm.dirty_ratio=20vm.dirty_bytes=0vm.dirty_writeback_centisecs=500vm.dirty_expire_centisecs=3000inpdfback可用内存和缓存总和的百分比可以用“脏”填充在flush/kdmflush后台进程开始将它们写入磁盘之前的页面(仍然需要写入磁盘的内存页面)。我的例子是10%,所以如果我的虚拟服务器有32GB的内存,那么在完成某些事情之前,有3.2GB的数据可以驻留在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进程启动时,它们会检查脏页的age,如果比这个值旧,就会异步写入磁盘。由于将脏页保留在内存中是不安全的,因此这也是防止数据丢失的一种保护措施。vm.dirty_writeback_centisecs是pdflush/flush/kdmflush进程唤醒并检查是否需要完成工作的频率。您还可以在/proc/vmstat中查看有关页面缓存的统计信息:$cat/proc/vmstat|egrep"dirty|writeback"nr_dirty878nr_writeback0nr_writeback_temp0在我的例子中,我有878个脏页等待写入磁盘。方法1:减少缓存与计算机世界中的大多数事物一样,如何调整它们取决于您要做什么。在许多情况下,我们有快速磁盘子系统,它们有自己的大型电池后备NVRAM缓存,因此将内容保存在操作系统页面缓存中是有风险的。让我们尝试更及时地将I/O发送到阵列,并减少我们的本地操作系统(借用服务行业的一句话)“陷入困境”的机会。为此,我们通过向/etc/sysctl.conf添加新数字并使用“sysctl–p”重新加载来降低vm.dirty_background_ratio和vm.dirty_ratio:vm.dirty_background_ratio=5vm.dirty_ratio=10这是一个虚拟机和一个Linux基于管理程序的典型方法。我不建议将这些参数设置为零,因为一些后台I/O可以将应用程序性能与磁盘阵列和SAN上的短时间高延迟(“尖峰”)分离开来。方法2:增加缓存在某些情况下,显着增加缓存会对性能产生积极影响。在这些情况下,Linux来宾中包含的数据并不重要并且可能会丢失,并且通常是应用程序重复或以可重复的突发方式写入同一文件。理论上,通过允许更多的脏页存在于内存中,您将在缓存中一遍又一遍地重写相同的块,并且每隔一段时间只需要对实际磁盘进行一次写入。为此,我们增加了参数:vm.dirty_background_ratio=50vm.dirty_ratio=80有时人们也增加了vm.dirty_expire_centisecs参数以允许缓存有更多时间。除了增加数据丢失的风险外,如果缓存已满并需要转储,还存在长时间I/O暂停的风险,因为在大型VM上,缓存中会有大量数据。方法3:双向在某些情况下,系统必须处理不频繁的突发流量到慢速磁盘(整点、午夜、写入RaspberryPi上的SD卡等的批处理作业)。在这种情况下,一种方法可能是允许缓存所有写入I/O,以便后台刷新操作可以随着时间的推移异步处理它:vm.dirty_background_ratio=5vm.dirty_ratio=80这里,后台进程将尽快开始写入当它达到5%的上限时,但系统不会强制同步I/O,直到它达到80%满。从那里,您只需调整系统RAM的大小,vm.dirty_ratio就可以消耗所有写入的数据。同样,磁盘上的数据一致性需要权衡,这会转化为数据风险。购买UPS并确保您可以在UPS断电之前转储缓存。:)无论您选择哪条路线,您都应该始终收集硬数据来支持您的更改,并帮助您确定您是在改进还是让事情变得更糟。在这种情况下,您可以从许多不同的地方获取数据,包括应用程序本身、/proc/vmstat、/proc/meminfo、iostat、vmstat以及/proc/sys/vm中的许多东西。可见,这种脏页配置也是一门艺术,需要根据实际情况进行调整。注意vm.dirty_background_ratio配置的比例是缓存与空闲内存的比例,vm.dirty_ratio是总内存的比例。
