暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

1652.Linux挂载磁盘mount参数优化

原创 张鹏 2023-07-06
999

1652.Linux挂载磁盘mount参数优化
1、理解Linux文件属性的三种时间戳
Access Time:访问时间,表示最后一次访问文件,但是没有改动的时间
Mofidy Time:修改时间,表示最后一次对文件进行更改的时间
Change Time:改变时间,这个改变指的是对文件属性的更改,例如权限
通过下面几个操作理解一下上面的三种类型时间戳。
首先创建一个文件:
echo “Hello” > hello.txt
重看文件的时间戳信息:
通过stat命令可以查看文件或者文件系统的状态,只需简单的添加文件路径作为参数即可。
详细的用法可以通过man stat获取。
stat hello.txt
返回的信息如下:
File: ‘hello.txt’
Size: 6 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67148870 Links: 1
Access: (0644/-rw-r–r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-11-09 14:59:38.210119175 +0800
Modify: 2021-11-09 14:59:38.210119175 +0800
Change: 2021-11-09 14:59:38.210119175 +0800
Birth: -
还可以通过ls查看文件的时间,当我们使用ls -l命令列出当前目录下的文件的时候,通常也会带上文件的时间戳信息,这里显示的时间戳默认是文件的修改时间,如果想查看其他时间戳信息,通过–time=atime或–time=access参数查看访问文件时间,通过–time=ctime或–time=status查看文件改变时间。文件改变时间也可使用-u参数代替,这两种方式都需要和-l参数一起使用才有效果。
另外默认ls -l显示的日期格式是locale,可以通过参数–time-style=[full-iso|long-iso|iso]来查看iso格式的时间戳信息。甚至也可以自定义时间显示格式,此处不多做讲解,详情参阅man ls。
修改文件权限:
chmod 600 hello.txt
stat hello.txt

File: ‘hello.txt’
Size: 6 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67148870 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-11-09 14:59:38.210119175 +0800
Modify: 2021-11-09 14:59:38.210119175 +0800
Change: 2021-11-09 15:16:24.648565352 +0800
Birth: -
更改文件内容:
echo “World” >> hello.txt
stat hello.txt

File: ‘hello.txt’
Size: 12 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67148870 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-11-09 14:59:38.210119175 +0800
Modify: 2021-11-09 15:17:35.902615251 +0800
Change: 2021-11-09 15:17:35.902615251 +0800
Birth: -
查看文件内容:
cat hello.txt
stat hello.txt

File: ‘hello.txt’
Size: 12 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67148870 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-11-09 15:19:03.987204526 +0800
Modify: 2021-11-09 15:17:35.902615251 +0800
Change: 2021-11-09 15:17:35.902615251 +0800
Birth: -
结论如下:
仅读取文件时,Access会改变,Mofify和Change不会改变
改变文件权限时,Change会改变,Access和Modify不会改变
当修改文件内容时,Modify和Change会改变,但是Access不一定会改变
为什么说修改文件内容时,Access不一定会改变呢?
在上述的例子中,我们直接使用echo向文本中追加内容,并没有对文件进行访问操作,而如果你使用vi/vim编辑器来修改文件内容,你会发现Access也会改变,因为vi/vim会首先读取文件的内容。
2、磁盘挂载参数优化
为什么要花那么多的篇幅说明文件的时间戳属性呢?因为挂载的优化就是基于此的。
Linux支持非常多的文件系统,常见的日志文件系统有Ext2/Ext3/Ext4/XFS等,XFS是比较稳定的新型文件系统,比他更新的当然也有,但是稳定性欠佳,CentOS7便是直接使用XFS作为默认的文件系统了。
关于不同文件系统的比较参照ext与xfs文件系统比较与总结。
日志文件系统的特点是,在发生变化时,它先把相关的信息写入一个被称为日志的区域,然后再把变化写入主文件系统。这样的好处是当系统发生故障时,日志文件系统更容易保证一致性,并且可以较快恢复。这是优点也是缺点,因为有些信息是我们并不需要的,比如文件的访问时间,如果能禁用这些记录,在系统频繁访问文件时,就可以减少一些不必要的操作,便能显著的提高系统IO的效率。
所幸Linux提供了natime这个参数来禁止记录文件的访问时间戳信息,给文件系统加上这个参数可以显著提升20%-30%的IO吞吐效率。
可以通过修改/etc/fstab来达到修改文件系统的挂载参数的目的:

noatime,nodiratime
我们建议采用noatime选项,这样文件系统不记录access time,避免浪费资源。

nobarrier
现在的很多文件系统会在数据提交时强制底层设备刷新cache,避免数据丢失,称之为write barriers。
但是,其实我们数据库服务器底层存储设备要么采用RAID卡,RAID卡本身的电池可以掉电保护;要么采用Flash卡,它也有自我保护机制,保证数据不会丢失。所以我们可以安全的使用nobarrier挂载文件系统。

allocsize
设置缓冲I / O端的文件预分配的大小时,延迟分配写出时(默认大小为64KiB)。此选项的页面大小(通常4KiB)到1GiB,包括有效值,功率为2的增量。

logbufs
设置在内存中的日志缓冲区的数量。有效数字范围从2-8(含)。默认值是8个缓冲器

discard
discard 是 mount 命令的参数,在挂载文件系统时指定 discard 参数后,文件系统中删除文件后会自动触发 Trim/Discard 操作,通知块设备释放掉未使用的 Block 。

logbsize
每一个内存中的日志缓冲区的大小设置。可以指定大小(以字节为单位)(以千字节为单位),或用“K”后缀。

#ext4 mount时的参数:
defaults,noatime,nodiratime,nobarrier

#经过优化的xfs mount时的参数
defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8,attr2,logbsize=256k

#默认的xfs mount时的参数
defaults,noatime,nodiratime,nobarrier
修改完成后也不需要重新启动系统,可以通过重新挂载来生效,/代表的是挂载点。
mount -o remount /
如果你对性能比较感兴趣,可以使用fio命令测试修改前后的文件系统性能差异。
使用的测试命令示例如下:

顺序读

fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r

随机写

fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_randw

顺序写

fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_w

随机读写

fio -filename=/var/test.file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w -ioscheduler=noop
XFS 文件系统 mount 参数翻译
安装选项XFS:
allocsize =大小
设置缓冲I / O端的文件预分配的大小时,延迟分配写出时(默认大小为
64KiB)。此选项的页面大小(通常4KiB)到1GiB,包括有效值,功率为2的
增量。
attr2 | noattr2
该选项启用/禁用(默认为启用)“投机取巧”内联的方式作出改善,在
扩展属性存储在磁盘上。当新的形式是用于在第一时间(通过设置或删除
扩展属性)在磁盘上的超级块的功能位字段将被更新,以反映这种格式是在
使用。
barrier
允许使用的块写入到日志和不成文的程度转换层写屏障。这
允许驱动器的写缓存被启用,写屏障设备,支持。
dmapi
启用DMAPI(数据管理API)事件标注。使用的MTPT选项。
GRPID | | bsdgroups和nogrpid sysvgroups
这些选项定义的组ID新创建的文件得到。设置GRPID时,它需要的组ID
目录中创建它,否则(默认值)需要当前进程的fsgid,除非
目录有setgid位,在这种情况下,需要从父目录的GID,也得到了
setgid位,如果它本身是一个目录。
ihashsize =值
设置在内存中指定的挂载点的inode哈希散列桶的数量。如果
零值时,选择的值由默认的算法,将显示在/ proc /坐骑。
ikeep | noikeep
当空的inode,inode的集群让他们上的磁盘(ikeep) - 这是传统的XFS
行为,而现在仍然是默认的。使用noikeep选项,inode的集群被返回到空闲
空间池中。
inode64
指示,XFS允许创建的inode在文件系统中的任何位置,包括那些将
导致inode号,占地超过32位的意义。这是为了向后compatibil
性,而使得备份应用程序的问题,不能处理大的inode号。
largeio | nolargeio
如果nolargeio指定,最佳的I / O(2)由stat在st_blksize报道将尽可能小
允许用户应用程序,以避免低效率的读/修改/写I / O。如果指定了largeio,一个文件系统,
有一个指定的swidth st_blksize将返回swidth的值(以字节为单位)。如果文件系统不具有
swidth规定,但不指定allocsize,然后allocsize(以字节为单位)将改为返回。如果这两种
这两个选项,然后文件系统,如果nolargeio指定的行为。
logbufs =值
设置在内存中的日志缓冲区的数量。有效数字范围从2-8(含)。默认值是8个缓冲器
文件系统的块大小的64KiB,4个缓冲区的文件系统的块大小为32KiB,3个缓冲区
与其他所有配置的缓冲区的块大小为16KiB和2的文件系统。数的增加
在成本的额外日志缓冲区使用的内存的缓冲区可能会增加某些工作负载的性能
及其相关的控制结构。
logbsize =值
每一个内存中的日志缓冲区的大小设置。可以指定大小(以字节为单位)(以千字节为单位),或用“K”后缀。
版本1和版本2个数量级的有效大小为16384(16K)和32768(32K)。第2版的有效尺寸为记录
还包括65536(64K),131072(128K)和262144(256K)。机器的默认值超过32MiB
内存是32768,使用较少的内存的机器默认情况下,使用16384。
logdev =设备和rtdev的=设备
使用一个外部日志(元数据日志)和/或实时设备。XFS文件系统有三个部分:一个数据
部分,一个日志部,和一个实时截面。实时部分是可选的,日志部分可以是
分开的数据部分,或包含在它。请参阅xfs的(5)。
MTPT =挂载点
使用的DMAPI选项。此处指定的值将被纳入在DMAPI安装事件,应该是
路径]是使用实际的安装点。
noalign
数据分配不会在条带单元边界对齐。
noatime的
当一个文件被读取访问时间戳没有更新。
NORECOVERY
该文件系统将被安装没有运行日志恢复。如果没有干净地卸载文件系统,它是
安装在恢复模式时,可能是不一致的。可能无法访问某些文件或目录
因为这个原因。 NORECOVERY必须安装只读文件系统安装或安装会失败。
nouuid不检查双挂载的文件系统使用文件系统的UUID。这是非常有用的安装LVM快照卷
超极。
osyncisosync
O_SYNC写入实现真正的O_SYNC。没有这个选项,Linux的XFS的行为,如果是osyncisdsync选项
使用,这将使写道O_DSYNC标志,如果已使用O_SYNC标志打开的文件集的行为
代替。这可能会导致更好的性能,而不会影响数据的安全性。但是,如果这个选项是不
实际上,从O_SYNC写入的时间戳更新可能会丢失,如果系统崩溃。如果时间戳更新
关键,使用osyncisosync的选项。
uquota | usrquota | uqnoenforce |配额
启用用户磁盘配额记账,并实施限制(可选)。进一步的详细信息,请参阅xfs_quota(8)。
gquota | grpquota | gqnoenforce
集团启用磁盘配额记账和实施的限制(可选)。进一步的详细信息,请参阅xfs_quota(8)。 pquota | prjquota | pqnoenforce
项目磁盘配额会计启用和限制(可选)执行。请参阅xfs_quota(8)进一步
详细信息。
sunit=值和swidth的=值
用于指定一个RAID设备或带卷的条带单元和宽度。值,必须指定
512字节的块为单位。如果这个选项没有被指定,条带化卷或文件系统
条纹宽度或单位被指定为RAID设备mkfs的时间,然后在mount系统调用将恢复
从超级值。对于文件系统,直接在RAID设备,这些选项可以用来
如果基础磁盘布局更改后的文件系统的超级块已经覆盖信息
创建。 swidth选项是必需的,如果SUnit的选项已被指定,并且必须是的倍数
sunit值。
swalloc
数据分配将向上舍入到条纹宽度范围正在扩大的当前结尾的文件时,
文件的大小是大于条的宽度的大小。

1653.Linux性能优化之磁盘优化
前言
关于本章内容,设计的东西比较多。这里会有关于文件系统、磁盘、CPU等方面的知识,以及涉及到关于这方面的性能排查等。
术语
文件系统通过缓存和缓冲以及异步I/O等手段来缓和磁盘的延时对应用程序的影响。为了更详细的了解文件系统,以下就简单介绍一些
文件系统相关术语:
文件系统:一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问。另外,一些表示设备、套接字和管道的特殊文件类型,以及包含文件访问时间戳的元数据。
文件系统缓存:主存(通常是DRAM) 的一块区域,用来缓存文件系统的内容,可能包含各种数据和元数据。
操作:文件系统的操作是对文件系统的请求,包括读、写、打开、关闭、创建以及其他操作。
I/O:输入/输出。文件系统I/O有多种定义,这里仅指直接读写(执行I/O)的操作,包括读、写、状态统计、创建。I/O不包括打开文件和关闭文件。
逻辑I/O:由应用程序发给文件系统的I/O。
物理I/O:由文件系统直接发给磁盘的I/O。
吞吐量:当前应用程序和文件系统之间的数据传输率,单位是B/S。
inode:一个索引节点时一种含有文件系统对象元数据的数据结构,其中有访问权限、时间戳以及数据指针。
VFS:虚拟文件系统,一个为了抽象与支持不同文件系统类型的内核接口。
磁盘相关术语:
存储设备的模拟。在系统看来,这是一块物理磁盘,但是,它可能由多块磁盘组成。
传输总线:用来通信的物理总线,包括数据传输以及其他磁盘命令。
扇区:磁盘上的一个存储块,通常是512B的大小。
I/O:对于磁盘,严格地说仅仅指读、写,而不包括其他磁盘命令。I/O至少由方向(读或写)、磁盘地址(位置)和大小(字节数)组成。
磁盘命令:除了读写之外,磁盘还会被指派执行其他非数据传输的命令(例如缓存写回)。
带宽:存储传输或者控制器能够达到的最大数据传输速率。
I/O延时:一个I/O操作的执行时间,这个词在操作系统领域广泛使用,早已超出了设备层。
相关概念
文件系统延时
文件系统延时是文件系统性能一项主要的指标,指的是一个文件系统逻辑请求从开始到结束的时间。它包括消耗在文件系统、内核磁盘I/O子系统以及等待磁盘设备——物理I/O的时间。应用程序的线程通常在请求时阻塞,等地文件系统请求的结束。这种情况下,文件系统的延时与应用程序的性能直接和成正比关系。在某些情况下,应用程序并不受文件系统的直接影响,例如非阻塞I/O或者I/O由一个异步线程发起。
缓存
文件系统启动之后会使用主存(RAM)当缓存以提供性能。缓存大小随时间增长而操作系统的空余内存不断减小,当应用程序需要更多内存时,内核应该迅速从文件系统缓存中释放一些内存空间。文件系统用缓存(caching)提高读性能,而用缓冲(buffering)提高写性能。文件系统和块设备子系统一般使用多种类型的缓存。
随机I/O与顺序I/O
一连串的文件系统逻辑I/O,按照每个I/O的文件偏移量,可以分为随机I/O与顺序I/O。顺序I/O里每个I/O都开始于上一个I/O结束的地址。随机I/O则找不出I/O之间的关系,偏移量随机变化。随机的文件系统负载也包括存取随机的文件。由于存储设备的某些性能特征的缘故,文件系统一直以来在磁盘上顺序和连续的存放文件数据,以努力减小随机I/O的数目。当文件系统未能达到这个目标时,文件的摆放变得杂乱无章,顺序的逻辑I/O被分解成随机的物理I/O,这种情况被称为碎片化。
提示:关于文件系统更多内容,还请自行查阅相关理论。比如你还需要了解文件系统的预读、预取、写回缓存、同步写、裸I/O、直接I/O、内存映射文件、元数据等相关知识。
性能分析
具备背景知识是分析性能问题时需要了解的。比如硬件 cache;再比如操作系统内核。应用程序的行为细节往往是和这些东西互相牵扯的,这些底层的东西会以意想不到的方式影响应用程序的性能,比如某些程序无法充分利用 cache,从而导致性能下降。比如不必要地调用过多的系统调用,造成频繁的内核 / 用户切换等。如果想深入了解Linux系统,建议购买相关书籍进行系统的学习。下面我们介绍如何分析磁盘性能工具(其实准确来说,不只是磁盘):
iostat
汇总了单个磁盘的统计信息,为磁盘负载、使用率和饱和度提供了指标。默认显示一行系统总结信息,包括内核版本、主机名、日志、架构和CPU数量等,每个磁盘设备都占一行。
[root@localhost ~]# iostat

Linux 3.10.0-514.el7.x86_64 2017年09月18日 x86_64 (1 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
0.74 0.00 1.24 1.35 0.00 96.67
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 14.43 456.85 60.82 218580 29098
scd0 0.02 0.09 0.00 44 0
dm-0 13.65 404.58 56.50 193571 27030
dm-1 0.27 2.23 0.00 1068 0

参数说明
tps: 每秒事物数(IOPS)。
kB_read/s、kB_wrtn/s: 每秒读取KB数和每秒写入KB数。
kB_read、kB_wrtn: 总共读取和写入的KB数。
如下想输出更详细的内容,可以试试下面这个命令组合:
[root@localhost ~]# iostat -xkdz 1

Linux 3.10.0-514.el7.x86_64 (localhost.localdomain) 2017年09月18日 x86_64 (1 CPU)

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util

sda 0.01 2.43 13.81 2.32 510.51 67.96 71.74 0.22 13.94 8.72 44.95 2.37 3.82

scd0 0.00 0.00 0.03 0.00 0.10 0.00 8.00 0.00 0.27 0.27 0.00 0.27 0.00

dm-0 0.00 0.00 10.52 4.73 452.10 63.13 67.56 0.44 28.56 10.41 68.93 2.47 3.76

dm-1 0.00 0.00 0.30 0.00 2.49 0.00 16.69 0.00 1.50 1.50 0.00 1.38 0.04

参数说明
rrqm/s:每秒合并放入驱动请求队列的读请求数(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)。
wrqm/s:每秒合并放入驱动请求队列的写请求数。
rsec/s:每秒发给磁盘设备的读请求数。
wsec/:每秒发给磁盘设备的写请求数。
rKB/s:每秒从磁盘设备读取的KB数。
wKB/s:每秒向磁盘设备写入的KB数。
avgrq-sz 平均每次请求大小,单位为扇区(512B)。
avgqu-sz 在驱动请求队列和在设备中活跃的平均请求数。值大代表有等待队列
await: 平均I/O响应时间,包括在驱动请求队列里等待和设备的I/O响应时间(ms)。一般地系统I/O响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm:磁盘设备的I/O平均响应时间(ms)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长系统上运行的应用程序将变慢。
%util: 设备忙处理I/O请求的百分比(使用率)。在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
既然avgrq-sz是合并之后的数字,小尺寸(16个扇区或者更小)可以视为无法合并的实际I/O负载的迹象。大尺寸有可能是大I/O,或者是合并的连续负载。输出性能里最重要的指标是await。如果应用程序和文件系统使用了降低写延时的方法,w_await可能不那么重要,而更应该关注r_await。
对于资源使用和容量规划,%util仍然很重要,不过记住这只是繁忙度的一个度量(非空闲时间),对于后面有多块磁盘支持的
虚拟设备意义不大。可以通过施加负载更好地了解这些设备:IOPS(r/s + w/s)以及吞吐量(rkB/s + wkB/s)。
iotop
包含磁盘I/O的top工具。
批量模式(-b)可以提供滚动输出。下面的演示仅仅显示I/O进程(-o),每5秒输出一次(-d5):
[root@localhost ~]# iotop -bod5
Total DISK READ : 0.00 B/s | Total DISK WRITE : 8.76 K/s

Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 24.49 K/s

TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND

21203 be/3 root 0.00 B/s 815.58 B/s 0.00 % 0.01 % [jbd2/dm-2-8]

22069 be/3 root 0.00 B/s 0.00 B/s 0.00 % 0.01 % [jbd2/dm-1-8]

1531 be/0 root 0.00 B/s 6.37 K/s 0.00 % 0.01 % [loop0]

3142 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.01 % [kworker/7:0]

21246 be/4 root 0.00 B/s 1631.15 B/s 0.00 % 0.00 % java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

提示:
输出显示java进程正在以大约1631.15 B/s的速率施加磁盘写负载。其他有用的选项有-a,可以输出累计I/O而不是一段时间内的平均值,选项-o,只打印那些正在执行的磁盘I/O的进程。
当然显示磁盘的命令还有例如sar、iosnoop、perf、blktrace等命令,这里只列举常用命令即可。

性能调优文件系统优化
关于文件系统优化,并没有太多的内容需要说明。就目前的情况,Redhat Enterprise 7系列默认更换为性能更好的XFS,这也是由于XFS在性能表现确实很好的原因。在我们使用的过程中,建议对XFS做一些简单的优化即可,比如执行格式化时指定额外的一些参数,挂载该分区时指定一些额外的挂载参数,这些都能够提高文件系统的相关性能。
格式化时的参数:
mkfs.xfs -d agcount=256 -l size=128m,lazy-count=1,version=2 /dev/diska1
mount时的参数:
defaults,noatime,nodiratime,nobarrier,discard,allocsize=256m,logbufs=8,attr2,logbsize=256k

磁盘相关优化
操作系统可调参数
包括ionice、资源控制和内核可调参数。

ionice
Linux中的ionice命令可以设置一个进程I/O调度级别和优先级。调度级别为整数,0表示无,不指定级别,内核会挑选一个默认值,优先级根据进程nice值选定;1表示实时,对磁盘的最高级别访问,如果误用会导致其他进程饿死;2表示尽力,默认调度级别,包括优先级 0~7,0为最高级;3表示空闲,在一段磁盘空闲的期限过后才允许进行I/O。如下:
ionice -c 3 -p 65552

cgroup
通过cgroup为进程或进程组提供存储设备资源控制机制。一般很少用到,不用考虑。

可调参数
/sys/block/sda/queue/scheduler:选择I/O调度器策略,是空操作、最后期限、an还是cfq;

磁盘设备可调参数
Linux上的hdparm(磁盘测试工具)工具可以设置多种磁盘设备的可调参数。

磁盘控制器可调参数
由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍适用性。然而在特定应用下,这种配置往往在I/O性能方面不能达到最优。因此,如果应用对I/O性能要求较高,除了采用性能更高的硬件(如磁盘、HBA卡、CPU、MEM等)外,我们还可以通过对文件系统进行性能调优,来获得更高的I/O性能提升。总的来说,主要可以从三个方面来做工作:
1、Disk相关参数调优
2、文件系统本身参数调优
3、文件系统挂载(mount)参数调优
当然,负载情况不同,需要结合理论分析与充分的测试和实验来得到合理的参数。下面以SAS(Serial attached SCSI)磁盘上的EXT3文件系统为例,给出Linux文件系统性能优化的一般方法。请根据自身情况作适合调整,不要生搬硬套。
1、Disk相关参数
1.1 Cache mode:启用WCE=1(Write Cache Enable), RCD=0(Read Cache Disable)模式
sdparm -s WCE=1, RCD=0 -S /dev/sdb
1.2 Linux I/O scheduler算法
经过实验,在重负载情形下,deadline调度方式对squid I/O负载具有更好的性能表现。其他三种为noop(fifo), as, cfq,noop多用于SAN/RAID存储系统,as多用于大文件顺序读写,
cfq适于桌面应用。SSD 一般设置为noop
echo deadline > /sys/block/sdb/queue/scheduler
1.3 deadline调度参数
对于redhat linux建议 read_expire = 1/2 write_expire,对于大量频繁的小文件I/O负载,应当这两者取较小值。更合适的值,需要通过实验测试得到。
echo 500 > /sys/block/sdb/queue/iosched/read_expire
echo 1000 > /sys/block/sdb/queue/iosched/write_expire
1.4 readahead 预读扇区数
预读是提高磁盘性能的有效手段,目前对顺序读比较有效,主要利用数据的局部性特点。比如在我的系统上,通过实验设置通读256块扇区性能较优。
blockdev --setra 256 /dev/sdb
2、EXT3文件系统参数
2.1 block size = 4096 (4KB)
mkfs.ext3 -b指定,大的数据块会浪费一定空间,但会提升I/O性能。EXT3文件系统块大小可以为1KB、2KB、4KB。
2.2 inode size
这是一个逻辑概念,即一个inode所对应的文件相应占用多大物理空间。mkfs.ext3 -i指定,可用文件系统文件大小平均值来设定,可减少磁盘寻址和元数据操作时间。
2.3 reserved block
mkfs.ext3 -m指定,缺省为5%,可调小该值以增大部分可用存储空间。
2.4 disable journal
对数据安全要求不高的应用(如web cache),可以关闭日志功能,以提高I/O性能。
tune2fs -O^has_journal /dev/sdb
3、mount参数
3.1 noatime, nodirtime
访问文件目录,不修改访问文件元信息,对于频繁的小文件负载,可以有效提高性能。
3.2 async
异步I/O方式,提高写性能。
3.3 data=writeback (if journal)
日志模式下,启用写回机制,可提高写性能。数据写入顺序不再保护,可能会造成文件系统数据不一致性,重要数据应用慎用。
3.4 barrier=0 (if journal)
barrier=1,可以保证文件系统在日志数据写入磁盘之后才写commit记录,但影响性能。重要数据应用慎用,有可能造成数据损坏。
小结
以/dev/sdb为例,优化操作方法如下,参数请自行调整。
sdparm -s WCE=1, RCD=0 -S /dev/sdb
echo deadline > /sys/block/sdb/queue/scheduler
echo 500 > /sys/block/sdb/queue/iosched/read_expire
echo 1000 > /sys/block/sdb/queue/iosched/write_expire
blockdev --setra 256 /dev/sdb
mkfs.ext3 -b 4096 -i 16384 -m 2 /dev/sdb1
tune2fs -O^has_journal /dev/sdb1
mount /dev/sdb1 /cache1 -o defaults,noatime,nodirtime,async,data=writeback,barrier=0 (if with journal)
mount /dev/sdb1 /cache1 -o defaults,noatime,nodirtime,async (if without journal)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论