nvme0n1_write_fragment1: (g=0): rw=write, bs=(R) 128KiB-128KiB, (W) 128KiB-128KiB, (T) 128KiB-128KiB, ioengine=libaio, iodepth=128 fio-3.18 Starting 1 thread nvme0n1_write_fragment1: (groupid=0, jobs=1): err= 0: pid=3700: Thu Jun 8 16:04:43 2023 write: IOPS=18.8k, BW=2354MiB/s (2468MB/s)(5962GiB/2593866msec); 0 zone resets slat (usec): min=2, max=34703, avg= 3.83, stdev= 6.41 clat (usec): min=344, max=40121, avg=6793.84, stdev=3102.08 lat (usec): min=349, max=40124, avg=6797.76, stdev=3102.06 clat percentiles (usec): | 1.00th=[ 5473], 5.00th=[ 5473], 10.00th=[ 5473], 20.00th=[ 5473], | 30.00th=[ 5473], 40.00th=[ 5473], 50.00th=[ 5473], 60.00th=[ 5473], | 70.00th=[ 5473], 80.00th=[ 6849], 90.00th=[11076], 95.00th=[13960], | 99.00th=[18482], 99.50th=[20579], 99.90th=[27132], 99.95th=[30802], | 99.99th=[30802] bw ( MiB/s): min= 521, max= 2943, per=100.00%, avg=2356.61, stdev=782.79, samples=5180 iops : min= 4172, max=23550, avg=18852.89, stdev=6262.35, samples=5180 lat (usec) : 500=0.01%, 750=0.01%, 1000=0.01% lat (msec) : 2=0.01%, 4=0.01%, 10=86.67%, 20=12.44%, 50=0.89% cpu : usr=3.63%, sys=6.77%, ctx=48837403, majf=0, minf=6946 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwts: total=0,48837764,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 Run status group 0 (all jobs): WRITE: bw=2354MiB/s (2468MB/s), 2354MiB/s-2354MiB/s (2468MB/s-2468MB/s), io=5962GiB (6401GB), run=2593866-2593866msec Disk stats (read/write): nvme0n1: ios=58/48832059, merge=0/0, ticks=67/331765521, in_queue=250054672, util=100.00%
时间: 2023-08-26 21:05:41 浏览: 122
这是一段FIO测试结果的输出,它测试了一个名为"nvme0n1_write_fragment1"的设备的写入性能。以下是一些解读:
1. IOPS=18.8k:每秒输入/输出操作数为18800。
2. BW=2354MiB/s:带宽为2354兆字节每秒。
3. slat、clat、lat:这些指标是关于读写操作的延迟。其中,slat是发出请求到发出第一个I/O操作的时间,clat是发出第一个I/O操作到最后一个I/O操作完成的时间,lat是发出请求到最后一个I/O操作完成的时间。min、max、avg、stdev分别表示最小值、最大值、平均值和标准差。
4. clat percentiles:这是一个关于延迟的分位数表。例如,50.00th=[5473]表示50%的读写操作在5473微秒内完成。
5. bw:这是带宽的统计信息,包括最小值、最大值、平均值和标准差。
6. iops:这是IOPS的统计信息,包括最小值、最大值、平均值和标准差。
7. latency:这是延迟的统计信息,包括目标延迟、窗口大小、百分位数和深度。
8. Disk stats:这是磁盘的统计信息,包括读写操作的数量、合并操作的数量、运行时间、I/O队列中的操作数量和磁盘的利用率等。
相关问题
static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж����Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,可以通过修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。
是的,通过设置 affinity_hint 参数为一个指定的 CPU 核心,可以将 NVMe 驱动的所有 I/O 队列绑定到同一 CPU 核心上,从而提高系统的性能和响应速度。这个参数可以在 nvme_setup_irqs() 函数中调用 pci_alloc_irq_vectors_affinity() 函数时设置。同时,在 nvme_calc_irq_sets() 函数中也可以根据系统的硬件资源和配置情况,动态计算 IRQ 的分配方式和数量,以实现更加高效的 IRQ 管理和利用。
static void nvme_calc_irq_sets(struct irq_affinity *affd, unsigned int nrirqs) { struct nvme_dev *dev = affd->priv; unsigned int nr_read_queues, nr_write_queues = dev->nr_write_queues; if (!nrirqs) { nrirqs = 1; nr_read_queues = 0; } else if (nrirqs == 1 || !nr_write_queues) { nr_read_queues = 0; } else if (nr_write_queues >= nrirqs) { nr_read_queues = 1; } else { nr_read_queues = nrirqs - nr_write_queues; } dev->io_queues[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; affd->set_size[HCTX_TYPE_DEFAULT] = nrirqs - nr_read_queues; dev->io_queues[HCTX_TYPE_READ] = nr_read_queues; affd->set_size[HCTX_TYPE_READ] = nr_read_queues; affd->nr_sets = nr_read_queues ? 2 : 1; }static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) { struct pci_dev *pdev = to_pci_dev(dev->dev); struct irq_affinity affd = { //ָ���ж����Եļ��㷽���Ͳ��� .pre_vectors = 1, .calc_sets = nvme_set_irq_affinity, //nvme_calc_irq_sets, .priv = dev, }; unsigned int irq_queues, poll_queues; poll_queues = min(dev->nr_poll_queues, nr_io_queues - 1); dev->io_queues[HCTX_TYPE_POLL] = poll_queues; dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; irq_queues = 1; if (!(dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR)) irq_queues += (nr_io_queues - poll_queues); return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } 在 Linux 5.17.12 内核版本中,如何修改 pci_alloc_irq_vectors_affinity() 函数的 affinity_hint 参数来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。代码展示
可以在 nvme_setup_irqs() 函数中调用 pci_alloc_irq_vectors_affinity() 函数时,将 affinity_hint 参数设置为指定的 CPU 核心编号,来绑定 NVMe 驱动的所有 I/O 队列到同一 CPU 核心上。具体代码如下:
```
int cpu = 0; // 设置 CPU 核心编号
return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd, &cpu);
```
其中,第 6 个参数是一个指向 CPU 核心编号的指针。在函数返回时,该指针将被设置为实际使用的 CPU 核心编号。如果想要绑定到指定的 CPU 核心上,可以先将该指针设置为指定的核心编号,然后调用函数即可。
阅读全文