[转帖]linux 磁盘队列深度nr_requests 和 queue_depth

linux,磁盘,队列,深度,nr,requests,queue,depth · 浏览次数 : 0

小编点评

**nr_requests** * 限制了每个I/O设备的最大请求数量。 * 默认值为128,意味着128个读请求和128个写请求可以同时排队。 * 降低nr_requests的值可以降低命令队列深度,防止写请求阻塞读请求。 **queue_depth** * 限制了每个I/O设备的最大队列深度。 * 默认值为642,意味着每个设备可以同时处理的最大I/O操作数为nr_requests * 2。 * 降低queue_depth的值可以降低命令队列深度,但可能会降低性能。 **iostat 的 avgqu-sz** * 指的是I/O调度器中请求和队列的最大数量。 * 等于nr_requests * 2 + queue_depth。 **iostatnr_requests 和 queue_depth 的区别** * **nr_requests**:用于限制每个I/O设备的最大请求数量。 * **queue_depth**:用于限制每个I/O设备的最大队列深度。 * **iostatnr_requests**:仅适用于I/O调度器中的请求。 * **queue_depth**:适用于I/O调度器中的请求和队列。 **iostat 的 avgqu-sz 的计算公式** ``` avgqu-sz = nr_requests * 2 + queue_depth ``` **注意** * iostats 参数通常用于性能测试和监控。 * 降低nr_requests或queue_depth的值可能会降低性能,但可以改善系统的吞吐量。 * 在禁用iostats参数之前,请确保设备的性能正常。

正文

linux 磁盘队列深度nr_requests 和 queue_depth

  • nr_requests 和 queue_depth
  • 修改配置值
  • nr_requests 和 queue_depth 区别
  • iostat 的avgqu-sz
  • lsscsi -l 的队列大小
  • iostat
  • nr_requests 和 queue_depth

    本文主要介绍Linux 操作系统中 nr_requests 和 queue_depth的参数意义和工作原理。以及结合iostat 的avgqu-sz 之间关系分析。

    1.nr_requests 和 queue_depth

    操作系统中nr_requests参数,可以提高系统的吞吐量,似乎越大越好,但是该请求队列的也不能过大,因为这样会消耗大量的内存空间。该值的调整需要综合多处因素,
    比如: 文件系统、sheduler类型、io的特点。
    命令: echo xxx > /sys/block//queue/nr_requests,nr_requests的大小设置至少是/sys/block//device/queue_depth的两倍,所以,修改nr_requtests的时候要注意。

    [root@node-1 ~]# cat /sys/block/sdj/queue/nr_requests 
    256
    [root@node-1 ~]# cat /sys/block/sdj/device/queue_depth 
    64
    

      2.修改配置值

      $ echo “512” > /sys/block/sda/queue/nr_requests     IO调度队列大小
      $ echo “512” > /sys/block/sda/device/queue_depth    磁盘队列深度
      

        3.nr_requests 和 queue_depth 区别

        • nr_requests:请求的IO调度队列大小
        • queue_depth:请求在磁盘设备上的队列深度
        • I/O调度器中的最大I/O操作数是nr_requests * 2。读和写是分开的。
        • 已经分配到底层设备的I/O操作是queue_depth。
        • 一个磁盘设备的I/O操作的最大未完成限制为(nr_requests * 2)+(queue_depth) 。对应iostat 的avgqu-sz。

        英文解释

         https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sect-red_hat_enterprise_linux-performance_tuning_guide-storage_and_file_systems-configuration_tools

        nr_requests
        Specifies the maximum number of read and write requests that can be queued at one time. 
        The default value is 128, which means that 128 read requests and 128 write requests can be queued before the next process to request a read or write is put to sleep.
        

        For latency-sensitive applications, lower the value of this parameter and limit the command queue depth on the storage so that write-back I/O cannot fill the device queue with write requests.
        When the device queue fills, other processes attempting to perform I/O operations are put to sleep until queue space becomes available.
        Requests are then allocated in a round-robin manner, which prevents one process from continuously consuming all spots in the queue.

        The maximum number of I/O operations within the I/O scheduler is nr_requests*2.
        As stated, nr_requests is applied separately for reads and writes.
        Note that nr_requests only applies to the I/O operations within the I/O scheduler and not to I/O operations already dispatched to the underlying device.

        Therefore, the maximum outstanding limit of I/O operations against a device is (nr_requests*2)+(queue_depth) where queue_depth is /sys/block/sdN/device/queue_depth, sometimes also referred to as the LUN queue depth.
        You can see this total outstanding number of I/O operations in, for example, the output of iostat in the avgqu-sz column.

        指定一次可以排队的读请求和写请求的最大数目。
        默认值是128,这意味着128个读请求和128个写请求可以在请求读或写的下一个进程进入睡眠状态之前排队。

        对于对延迟敏感的应用程序,可以降低该参数的值,并限制存储上的命令队列深度,以防止回写I/O用写请求填满设备队列。
        当设备队列满时,其他试图执行I/O操作的进程将进入休眠状态,直到队列空间可用。
        然后以循环的方式分配请求,这可以防止一个进程持续地消耗队列中的所有位置。

        I/O调度器中的最大I/O操作数是nr_requests*2。
        如前所述,对于读和写,分别应用nr_requests。
        注意,nr_requests仅适用于I/O调度器中的I/O操作,而不适用已经分配到底层设备的I/O操作。

        因此,对一个设备的I/O操作的最大未完成限制为(nr_requests*2)+(queue_depth),其中queue_depth为/sys/block/sdN/device/queue_depth,有时也称为LUN队列深度。
        例如,您可以在avgqu-sz列中的iostat输出中看到这个未完成的I/O操作总数。

          4.iostat 的avgqu-sz

          该值大小为:(nr_requests*2)+(queue_depth)

          5.lsscsi -l 的队列大小

          Lun queue depth值来自 /sys/block/sdj/device/queue_depth

          [root@node-1 ~]# echo "128" >/sys/block/sdj/device/queue_depth
          [root@node-1 ~]# lsscsi -l | grep -A 1 sdj
          [0:0:16:0]   disk    SEAGATE  ST1000NX0453     NS02  /dev/sdj 
            state=running queue_depth=128 scsi_level=7 type=0 device_blocked=0 timeout=90
          [root@node-1 ~]# echo "256" >/sys/block/sdj/device/queue_depth 
          [root@node-1 ~]# lsscsi -l | grep -A 1 sdj
          [0:0:16:0]   disk    SEAGATE  ST1000NX0453     NS02  /dev/sdj 
            state=running queue_depth=256 scsi_level=7 type=0 device_blocked=0 timeout=90
          

            6.iostat

            The default value is 1 (enabled). 
            Setting iostats to 0 disables the gathering of I/O statistics for the device, which removes a small amount of overhead with the I/O path. 
            Setting iostats to 0 might slightly improve performance for very high performance devices, such as certain NVMe solid-state storage devices.
            It is recommended to leave iostats enabled unless otherwise specified for the given storage model by the vendor.
            

            If you disable iostats, the I/O statistics for the device are no longer present within the /proc/diskstats file.
            The content of /sys/diskstats is the source of I/O information for monitoring I/O tools, such as sar or iostats.
            Therefore, if you disable the iostats parameter for a device, the device is no longer present in the output of I/O monitoring tools.

            缺省值为1(启用)。
            将iostats设置为0将禁用收集设备的I/O统计信息,这将减少I/O路径的少量开销。
            将iostats设置为0可能会略微提高非常高性能设备的性能,比如某些NVMe固态存储设备。
            除非供应商为给定的存储模型特别指定,否则建议保持启用iostats。
            如果禁用iostats,设备的I/O统计信息将不再存在于/proc/diskstats文件中。
            /sys/diskstats的内容是用于监视I/O工具(如sar或iostats)的I/O信息的来源。
            因此,如果对某个设备禁用iostats参数,该设备将不再出现在I/O监控工具的输出中。

              与[转帖]linux 磁盘队列深度nr_requests 和 queue_depth相似的内容:

              [转帖]linux 磁盘队列深度nr_requests 和 queue_depth

              linux 磁盘队列深度nr_requests 和 queue_depth nr_requests 和 queue_depth 修改配置值 nr_requests 和 queue_depth 区别 iostat 的avgqu-sz lsscsi -l 的队列大小 iostat nr_requests

              [转帖]「Linux性能调优」磁盘I/O队列调度策略

              https://zhuanlan.zhihu.com/p/450329513 傻瓜化说明 简单地说,对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是Complete Fairness Queueing的缩写,它是一个复杂的调度策略,按进程创建多个

              [转帖]linux磁盘IO读写性能优化

              在LINUX系统中,如果有大量读请求,默认的请求队列或许应付不过来,我们可以 动态调整请求队列数来提高效率,默认的请求队列数存放在/sys/block/xvda/queue/nr_requests 文件中,注意:/sys/block/xvda ,这里 xvda 写的是你自己的硬盘名,因我的是vps所

              [转帖]Linux中常见IO调度器

              https://www.jianshu.com/p/3c16e39a005a 单队列调度算法多队列调度算法 deadline mqdeadlines cfq bfq noop none kyber 对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是

              [转帖]linux性能检测之sar详解

              http://blog.51niux.com/?id=99 sar也是sysstat中的一员。 一、介绍 1.1 简介 sar是一个优秀的一般性能监视工具,它可以输出Linux所完成的几乎所有工作的数据。sar命令在sysetat rpm中提供。 sar可以显示CPU、运行队列、磁盘I/O、分页(交

              [转帖]如何使用storcli在系统中管理RAID磁盘阵列

              Windows版和Linux版storcli命令中个别参数略有差异,可以查看帮助文件,命令如下: ./storcli help page=30 上面命令page=30表示每页显示30行内容。 下载storcli storcli下载地址如下: StorCLI Standalone Utility 查看

              [转帖]Linux 磁盘I/O 调度算法 说明

              2022-08-23 13:031361转载Linux 1 Linux 4.0 IO协议栈框架图 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 Linux 4.0 IO协议栈框架图 I/O调度程序的总结 当向

              [转帖]Linux磁盘二次格式化后写入速度巨慢之解决方案

              https://blog.csdn.net/hellfu/article/details/109127640 磁盘sdc格式化做成lvm后,写入速度不稳定,大多数在5M/s一下。 echo 512 >/sys/block/sdc/queue/nr_requests 本来cat /sys/block/

              [转帖]Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能

              文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。 当然,也存在缓存被写爆的

              [转帖]Linux磁盘I/O(一):Cache,Buffer和sync

              Cache和Buffer的区别 磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件。Linux 中“一切皆文件”,我们平时查看的“文件”是普通文件,磁盘是块设备文件,我们可以通过执行 “ls -l <路径>” 查看它们的区别: $ ls