- 浏览: 7942900 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能.其实所有的 IO 优化只有二点,合并和排序…
在linux下面列出4种调度算法
CFQ (Completely Fair Queuing 完全公平的排队)(elevator=cfq):
这是默认算法,对于通用服务器来说通常是最好的选择.它试图均匀地分布对I/O带宽的访问.在多媒体应用, 总能保证audio、video及时从磁盘读取数据.但对于其他各类应用表现也很好.每个进程一个queue,每个queue按照上述规则进行merge和sort.进程之间round robin调度,每次执行一个进程的4个请求.可以调 queued 和 quantum 来优化
Deadline (elevator=deadline):
这个算法试图把每次请求的延迟降至最低.该算法重排了请求的顺序来提高性能.可以调队列的过期的读写过程,如 read_expire 和 write_expire 二个参数来控制多久内一定要读到数据,超时就放弃排序.比较合适小文件.还可以使用打开 front_merges 来进行合并邻近文件.
NOOP (elevator=noop):
I/O请求被分配到队列,调度由硬件进行,只有当CPU时钟频率比较有限时进行.
Noop对于I/O不那么操心,对所有的I/O请求都用FIFO队列形式处理,默认认为 I/O不会存在性能问题.这也使得CPU也不用那么操心.当然对于复杂一点的应用类型使用这个调度器,用户自己就会非常操心.
Noop调度算法指的是当请求被存储到队列并交由I/O子系统处理时由磁盘硬件对其进行优化.该算法一般只对一些特定的硬件(例如RAM disk和TCQ disk等).现代磁盘控制器都具备通过tagged command queuing进行优化的功能.Tagged command queuing(TCQ)可以通过由磁盘控制器对I/O请求进行重新排序来减少磁头的动作.通常需要进行重组的I/O请求都会带有一个标识符,这样控制器在接收到这些I/O请求的时候会按照规则进行处理.
有些应用程序需要对队列长度进行限制,而现代的设备驱动都具备用于控制队列长度的TCO功能,并且该功能可以作为内核参数在系统启动的时候添加.例如要控制SCSI驱动器Lun2的队列长度为64个请求,可以修改/etc/grub.conf并增加下面的内核参数:aic7xxx=tag_info:{{0,0,64,0,0,0,0}}
Anticipatory (elevator=as):
对读操作优化服务时间,在提供一个I/O的时候进行短时间等待,使进程能够提交到另外的I/O.Anticipatory scheduler(as) 曾经一度是Linux 2.6 Kernel的I/O scheduler.Anticipatory的中文含义是“预料的,预想的”,这个词的确揭示了这个算法的特点,简单的说有个I/O发生的时候,如果又有进程请求I/O操作,则将产生一个默认的6毫秒猜测时间,猜测下一个进程请求I/O是要干什么的.这对于随机读取会造成比较大的延时,对数据库应用很糟糕,而对于Web Server等则会表现的不错.这个算法也可以简单理解为面向低速磁盘的,因为那个“猜测”实际上的目的是为了减少磁头移动时间.因此这种算法更加适合顺序读写的应用程序.这个可以用来调整的内核参数有 antic_expire ,read_expire 和 write_expire.
linux中IO调度方法的查看和设置的方法
查看当前IO
1
2
$ cat /sys/block/{DEVICE-NAME}/queue/scheduler
$ cat /sys/block/sd*/queue/scheduler
例:输出结果如下
1
noop anticipatory deadline [cfq]
设置当前IO
1
2
$ echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler
$ echo noop > /sys/block/hda/queue/scheduler
对IO调度使用的建议
Deadline I/O scheduler
在这个中 deadline 调度算法通过降低性能而获得更短的等待时间,它使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库,Oracle 10G 之类).
Anticipatory I/O scheduler
anticipatory 算法通过增加等待时间来获得更高的性能,假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流(相当于给随机读写变顺序读写), 使用这个原理来使用读取写入的延时换取最大的读取写入吞吐量.适用于大多数环境,特别是读取写入较多的环境,比如文件服务器,Web 应用,App等应用我们可以采纳as调度.后面我会教大家怎么调这个的合并的等待时间.
CFQ I/O scheduler
这个是 对所有因素也都做了折中而尽量获得公平性,使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统
Anticipatory 调节
根据上面的内容,我们算法中可能用的最多的就是 Anticipatory 的算法了,会根据时间来多排一些内容在写,所以下面讲讲这个参数可以调的部分.
除了算法修改成这个算法外,影响它的还有
磁盘队列长度
/sys/block/sda/queue/nr_requests 默认只有 128 个队列,可以提高到 512 个.会更加占用内存,但能更加多的合并读写操作,速度变慢,但能读写更加多的量
等待时间
/sys/block/sda/queue/iosched/antic_expire 读取附近产生的新请时等待多长时间
对读优化的参数
/sys/block/sda/queue/read_ahead_kb
这个参数对顺序读非常有用,意思是,一次提前读多少内容,无论实际需要多少.默认一次读 128kb 远小于要读的,设置大些对读大文件非常有用,可以有效的减少读 seek 的次数,这个参数可以使用 blockdev –setra 来设置,setra 设置的是多少个扇区,所以实际的字节是除以2,比如设置 512 ,实际是读 256 个字节.
几个非常有效的 IO 调度调节的内核参数
1
/proc/sys/vm/dirty_ratio
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数 据.增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能.但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 10.下面是增大的方法: echo ’40′> /proc/sys/vm/dirty_ratio
1
/proc/sys/vm/dirty_background_ratio
这个参数控制文件系统的pdflush进程,在何时刷新磁盘.单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候, pdflush开始向磁盘写出数据.增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能.但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 5.下面是增大的方法: echo ’20′ > /proc/sys/vm/dirty_background_ratio
1
/proc/sys/vm/dirty_writeback_centisecs
这个参数控制内核的脏数据刷新进程pdflush的运行间隔.单位是 1/100 秒.缺省数值是500,也就是 5 秒.如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作.设置方法如下: echo ’200′ > /proc/sys/vm/dirty_writeback_centisecs 如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值: echo ’1000′ > /proc/sys/vm/dirty_writeback_centisecs
1
/proc/sys/vm/dirty_expire_centisecs
这个参数声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去.单位是 1/100秒.缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘.对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快.建议设置为 1500,也就是15秒算旧. echo ’1500′ > /proc/sys/vm/dirty_expire_centisecs 当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好.
在linux下面列出4种调度算法
CFQ (Completely Fair Queuing 完全公平的排队)(elevator=cfq):
这是默认算法,对于通用服务器来说通常是最好的选择.它试图均匀地分布对I/O带宽的访问.在多媒体应用, 总能保证audio、video及时从磁盘读取数据.但对于其他各类应用表现也很好.每个进程一个queue,每个queue按照上述规则进行merge和sort.进程之间round robin调度,每次执行一个进程的4个请求.可以调 queued 和 quantum 来优化
Deadline (elevator=deadline):
这个算法试图把每次请求的延迟降至最低.该算法重排了请求的顺序来提高性能.可以调队列的过期的读写过程,如 read_expire 和 write_expire 二个参数来控制多久内一定要读到数据,超时就放弃排序.比较合适小文件.还可以使用打开 front_merges 来进行合并邻近文件.
NOOP (elevator=noop):
I/O请求被分配到队列,调度由硬件进行,只有当CPU时钟频率比较有限时进行.
Noop对于I/O不那么操心,对所有的I/O请求都用FIFO队列形式处理,默认认为 I/O不会存在性能问题.这也使得CPU也不用那么操心.当然对于复杂一点的应用类型使用这个调度器,用户自己就会非常操心.
Noop调度算法指的是当请求被存储到队列并交由I/O子系统处理时由磁盘硬件对其进行优化.该算法一般只对一些特定的硬件(例如RAM disk和TCQ disk等).现代磁盘控制器都具备通过tagged command queuing进行优化的功能.Tagged command queuing(TCQ)可以通过由磁盘控制器对I/O请求进行重新排序来减少磁头的动作.通常需要进行重组的I/O请求都会带有一个标识符,这样控制器在接收到这些I/O请求的时候会按照规则进行处理.
有些应用程序需要对队列长度进行限制,而现代的设备驱动都具备用于控制队列长度的TCO功能,并且该功能可以作为内核参数在系统启动的时候添加.例如要控制SCSI驱动器Lun2的队列长度为64个请求,可以修改/etc/grub.conf并增加下面的内核参数:aic7xxx=tag_info:{{0,0,64,0,0,0,0}}
Anticipatory (elevator=as):
对读操作优化服务时间,在提供一个I/O的时候进行短时间等待,使进程能够提交到另外的I/O.Anticipatory scheduler(as) 曾经一度是Linux 2.6 Kernel的I/O scheduler.Anticipatory的中文含义是“预料的,预想的”,这个词的确揭示了这个算法的特点,简单的说有个I/O发生的时候,如果又有进程请求I/O操作,则将产生一个默认的6毫秒猜测时间,猜测下一个进程请求I/O是要干什么的.这对于随机读取会造成比较大的延时,对数据库应用很糟糕,而对于Web Server等则会表现的不错.这个算法也可以简单理解为面向低速磁盘的,因为那个“猜测”实际上的目的是为了减少磁头移动时间.因此这种算法更加适合顺序读写的应用程序.这个可以用来调整的内核参数有 antic_expire ,read_expire 和 write_expire.
linux中IO调度方法的查看和设置的方法
查看当前IO
1
2
$ cat /sys/block/{DEVICE-NAME}/queue/scheduler
$ cat /sys/block/sd*/queue/scheduler
例:输出结果如下
1
noop anticipatory deadline [cfq]
设置当前IO
1
2
$ echo {SCHEDULER-NAME} > /sys/block/{DEVICE-NAME}/queue/scheduler
$ echo noop > /sys/block/hda/queue/scheduler
对IO调度使用的建议
Deadline I/O scheduler
在这个中 deadline 调度算法通过降低性能而获得更短的等待时间,它使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库,Oracle 10G 之类).
Anticipatory I/O scheduler
anticipatory 算法通过增加等待时间来获得更高的性能,假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流(相当于给随机读写变顺序读写), 使用这个原理来使用读取写入的延时换取最大的读取写入吞吐量.适用于大多数环境,特别是读取写入较多的环境,比如文件服务器,Web 应用,App等应用我们可以采纳as调度.后面我会教大家怎么调这个的合并的等待时间.
CFQ I/O scheduler
这个是 对所有因素也都做了折中而尽量获得公平性,使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统
Anticipatory 调节
根据上面的内容,我们算法中可能用的最多的就是 Anticipatory 的算法了,会根据时间来多排一些内容在写,所以下面讲讲这个参数可以调的部分.
除了算法修改成这个算法外,影响它的还有
磁盘队列长度
/sys/block/sda/queue/nr_requests 默认只有 128 个队列,可以提高到 512 个.会更加占用内存,但能更加多的合并读写操作,速度变慢,但能读写更加多的量
等待时间
/sys/block/sda/queue/iosched/antic_expire 读取附近产生的新请时等待多长时间
对读优化的参数
/sys/block/sda/queue/read_ahead_kb
这个参数对顺序读非常有用,意思是,一次提前读多少内容,无论实际需要多少.默认一次读 128kb 远小于要读的,设置大些对读大文件非常有用,可以有效的减少读 seek 的次数,这个参数可以使用 blockdev –setra 来设置,setra 设置的是多少个扇区,所以实际的字节是除以2,比如设置 512 ,实际是读 256 个字节.
几个非常有效的 IO 调度调节的内核参数
1
/proc/sys/vm/dirty_ratio
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数 据.增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能.但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 10.下面是增大的方法: echo ’40′> /proc/sys/vm/dirty_ratio
1
/proc/sys/vm/dirty_background_ratio
这个参数控制文件系统的pdflush进程,在何时刷新磁盘.单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候, pdflush开始向磁盘写出数据.增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能.但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 5.下面是增大的方法: echo ’20′ > /proc/sys/vm/dirty_background_ratio
1
/proc/sys/vm/dirty_writeback_centisecs
这个参数控制内核的脏数据刷新进程pdflush的运行间隔.单位是 1/100 秒.缺省数值是500,也就是 5 秒.如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作.设置方法如下: echo ’200′ > /proc/sys/vm/dirty_writeback_centisecs 如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值: echo ’1000′ > /proc/sys/vm/dirty_writeback_centisecs
1
/proc/sys/vm/dirty_expire_centisecs
这个参数声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去.单位是 1/100秒.缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘.对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快.建议设置为 1500,也就是15秒算旧. echo ’1500′ > /proc/sys/vm/dirty_expire_centisecs 当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好.
发表评论
-
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3101微软提供了不少命令行 ... -
挂载文件系统选项nodiratime、noatime等集合小结
2018-06-02 19:56 2666Linux系统文件有三个主 ... -
Linux如何查看当前占用CPU或内存最多的K个进程
2018-05-20 11:01 3298内存 可以使用以下命令查使用内存最多的K个进程 方法1: p ... -
(转)使用frp实现内网穿透
2018-05-14 13:33 2431https://www.jianshu.com/p/e8e26 ... -
docker小结1
2018-05-11 14:26 4831 通过dockerfile建立一个简单的HELLO.C,然后 ... -
LINUX下EPOLL等不错的文章收藏
2018-04-25 09:35 5631 通俗讲解 异步,非阻塞和 IO 复用 https:/ ... -
Ubuntu中root用户和user用户的相互切换
2018-04-06 12:46 10321)从user用户切换到root用户 不管是用图形模式登录U ... -
ubuntu下Virtualbox虚拟Ubuntu共享文件夹设置
2018-04-06 11:41 10111. 安装增强功能包(Guest Additions) 安装 ... -
Web网站压力及性能测试
2017-10-09 19:59 699https://segmentfault.com/a/1190 ... -
工具推荐:Netdata,Linux性能实时监测工具
2017-07-14 09:10 1174工具推荐:Netdata,Linux性能实时监测工具 http ... -
一个 Linux 下基于 Bash 的文件和数据库监控及备份工具,可发送微信报警通知
2017-07-11 07:07 1653一个 Linux 下基于 Bash 的文件和数据库监控及备份工 ... -
收藏个不错的能发送日志等警告信息等到微信的工具
2017-06-11 10:12 1077发现个将比如报警日志呀之类的提醒信息,发送给微信的好的工具,不 ... -
收藏:nginx教程从入门到精通(ttlsa出品)
2017-02-09 22:53 728http://www.ttlsa.com/nginx/ngin ... -
(转)从dstat理解Linux性能监控体系
2016-08-02 10:27 2565http://calvin1978.blogcn.com/ar ... -
linux下安装SZ,RZ命令
2016-02-26 20:59 1664在 linux 下,一般用secur crt等工具,今天居然 ... -
Clumsy —— 帮你模拟各种网络不稳定的环境,包括掉包
2014-11-14 09:12 1760Clumsy —— 帮你模拟各种网络不稳定的环境,包括掉包、延 ... -
ping+tracerout的unix下网络诊断小工具mtr
2014-07-29 22:04 1601今日才发现,原来linux中可以用ping和tracerout ... -
(转)Apache日志分割
2014-02-25 20:20 1608Apache和Ngix一样,对日志没有进行分割处理,这样很不方 ... -
linux下 cpu频率节能
2014-02-25 13:06 1435参考: http://linux-wiki.cn/wiki/z ... -
(转)最佳日志实践
2014-01-22 23:24 953http://www.bitstech.net/2014/01 ...
相关推荐
本文主要介绍了如何在 Linux 系统中启用 BFQ I/O 调度器实例,并对其进行配置和加载。 BFQ 调度器是 Linux 内核从 4.12 版本开始引入的新型 I/O 调度器,它可以提高系统的响应速度和吞吐量。 I/O 调度器是操作系统...
Linux I/O 调度器的工作机制是控制块设备的请求队列:确定队列中哪些 I/O 的优先级更高以及何时下发 I/O 到块设备,以此来减少磁盘寻道时间,从而提高系统的吞吐量。 目前 Linux 上有如下几种 I/O 调度算法: ...
本文将详细介绍四种主要的I/O调度算法:Completely Fair Queuing (CFQ)、Deadline、NOOP以及Anticipatory,并探讨它们的工作原理、适用场景及如何在系统中进行配置。 #### 1. Completely Fair Queuing (CFQ) **概述...
在Linux操作系统中,网络I/O(Input/Output)性能是衡量服务器处理网络请求效率的关键因素。本文主要探讨了几种不同的网络I/O模型,并提出了针对Linux系统优化网络I/O性能的策略。 1. **阻塞模式(Blocking I/O)**...
在Linux系统中,异步I/O可以通过AIO(Asynchronous Input/Output)接口实现,如libaio库。而在Windows系统中,可以使用I/O完成端口(IOCP)或者Windows API的BeginRead/BeginWrite等函数。此外,许多高级编程框架,...
在Linux系统中,异步通知和异步I/O是设备驱动开发中的重要概念,它们极大地提高了系统的效率和响应性。本文将深入探讨这两个主题,并结合《Linux设备驱动开发详解》一书中的理论与实践,为你提供详尽的理解。 首先...
Linux内核中的I/O调度器主要负责管理磁盘或其他块设备上的请求队列,并通过一系列算法优化来提高系统的整体I/O吞吐量和响应时间。Linux提供了多种不同的I/O调度算法供用户选择,以适应不同应用场景的需求。 #### 三...
I/O管理程序在操作系统中扮演着至关重要的角色,它负责管理和调度计算机与外部设备之间的数据传输。本文将深入探讨Linux 2.4.0内核中的I/O子系统,特别是关于I/O端口资源管理的实现原理,这对于理解操作系统内核机制...
在Linux操作系统中,I/O调度层是内核的一个重要组成部分,它负责管理对块设备的I/O请求。块设备包括硬盘驱动器、固态驱动器(SSD)等存储介质。Linux内核通过I/O调度层将I/O请求排序、合并,并使用不同的调度算法来...
本文主要探讨了Linux内核2.6.32版本中提供的四种I/O调度算法:Noop、Deadline、Anticipatory和CFQ,并分析了它们的基本原理、特点以及适用场景。 1. Noop(无操作)调度算法是最简单的调度策略,它基本不对I/O请求...
Linux存储I/O栈是一个复杂的系统,它从应用程序发出的I/O请求开始,一直到数据实际写入或从硬件存储设备中读取出来为止。这个过程涉及多个层次和组件,包括系统调用接口、虚拟文件系统、缓冲缓存、直接I/O、文件系统...
Linux操作系统以其开源、高效和灵活性而备受推崇,尤其在系统开发领域。在Linux环境下,异步I/O(Asynchronous I/O)模式是一种提升程序效率的重要手段,它允许程序在等待I/O操作完成时,可以继续执行其他任务,从而...
本文将深入探讨Linux I/O系统的结构、工作流程以及I/O调度器的作用。 首先,虚拟文件系统(VFS,Virtual File System)是Linux内核中的一种抽象层,它允许内核支持多种不同的文件系统,如EXT4、XFS、FAT等。VFS为...
Linux作为一款广泛应用的操作系统,在磁盘I/O调度方面提供了多种策略来适应不同的应用场景。本文将深入探讨Linux中的四种主要I/O调度算法:CFQ、NOOP、Deadline以及AS,并通过实际案例来对比不同调度器对系统性能的...
这表明,在特定的工作负载下,选择合适的I/O调度算法对于提高系统的整体性能至关重要。 #### 结论 Linux I/O调度算法是系统性能优化的关键因素之一。理解每种算法的特点和适用场景,并根据实际需求选择合适的算法...