Postgres 优化: 为SSD修改块设备的IO调度策略

浏览: 99 发布日期: 2016-10-16 分类: postgresql

问题: Linux 默认的IO调度策略为 CFQ(完全公平队列), 不适合于数据库的应用, 需要切换为 DEADLINE 调度策略.

在 Flash技术之前, 我们都是使用机械磁盘存储数据的, 机械磁盘的寻道时间是影响它速度的最重要因素, 直接导致它的每秒可做的IO(IOPS)非常有限, 为了尽量排序和合并多个请求, 以达到一次寻道能够满足多次IO请求的目的, Linux文件系统设计了多种IO调度策略, 已适用各种场景和存储设备.

Linux的IO调度策略包括: Deadline scheduler, Anticipatory scheduler, Completely Fair Queuing(CFQ), NOOP. 每种调度策略的详细调度方式我们这里不详细描述, 这里我们主要介绍CFQ和Deadline, CFQ是Linux内 核2.6.18之后的默认调度策略, 它声称对每一个 IO 请求都是公平的, 这种调度策略对大部分应用都是适用的. 但是如果数据库有两个请求, 一个请求3次IO, 一个请求10000次IO, 由于绝对公平, 3次IO 的这个请求都需要跟其他10000个IO请求竞争, 可能要等待上千个IO完成才能返回, 导致它的响应时间非常慢. 并且如果在处理的过程中, 又有很多IO请 求陆续发送过来, 部分IO请求甚至可能一直无法得到调度被“饿死”. 而deadline兼顾到一个请求不会在队列中等待太久导致饿死, 对数据库这种应用来 说更加适用.

本文中的实验采用的 Ubuntu Server.

查看当前块设备IO调度策略

临时设置

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

永久设置

编辑Grub文件修改块设备调度策略

vi /etc/default/grub

把下图中的 elevator=cfg 替换为 elevator=deadline

更新

update-grub

重启系统, 然后验证当前的调度器

cat /sys/block/sda/queue/scheduler
返回顶部