linux硬盘IO优化相关资料整理

时间:2020-11-25 19:57:45

内核相关参数

相关内核参数,有条件的话可以修改参数测试验证一下。

1、/proc/sys/vm/dirty_ratio

这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。

增大参数会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但当需要持续、恒定的写入场合时,应该降低其数值:

echo '1' > /proc/sys/vm/dirty_ratio

对数据强一致性要求较高的系统,并且长期系统IO压力不大时,建议降低该值,可以理解为类似direct_io 。

2、/proc/sys/vm/dirty_background_ratio

这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存。

增大时会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但当需要持续、恒定的写入场合时,应该降低其数值:

echo '1' > /proc/sys/vm/dirty_background_ratio

dirty_ratio vs dirty_background_ratio通常系统会先达到dirty_background_ratio的条件然后触发flush进程进行异步的回写操作,但是这一过程中应用进程仍然可以进行写操作,如果多个应用进程写入的量大于flush进程刷出的量那就会达到dirty_ratio这个参数所设定的值,此时操作系统会 转入同步地处理脏页的过程,阻塞应用进程。

3、/proc/sys/vm/dirty_writeback_centisecs

该参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。设置方法如下:

echo "100" > /proc/sys/vm/dirty_writeback_centisecs

如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值:

echo "1000" > /proc/sys/vm/dirty_writeback_centisecs

4、/proc/sys/vm/dirty_expire_centisecs

该参数声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提交太快。

echo "100" > /proc/sys/vm/dirty_expire_centisecs

当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好。

5、/proc/sys/vm/vfs_cache_pressure

表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode  cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode  cache;增加该值超过100,将导致内核倾向于回收directory 和 inode  cache   缺省设置:100

6、 /proc/sys/vm/min_free_kbytes

该文件表示强制Linux   VM最低保留多少空闲内存(Kbytes)。

缺省设置:724(512M物理内存)

7、/proc/sys/vm/nr_pdflush_threads

该文件表示当前正在运行的pdflush进程数量,在I/O负载高的情况下,内核会自动增加更多的pdflush进程。   缺省设置:2(只读)

8、/proc/sys/vm/swapiness

该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。控制swappness 参数,尽量减少应用的内存被交换到交换分区中,默认是60。

I/O性能分析工具:

vmstat

iostat

I/O性能调优工具:sysctl

I/O调度器

一) I/O调度的4种算法

1) CFQ(Completely Fair Queuing, 完全公平排队)

在最新的内核版本和发行版中,都选择CFQ做为默认的I/O调度器,对于通用的服务器也是最好的选择。CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,是deadline和as调度器的折中。CFQ对于多媒体应用(video,audio)和桌面系统是最好的选择。

2) NOOP(电梯式调度程序)

NOOP实现了一个FIFO队列,它像电梯的工作主法一样对I/O请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质。NOOP对于闪存设备,RAM,嵌入式系统是最好的选择。

3) Deadline(截止时间调度程序)

Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象。Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择。

4) AS(预料I/O调度程序)

本质上与Deadline一样,但在最后一次读操作后,要等待6ms,才能继续进行对其它I/O请求进行调度。可以从应用程序中预订一个新的读请求,改进读操作的执行,但以一些写操作为代价。它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量。

AS适合于写入较多的环境,比如文件服务器。AS对数据库环境表现很差。

二) I/O调度方法的查看与设置

1) 查看当前系统的I/O调度

[root@test1 tmp]# cat /sys/block/sda/queue/scheduler

noop anticipatory deadline [cfq]

2) 临时更改I/O调度

例如:想更改到noop电梯调度算法:

echo noop > /sys/block/sda/queue/scheduler

3) 永久更改I/O调度

修改内核引导参数,加入elevator=调度程序名

[root@test1 tmp]# vi /boot/grub/menu.lst

更改到如下内容:

kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

重启之后,查看调度方法:

[root@test1 ~]# cat /sys/block/sda/queue/scheduler

noop anticipatory [deadline] cfq

文件系统基本属性

1.在对于上G的这种大文件做I/O时,各种通用文件系统间的性能差距较小,性能瓶颈

往往在磁盘上。小文件读写瓶颈是磁盘的寻址(tps),大文件读写的性能瓶颈是带宽。

如果文件系统中是一些比较大的文件的话,设置较大的块大小将得到较好的性能。

2、三种日志模式:

日志(Journal )
文件系统所有数据和元数据的改变都记入日志。这种模式减少了丢失每个文件所作修

改的机会,但是它需要很多额外的磁盘访问。这是最安全和最慢的日志模式。

预定(Ordered )
只有对文件系统元数据的改变才记入日志。是缺省的日志模式。

写回(Writeback )

不执行任何形式的数据日志记录。

3、Ext4

 Ext4对ext3主要作了两方面的优化:

 一是inode预分配。这使得inode具有很好的局部性特 征,同一目录文件inode尽量放在一起,加速了目录寻址与操作性能。因此在小文件应用方面也具有很好的性能表现。

 二是extent/delay/multi的数据块分配策 略。这些策略使得大文件的数据块保持连续存储在磁盘上,数据寻址次数大大减少,显著提高I/O吞吐量。

对于顺序大I/O读写,EXT4是较好的选择。ext4 支持最大 16 TB 的文件(假设由 4KB 的块组成)。