Linux 系统使用 I/O 调度算法,在各个竞争执行磁盘 I/0 的进程之间做仲裁。这个 I/O 调度器对请求的次序和时机做最优化处理,以求针对一个应用或者场合,取得尽可能最好的整体 I/O 性能。

常用调度算法说明

CFQ(Completely Fair Queuing)

这是 2.6 版的 Linux 内核的默认调度算法,对于通用服务器来说通常是比较好的选择。它试图均匀的分布对 I/O 带宽的访问。

Deadline

这个算法试图把每次请求的延迟降至最低。该算法重排了请求的顺序来提高性能。

NOOP

这个算法实现了一个简单 FIFO 队列。在有些 SAN 环境下,这种选择可能是最好的选择,而且对于 SSD 盘来说,它是最佳选择。

查看系统调度算法

# dmesg  |grep -i scheduler[    1.061992] io scheduler noop registered[    1.061996] io scheduler deadline registered (default)[    1.062022] io scheduler cfq registered[    1.062025] io scheduler mq-deadline registered[    1.062027] io scheduler kyber registered

从上述命令输出结果中可以看到,当前默认使用的算法是 deadline 算法,deadline 也是 CentOS 7 系统默认的调度算法,而在 CentOS 6 版本中使用的默认调度算法是 cfq。

调度算法的配置

配置指定磁盘的 I/O 调度算法

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

为系统中所有硬盘配置指定 I/O 调度算法

为系统所有硬盘配置 I/O 调度算法在 CentOS 7 与 CentOS 6/5 配置方式有所不同,以下将分别说明。

CentOS 5、CentOS 6 中通过添加 elevator=deadline 到 /etc/grub.conf 配置文件中包含 kernel 所在行的行尾。

# cat /etc/grub.conftitle CentOS (2.6.32-358.el6.x86_64)root (hd0,0)kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/vg0/lv0 <span style="color: #ff0000;">elevator=deadline</span>initrd /initramfs-2.6.32-358.el6.x86_64.img

CentOS 7 中通过添加 elevator=deadline 到 /etc/default/grub 配置文件中包含 GRUB_CMDLINE_LINUX 所在行。

# cat  /etc/default/grub GRUB_TIMEOUT=5GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"GRUB_DEFAULT=savedGRUB_DISABLE_SUBMENU=trueGRUB_TERMINAL_OUTPUT="console"GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet <span style="color: #ff0000;">elevator=deadline</span>" GRUB_DISABLE_RECOVERY="true"

CentOS 7 在修改完 /etc/default/grub 后需要重建 /boot/grub2/grub.cfg 文件,然后重启后才能最终生效。

重建 grub 的配置文件的命令如下:
On BIOS-based machines:
# grub2-mkconfig -o /boot/grub2/grub.cfg
On UEFI-based machines:
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg

参考书籍:《UNIX/Linux系统管理技术手册》
参考链接:https://access.redhat.com/solutions/32376

©著作权归作者所有:来自51CTO博客作者liubin0505star的原创作品,如需转载,请注明出处,否则将追究法律责任

如果文章对你有帮助,请赞赏

赞赏

0人进行了赞赏支持

更多相关文章

  1. 如何落地全球最大 Kubernetes 生产集群
  2. 在Kubernetes上部署应用时我们常忽略的几件事
  3. Kubernetes Scheduler浅析
  4. OSPF虚链路、DV算法和区域验证的应用
  5. MySQL系列-物理存储结构和索引算法
  6. “蚂蚁呀嘿” 刷屏的背后:算法工程师带你理性解构神曲
  7. kubernetes常用控制器之DaemonSet
  8. TCPIP卷一(10):EIGRP的DUAL算法和SIA解决方案
  9. 3-8(单链表相关算法习题+双链表)

随机推荐

  1. go语言导包时“.”和“_”的区别是什么?
  2. 详解Golang数组的传递
  3. 分享golang实现文件传输小demo
  4. go语言中run与build命令的区别是什么?
  5. 解决GO语言安装air框架时遇到go: inconsi
  6. 分享5种文件变更时自动重载Go程序的方法
  7. go语言中普通函数与方法的区别是什么?
  8. golang中方法的receiver为指针和不为指针
  9. 分享一次腾讯Go开发岗位面试经过
  10. go是什么语言