IO调度器(译)

这篇文章中,将会介绍Linux上常见的IO Scheduler,以及如何修改Linux上面的默认的IO Scheduler。在翻译的过程中,对原文的内容有所删减,有些地方也重写排列了一下顺序。

原文链接: Improving Linux System Performance with I/O Scheduler Tuning

什么是IO调度器?

磁盘的访问速度,一直都是计算机的瓶颈。尽管现在固态硬盘的出现,缓解了一下这个尴尬的状况。但是,磁盘的访问速度依然是系统中的瓶颈。

对于机械硬盘来说,当我们需要访问硬盘上的数据的时候,首先需要经过一个被称为寻道时间的过程,即,将盘片旋转到特定的扇区,然后由磁头来读取数据。一般来说,这个寻道时间会占硬盘访问时间中的很大比重。

IO调度器就是为了优化这个过程,而工作的。IO调度器,一般是将访问磁盘上相邻数据的请求,放在一起处理,进而减少无谓的寻道时间,提高速度。

在Linux系统上,已经存在了好多个IO调度器。它们都有各自的特色。在这篇文章剩下的部分里,我们将会依次介绍这几个IO调度器,并比较他们的性能。

修改IO调度器

在本文中,我们使用Ubuntu来做实验,因为在Ubuntu中,我们既可以在运行时修改IO调度器,也可以在启动时就修改IO调度器。

如果想要在运行时修改IO调度器,只需要修改一个位于/sys目录中的文件的值,就可以了。

如果想要在启动时修改IO调度器,那么需要在启动时,修改GRUB项。

在修改IO调度器之前,我们先查看一下当前系统中的IO调度器。通过读取/sys/block/<disk device>/queue/scheduler这个文件的内容来获取。

# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

上面的输出,说明sda这个磁盘的IO调度器为deadline.

尽管IO调度器是内核级别的参数,但是,可以分别为不同的磁盘设置不同的IO调度器。如果我们修改sda的IO调度器,sda上面的全部的文件系统都会使用这个新的IO调度器。

正如性能调优的一般步骤那样,我们需要先了解我们要进行调优的环境,然后根据测试结果选择一个合适的IO调度器。

在运行时修改IO调度器

只需要修改/sys/block/<diskdevice>/queue/scheduler这个文件的内容:

# echo "cfq" > /sys/block/sda/queue/scheduler
# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]

从上面的输出结果中我们可以看到,IO调度器被马上替换为CFQ。这也就意味着,我们并不需要重启我们的PostgreSQL实例或者其他的服务来进行测试。

启动时修改IO调度器

编辑/etc/default/grub,找到GRUB_CMDLINE_LINUX这一项。将它修改成下面这样,告诉它使用noop这个IO调度器。

GRUB_CMDLINE_LINUX="elevator=noop"

然后,运行update-grub2命令来使设置生效。

# update-grub2
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.4.0-62-generic
Found initrd image: /boot/initrd.img-4.4.0-62-generic
Found linux image: /boot/vmlinuz-4.4.0-57-generic
Found initrd image: /boot/initrd.img-4.4.0-57-generic
done

通过reboot命令重启系统之后,我们可以查看我们的设置是否生效。

# cat /sys/block/sda/queue/scheduler
[noop] deadline cfq

测试PostgreSQL在不同IO调度器下的性能

CFQ

CFQ的全称是Complete Fairness Queueing,它的工作原理是这样的,它先创建一个IO请求队列,然后在对队列中的请求根据上文我们说到的那种方式,即将要访问磁盘上相邻数据的请求放到一起,按照这种方式进行排序之后,再依次处理IO请求队列中的请求。

我们可以看到,CFQ实际上并没有区分不同优先级的IO请求。这也就意味着,在某些需要优先处理某些请求的场合,它并不适合。

在理解了CFQ之后,我们通过pgbench来测试我们的PostgreSQL实例。

# su - postgres
$ pgbench -c 100 -j 2 -t 1000 example
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 50
query mode: simple
number of clients: 100
number of threads: 2
number of transactions per client: 1000
number of transactions actually processed: 100000/100000
latency average: 60.823 ms
tps = 1644.104024 (including connections establishing)
tps = 1644.228715 (excluding connections establishing)

从结果中,我们可以看到,现在的tps基本上是1644/s。尽管不是一个非常差的结果,但是这个结果并不是最优的。

Deadline

Deadline调度器,会创建两个队列,一个读队列,一个写队列。并且每个IO请求都会有一个与其相关联的过期时间戳。

当Deadline调度器在处理IO请求的时候,它会通过过期时间戳来对IO请求进行优先级排序。那些将要过期的IO请求会被赋予更高的优先级。

默认情况下,Deadline为读请求设置的过期时间为500ms,而为写请求设置的过期时间则为5000ms。我们可以看到,Deadline实际上比较适合于那种读请求比写请求多好多的场景中。

我们将IO调度器修改成Deadline,然后查看PostgreSQL的性能。

# echo deadline > /sys/block/sda/queue/scheduler
# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq

现在我们已经将IO调度器修改成了Deadline,我们再次测试系统的性能:

# su - postgres
$ pgbench -c 100 -j 2 -t 1000 example
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 50
query mode: simple
number of clients: 100
number of threads: 2
number of transactions per client: 1000
number of transactions actually processed: 100000/100000
latency average: 46.700 ms
tps = 2141.318132 (including connections establishing)
tps = 2141.489076 (excluding connections establishing)

我们可以看到,相对与CFQ,TPS有接近500/s的提升。

我们同样可以看到,尽管pgbench在测试时,基本上按照1:1的比例生成读写请求,但是依旧可以从Deadline调度器中受益。

Noop

Noop调度器是一个非常特殊的调度器。它并不会对特殊请求进行优先处理,与此相反,它将全部的IO请求都放到一个FIFO队列中。但是,它还会对相似的请求进行合并。

Noop调度器是为了那些实际上并不需要任何IO调度器的系统而进行优化的。比如,在那些虚拟机实例中,实际的IO请求都是由宿主机处理的。

在虚拟机场景中,因为宿主机上,实际上已经有了IO调度器了。所以,在这种场景中,每个IO请求都会被传递到两个IO调度器中,一个是VM的调度器,一个是宿主机上的IO调度器。

# echo noop > /sys/block/sda/queue/scheduler
# cat /sys/block/sda/queue/scheduler
[noop] deadline cfq
# su - postgres
$ pgbench -c 100 -j 2 -t 1000 example
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 50
query mode: simple
number of clients: 100
number of threads: 2
number of transactions per client: 1000
number of transactions actually processed: 100000/100000
latency average: 46.364 ms
tps = 2156.838618 (including connections establishing)
tps = 2157.102989 (excluding connections establishing)

从结果中,我们可以看到,仅仅只是比Deadline调度器的结果好一点点。

由于我们的这次测试是在虚拟机中进行的,所以,尽管修改了虚拟机上面的IO调度器,实际上起作用的还是宿主机上的IO调度器。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 一 OS系统优化 1 内核优化 1)IO调度优化 调整Linux默认的IO调度算法. IO调度器的总体目标是希望让...
    PennLi阅读 576评论 0 2
  • 文件系统优化 ** 动态调整请求队列数来提高效率,默认请求队列数为:128, 可配置512 **[root@c37...
    肖金光xjg阅读 4,795评论 1 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 许多应用都有跳转AppStore 评分或者下载的功能,网上有很多文章关于跳转的方法,在此仅仅总结下: 跳转到App...
    加菲貓的日常阅读 1,554评论 0 1
  • 想把你写成一首诗 诗中藏着你的名字 想养一只猫 看着它在你怀里安静睡着 想回到初次相遇的起点 重温年少的心跳 想在...
    墨尔本的海阅读 268评论 0 1