转载-什么是inode?

什么是inode?
inode是Linux/Unix系文件系统[如ext]中的一个概念,当一个文件系统格式化了之后,他必定会有 inode table 与 data area 两个区块。Block 是记录文件内容数据的地区,而 inode 则是记录该文件的属性、及该文件放置在哪个 Block 以内的信息。并且每一个文件至少须要一个inode。
如何查询一个文件系统的inode使用状况:
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            2366400  186064 2180336    8% /
none                   63327       1   63326    1% /dev/shm
使用df -i能够看到文件系统的inode总数、使用数、剩余量和使用百分比。
如何查看每一个文件系统的inode大小:定义inode大小:
 
 
[root@gc_server ~]# dumpe2fs -h /dev/sda1|grep node
dumpe2fs 1.35 (28-Feb-2004)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Inode count:              2366400
Free inodes:              2177496
Inodes per group:         16320
Inode blocks per group:   510
First inode:              11
Inode size:               128
Journal inode:            8
First orphan inode:       150509
Journal backup:           inode blocks
 
 
 
inode大小决定了一个文件系统中的inode总量,在建立文件系统的时候能够指定inode的大小,建立以后不可修改:
mkfs.ext3 -I 128 /dev/sdb5   //自定inode的大小为128byte
inode会引发什么问题:
可能出现磁盘空闲空间充足的状况下,新建文件时提示磁盘空间满。

inode数量过多由什么引发:
通常是小文件过多,若是一个文件大小比文件系统的块大小还小,如文件系统的block size为4k,而文件只有2k,则有2k的空间被浪费,也就是blocks per inode ratio太小,从而有可能会出现磁盘空间未满,而inode数消耗殆尽的状况。
如何规划:
由于inode大小通常而言略大于block大小为宜,因此:

一、 当 block 越小、inodes 越多,可利用空间越多,可是大文件写入效率较差:适合文件数量多可是文件容量小的系统,例如 BBS 或者新闻群组 news 这方面的服务之系统;
二、 当 block 越大 、 inodes 数越少,大文件写入效率较佳,但浪费的空间较多:适合文件容量大的系统。
IO调度器
IO调度器的整体目标是但愿让磁头可以老是往一个方向移动,移动到底了再往反方向走,这偏偏就是现实生活中的电梯模型,因此IO调度器也被叫作电梯.(elevator)而相应的算法也就被叫作电梯算法.而Linux中IO调度的电梯算法有好几种,一个叫作as(Anticipatory),一个叫作cfq(Complete Fairness Queueing),一个叫作deadline,还有一个叫作noop(No Operation).具体使用哪一种算法咱们能够在启动的时候经过内核参数elevator来指定.

另外一方面咱们也能够单独的为某个设备指定它所采用的IO调度算法,这就经过修改在/sys/block/sda/queue/目录下面的scheduler文件.好比咱们能够先看一下个人这块硬盘:
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
能够看到咱们这里采用的是cfq.
Linux IO调度器相关算法介绍
IO调度器(IO Scheduler)是操做系统用来决定块设备上IO操做提交顺序的方法。存在的目的有两个,一是提升IO吞吐量,二是下降IO响应时间。然而IO吞吐量和IO响应时间每每是矛盾的,为了尽可能平衡这二者,IO调度器提供了多种调度算法来适应不一样的IO请求场景。其中,对数据库这种随机读写的场景最有利的算法是DEANLINE。接着咱们按照从简单到复杂的顺序,迅速扫一下Linux 2.6内核提供的几种IO调度算法。
一、NOOP

NOOP算法的全写为No Operation。该算法实现了最最简单的FIFO队列,全部IO请求大体按照先来后到的顺序进行操做。之因此说“大体”,缘由是NOOP在FIFO的基础上还作了相邻IO请求的合并,并非完彻底全按照先进先出的规则知足IO请求。
假设有以下的io请求序列:
100,500,101,10,56,1000
NOOP将会按照以下顺序知足:
100(101),500,10,56,1000
二、CFQ

CFQ算法的全写为Completely Fair Queuing。该算法的特色是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。
假设有以下的io请求序列:
100,500,101,10,56,1000
CFQ将会按照以下顺序知足:
100,101,500,1000,10,56
在传统的SAS盘上,磁盘寻道花去了绝大多数的IO响应时间。CFQ的出发点是对IO地址进行排序,以尽可能少的磁盘旋转次数来知足尽量多的IO请求。在CFQ算法下,SAS盘的吞吐量大大提升了。可是相比于NOOP的缺点是,先来的IO请求并不必定能被知足,可能会出现饿死的状况。
三、DEADLINE

DEADLINE在CFQ的基础上,解决了IO请求饿死的极端状况。除了CFQ自己具备的IO排序队列以外,DEADLINE额外分别为读IO和写IO提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列内的IO请求优先级要比CFQ队列中的高,,而读FIFO队列的优先级又比写FIFO队列的优先级高。优先级能够表示以下:
FIFO(Read) > FIFO(Write) > CFQ
四、ANTICIPATORY

CFQ和DEADLINE考虑的焦点在于知足零散IO请求上。对于连续的IO请求,好比顺序读,并无作优化。为了知足随机IO和顺序IO混合的场景,Linux还支持ANTICIPATORY调度算法。ANTICIPATORY的在DEADLINE的基础上,为每一个读IO都设置了6ms的等待时间窗口。若是在这6ms内OS收到了相邻位置的读IO请求,就能够当即知足。
IO调度器算法的选择,既取决于硬件特征,也取决于应用场景。

在传统的SAS盘上,CFQ、DEADLINE、ANTICIPATORY都是不错的选择;对于专属的数据库服务器,DEADLINE的吞吐量和响应时间都表现良好。然而在新兴的固态硬盘好比SSD、Fusion IO上,最简单的NOOP反而多是最好的算法,由于其余三个算法的优化是基于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且IO响应时间很是短。
查看和修改IO调度器的算法很是简单。假设咱们要对sda进行操做,以下所示:
cat /sys/block/sda/queue/scheduler
echo “cfq” > /sys/block/sda/queue/scheduler
相关文章
相关标签/搜索