NVMe中断与轮询:I/O延迟优化

需积分: 13 0 下载量 198 浏览量 更新于2024-07-16 收藏 3.76MB PDF 举报
"这篇文档是Damien LeMoal在2017年Linux Storage and Filesystems Conference(Vault会议)上的演讲稿,主题是利用NVMe轮询技术优化I/O延迟。主要内容涵盖了I/O模型的比较,Linux内核中的实现,评估结果以及结论与未来方向。" 在这篇演讲中,Damien LeMoal探讨了两种不同的I/O模型:基于中断请求(IRQ)和轮询(polling)的方法。传统的基于IRQ的I/O模型中,设备生成中断来异步通知驱动器命令完成,这通常涉及设备驱动程序、中断处理程序以及VFS(虚拟文件系统)和BIO(块I/O)堆栈。用户进程发起系统调用如read或write后,会进入等待状态,直到中断处理程序通过VFS和BIO栈传递完成信号。 相反,轮询I/O模型中,驱动程序会定期检查设备状态,而不是等待中断。NVMe(非易失性内存 express)设备的引入使得轮询成为可能,因为它们提供了更低的延迟和更高的带宽,这使得轮询模式在某些情况下比基于IRQ的模型更具优势,尤其是在优化I/O延迟方面。 Linux内核的实现部分,LeMoal讨论了如何在块层和NVMe驱动中实现轮询模式。他可能详细解释了如何将轮询机制集成到现有的内核结构中,以及这种改变对性能和效率的影响。 评估结果显示,经典轮询与混合轮询的对比中,混合轮询可能表现出更好的性能。此外,他还研究了进程调度对I/O性能的影响,以及与用户级驱动程序的比较。这可能涉及到如何在系统负载变化时调整轮询策略,以适应不同的工作负载和系统资源需求。 演讲的结论部分,LeMoal可能概述了轮询I/O模型在NVMe环境中的潜力,以及未来的研究和开发方向。这可能包括改进轮询算法以减少开销,优化调度策略,或者探索新的硬件特性以进一步提高I/O效率。 这篇演讲深入探讨了NVMe设备上轮询技术如何优化I/O延迟,为Linux存储和文件系统的开发者提供了有价值的洞见,并为未来的系统优化指明了道路。

#!/bin/bash CPWD=$(cd $(dirname $0);pwd) cd $CPWD rm -f ssd_symbol_set hdd_symbol_set nvme_symbol_set filter_ssd_hdd_nvme_set() { rm -f ssd_symbol_set hdd_symbol_set nvme_symbol_set os_disk_symbol=$(echo $(lsblk |grep -B1 -E "part|boot" |grep -E "^sd[a-z]+|^nvme" |awk '{print $1}') |sed 's/ /|/') non_os_disk_set=$(lsscsi -g |-E "ATA|TOSHIBA" |awk '{print $(NF-1)}' |grep -Ev $os_disk_symbol) if [[ -n $non_os_disk_set ]];then for i in $(echo "$non_os_disk_set") do rotationRate=$(smartctl -i $i |awk -F":" '/Rotation Rate/{print $2}') if [[ $rotationRate =~ "Solid State Device" ]];then echo $i |awk -F"/" '{print $3}' >> ssd_symbol_set elif [[ $rotationRate =~ "rpm" ]];then echo $i |awk -F"/" '{print $3}' >> hdd_symbol_set fi done fi nvme_info_set=$(nvme list |grep -E "nvme[0-9]+n1") if [[ -n $nvme_info_set ]];then echo "$nvme_info_set" |awk '{print $1}' |awk -F"/" '{print $3}' > nvme_symbol_set fi } hdd_parallel_fio_test() { # multi hdd fio test if [ -s hdd_symbol_set ];then for dev in $(cat hdd_symbol_set) do nohup &>/dev/null bash hdd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/hdd_fio_log mv hdd_sd*_*.log $CPWD/hdd_fio_log fi } ssd_parallel_fio_test() { # multi sata ssd fio test if [ -s ssd_symbol_set ];then for dev in $(cat ssd_symbol_set) do nohup &>/dev/null bash ssd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/ssd_fio_log mv ssd_sd*_*.log $CPWD/ssd_fio_log fi } nvme_parallel_fio_test() { # multi nvme ssd fio test if [ -s nvme_symbol_set ];then for dev in $(cat nvme_symbol_set) do nohup &>/dev/null bash ssd_raw_fio_test.sh $dev & done wait mkdir -p $CPWD/nvme_fio_log mv ssd_nvme*_*.log $CPWD/nvme_fio_log fi } filter_ssd_hdd_nvme_set #hdd_parallel_fio_test #ssd_parallel_fio_test nvme_parallel_fio_test

2023-06-07 上传