一 机械磁盘的io的速度首要受“寻道速度”的约束,所以在拜访小文件时io功用会极差。假如不在乎本钱,能够经过运用固态硬盘来处理这个问题。
二 linux的干流文件体系(如ext4等),在文件体系继续比较满,且需求常常修改文件时,会发生许多文件碎片。在我开发的一款署理服务器中,磁盘长时间满负荷工作,工作一个月后文件碎片大约会让io功用下降至只剩20%-30%
这一期咱们来看一下有哪些方法能够削减linux下的文件碎片。首要是针对磁盘长时间满负荷工作的运用场景(例如http署理服务器);别的有一个小技巧,针对互联网图片服务器,能够将io功用提高数倍。
假如为服务器订制一个专用文件体系,能够彻底处理文件碎片的问题,将磁盘io的功用发挥至极限。关于咱们的署理服务器,相当于把io功用提高到3-5倍。
在现有文件体系下进行优化
linux内核和各个文件体系选用了几个优化计划来提高磁盘拜访速度。但这些优化计划需求在咱们的服务器规划中进行合作才干得到充分发挥。
文件体系缓存
linux内核会将大部分闲暇内存交给虚拟文件体系,来作为文件缓存,叫做page cache。在内存不足时,这部分内存会选用lru算法进行筛选。
经过free指令检查内存,显现为cached的部分便是文件缓存了。
怎么针对性优化:
lru并不是一个优异筛选算法,lru最大的优势是普适性好,在各种运用场景下都能起到必定的作用。
假如能找到当时运用场景下,文件被拜访的计算特征,针对性的写一个筛选算法,能够大幅提高文件缓存的命中率。
关于http正向署理来说,一个好的筛选算法能够用1GB内存到达lru算法100GB内存的缓存作用。
假如不计划写一个新的筛选算法,一般不需求在应用层再搭一个文件cache程序来做缓存。
最小分配
当文件扩展,需求分配磁盘空间时,大部分文件体系不会仅仅只分配当时需求的磁盘空间,而是会多分配一些磁盘空间。这样下次文件扩展时就能够运用现已分配好的空间,而不会频频的去分配新空间。
例如ext3下,每次分配磁盘空间时,最小是分配8KB。
最小分配的副作用是会糟蹋一些磁盘空间(分配了可是又没有运用)
怎么针对性优化:
咱们在reiserfs下将最小分配空间从8KB改大到128K后提高了30%的磁盘io功用。
假如当时运用场景下小文件许多,把预分配改大就会糟蹋许多磁盘空间,所以这个数值要依据当时运用场景来设定。
好像要直接改源代码才干收效,不太记得了,09年的时分改的,有爱好的同学自己google吧。
io拜访调度
在一起有多个io拜访时,linux内核能够对这些io拜访按LBA进行合并和排序,这样磁头在移动时,能够“趁便”读出移动过程中的数据。
2.6内核有四种不同的排序算法,有些侧重于io功用最大化,也有一些侧重于调度的公平性,大致上的原理都相似于电梯排序。
SATA等磁盘甚至在磁盘中内置了io排序来进一步提高功用,一般需求在主板中进行装备才干发动磁盘内置io排序。linux的io排序是依据LBA进行的,但LBA是一个一维线性地址,无法彻底反应出二维的圆形磁盘,所以磁盘的内置io排序能到达更好的作用。
关于LBA请参阅上一期博客,http://blog.chinaunix.net/uid-29873073-id-4514435.html
怎么针对性优化:
io拜访调度能大幅提高io功用,条件是应用层一起主张了满足的io拜访供linux去调度。
怎样才干从应用层一起向内核主张多个io拜访呢?
计划一是用aio_read异步主张多个文件读写恳求。
计划二是运用磁盘线程池一起主张多个文件读写恳求。
对咱们的http正向署理来说,选用16个线程读写磁盘能够将功用提高到2.5倍左右。详细开多少个线程/进程,能够依据详细运用场景来决议。
小提示:
将文件句柄设置为非堵塞时,进程仍是会睡觉等候磁盘io,非堵塞关于文件读写是不收效的。在正常情况下,读文件只会引进十几毫秒睡觉,所以不太显着;而在磁盘io极大时,读文件会引起十秒以上的进程睡觉。
详见内核源代码do_generic_file_read会调用lock_page_killable进入睡觉,可是不会判别句柄的非堵塞标志。
预读取
linux内核能够猜测咱们“将来的读恳求”并提早将数据读取出来。经过预读取能够削减读io的次数,而且减小读恳求的延时。
怎么针对性优化:
预读取的猜测准确率是有限的,与其依靠预读取,不如咱们直接开一个较大的缓冲区,一次性将文件读出来再渐渐处理;尽量不要开一个较小的缓冲区,循环读文件/处理文件。
终究开多大缓冲区适宜,要依据详细运用场景下的内存/磁盘io压力来决议。
尽管说“预读取”和“推迟分配”能起到相似的作用,可是咱们自己扩展读写缓冲区作用要更好。
推迟分配
当文件扩展,需求分配磁盘空间时,能够不当即进行分配,而是暂存在内存中,将屡次分配磁盘空间的恳求聚合在一起后,再进行一次性分配。
推迟分配的意图也是削减分配次数,然后削减文件不接连。
推迟分配的副作用有几个:
1 假如应用程序每次写数据后都经过fsync等接口进行强制改写,推迟分配将不起作用
2 推迟分配有或许间歇性引进一个较大的磁盘IO延时(由于要一次性向磁盘写入较多数据)
只要少量新文件体系支撑这个特性
怎么针对性优化:
假如不是对安全性(是否答应丢掉)要求极高的数据,能够直接在应用程序里缓存起来,堆集到必定巨细再写入,作用比文件体系的推迟分配更好。
假如对安全性要求极高,主张常常用fsync强制改写。
在线磁盘碎片收拾
Ext4供给了一款碎片收拾东西,叫e4defrag,首要包括三个功用:
1 让每个文件接连存储
2 尽量让每个目录下的文件接连存储
3 经过收拾闲暇磁盘空间,让接下来的分配更不简单发生碎片
有爱好的同学能够参阅http://jsmylinux.no-ip.org/applications/using-e4defrag/
怎么针对性优化:
“让每个目录下的文件接连存储”是一个极有价值的功用。