linux怎么停止写磁盘( 三 )


pdflush的第一件事是读取/proc/sys/vm/dirty_expire_centiseconds (default 3000)1/100秒 。缓存页里数据的过期时间(旧数据),在下一个周期内被写入硬盘 。
默认30秒是一个很长的时间 。第二件事是判断内存是否到了要写入硬盘的限额,由参数决定:/proc/sys/vm/dirty_background_ratio (default 10)百分值,保留过期页缓存(脏页缓存)的最大值 。
是以MmeFree+Cached-Mapped的值为基准的pdflush写入硬盘看两个参数:1 数据在页缓存中是否超出30秒,如果是,标记为脏页缓存;2 脏页缓存是否达到工作内存的10%;以下参数也会影响到pdflush/proc/sys/vm/dirty_ratio (default 40)总内存的最大百分比,系统所能拥有的最大脏页缓存的总量 。超过这个值,开启pdflush写入硬盘 。
如果cache增长快于pdflush,那么整个系统在40%的时候遇到I/O瓶颈,所有的I/O都要等待cache被pdflush进硬盘后才能重新开始 。对于有高度写入操作的系统dirty_background_ratio: 主要调整参数 。
如果需要把缓存持续的而不是一下子大量的写入硬盘,降低这个值 。dirty_ratio: 第二调整参数 。
Swapping参数/proc/sys/vm/swappiness默认,linux倾向于从物理内存映射到硬盘缓存,保持硬盘缓存尽可能大 。未用的页缓存会被放进swap区 。
数值为0,将会避免使用swapping100,将会尽量使用swapping少用swapping会增加程序的响应速度;多用swapping将会提高系统的可用性 。如果有大量的写操作,为避免I/O的长时间等待,可以设置:$ echo 5 > /proc/sys/vm/dirty_background_ratio$ echo 10 > /proc/sys/vm/dirty_ratio文件系统数据缓冲需要频繁的内存分配 。
加大保留内存的值能提升系统速度和稳定 。小于8G的内存,保留内存为64M,大于8G的设置为256M$ echo 65536 > /proc/sys/vm/min_free_kbytesI/O 调度器cat /sys/block/[disk]/queue/scheduler4中调度算法noop anticipatory deadline [cfq] deadline : deadline 算法保证对既定的IO请求以最小的延迟时间 。
anticipatory: 有个IO发生后,如果又有进程请求IO,则产生一个默认6ms猜测时间,猜测下一个进程请求IO是干什么 。这对于随机读取会造成较大的延时 。
对数据库应用很糟糕,而对于Web Server等则会表现不错 。cfq: 对每个进程维护一个IO队列,各个进程发来的IO请求会被cfq以轮循方式处理,对每一个IO请求都是公平 。
适合离散读的应用 。noop: 对所有IO请求都用FIFO队列形式处理 。
默认IO不会存在性能问题 。改变调度器$ echo deadline > /sys/block/sdX/queue/scheduler对于数据库服务器,deadline算法是推荐的 。
提高调度器请求队列的$ echo 4096 > /sys/block/sdX/queue/nr_requests有大量的读请求,默认的请求队列应付不过来,可以提高这个值 。缺点是要牺牲一定的内存 。
为了增加连续读取的吞吐量,可以增加预读数据量 。预读的实际值是自适应的,所以使用一个较高的值,不会降低小型随机存取的性能 。
$ echo 4096 > /sys/block/sdX/queue/read_ahead_kb如果LINUX判断一个进程在顺序读取文件,那么它会提前读取进程所需文件的数据,放在缓存中 。服务器遇到磁盘写活动高峰,导致请求处理延迟非常大(超过3秒) 。
通过调整内核参数,将写活动的高峰分布成频繁的多次写,每次写入的数据比较少 。这样可以把尖峰的写操作削平成多次写操作 。
以这种方式执行的效率比较低,因为内核不太有机会组合写操作 。但对于繁忙的服务器,写操作将更一致地进行,并将极大地改进交互式性能 。
/proc/sys/vm/dirty_ratio控制文件系统的写缓冲区的大小,单位是百分比,表示占系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据 。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能 。