SPDK

文章的具体内容将会一点的展开.

TODO:

SPDK综述, SPDK使用, SPDK代码概述

SPDK综述

SPDK使用

DPDK使用

1. 获取源代码

# git clone http://dpdk.org/git/dpdk

2. 进入目录

# cd dpdk

3. 启用pcap(需要安装libpcap-devel for centos, libpcap-dev for ubuntu)

# make config T=x86_64-native-linuxapp-gcc
# sed -ri 's,(PMD_PCAP=).*,\1y,' build/.config

4. 编译

# make

make 出现错误:

"error: implicit declaration of function ‘_mm_alignr_epi8’"

解决方法: cpu 不支持 sse3 指令(grep sse3 /proc/cpuinfo),

如果是虚拟机,主机支持,只需要虚拟机设置时CPU与主机一样;

如果主机不支持,那么只能更换主机cpu了.


SPDK 中 spdk_nvme_probe 流程:

spdk_nvme_probe -->
        nvme_pci_enumerate -->
+-
|               spdk_pci_enumerate -->
|                       enum_cb
|               <-- nvme_pci_enum_cb -->
|                       spdk_pci_device_get_class
|                       ctx->user_enum_cb
|       <-- nvme_enum_cb -->
|               spdk_nvme_ctrlr_opts_set_defaults
|               enum_ctx->probe_cb
| <-- probe_cb -->
|       spdk_pci_device_has_non_uio_driver
|               nvme_attach -->
|                       nvme_malloc
|                       nvme_ctrl_construct -->
|                               nvme_ctrlr_allocate_bars -->
|                                       nvme_pcicfg_map_bar -->
|                                               pci_device_map_range
|                                       nvme_ctrlr_map_cmb -->
|                                               nvme_pcicfg_get_bar_addr_len
|                                               nvme_pcicfg_map_bar_write_combine
|                               nvme_pcicfg_read32(spdk_pci_device_cfg_read32) -->
|                                       pci_device_cfg_read_u32
|                               nvme_pcicfg_write32(spdk_pci_device_cfg_write32) -->
|                                       pci_device_cfg_write_u32
|                               nvme_ctrlr_construct_admin_qpair -->
|                                       nvme_qpair_construct
+-
+-
|       nvme_ctrlr_process_init -->
|               nvme_mmio_write_4
|               nvme_ctrl_set_state
|       nvme_ctrlr_process_init -->
|               nvme_ctrlr_enable
|               nvme_ctrl_set_state
|       nvme_ctrlr_process_init -->
|               nvme_ctrlr_start -->
|                       nvme_qpair_reset
|                       nvme_qpair_enable
|                       nvme_ctrlr_identify -->
|                               nvme_ctrlr_cmd_identify_controller -->
|                                       nvme_allocate_request_contig -->
|                                               nvme_allocate_request -->
|                                                       nvme_alloc_request
|                                       nvme_ctrlr_submit_admin_request -->
|                                               nvme_qpair_submit_request -->
|                                                       nvme_qpair_check_enabled
|                               spdk_nvme_qpair_process_completions -->
|                                       nvme_qpair_check_enabled
|                                       nvme_qpair_complete_tracker
|                       <-- nvme_completion_poll_cb
|                                       spdk_mmio_write_4
|                       nvme_ctrlr_set_num_qpairs
|                       nvme_ctrlr_construct_io_qpairs
|                       nvme_ctrlr_construct_namespaces
|                       nvme_ctrlr_configure_aer
|                       nvme_ctrlr_set_supported_log_pages
|                       nvme_ctrlr_set_supported_features
|               nvme_ctrl_set_state
|       attach_cb -->
| <-- attach_cb
|       register_ns
+-
spdk_nvme_probe 主要分为两大部分(稍后有会详解)


SPDK代码概述

参考:

<pre name="code" class="html">https://software.intel.com/en-us/articles/introduction-to-the-storage-performance-development-kit-spdk
 

### SPDK相关的面试问题及准备材料 #### 软件定义存储与SPDK概述 SPDK(Software Defined Storage Development Kit)是一个用于开发高性能数据平面应用程序的开源工具包。它通过利用现代硬件特性(如NVMe SSDs和RDMA网络),提供了高效的I/O处理能力[^1]。 以下是关于SPDK的一些常见面试问题及其解答: --- #### 常见面试问题及答案 1. **什么是SPDK?它的核心功能是什么?** - SPDK是一种软件定义存储开发套件,旨在优化基于PCIe设备的数据平面操作性能。其核心功能包括支持异步I/O模型、轮询模式驱动程序设计以及零拷贝内存管理等技术来减少CPU开销并提高吞吐量。 2. **如何初始化一个简单的SPDK环境?** ```bash sudo modprobe uio_pci_generic ./scripts/setup.sh ``` 上述命令加载了通用UIO模块,并设置了必要的内核参数以便于后续运行SPDK应用实例时能够正确访问底层硬件资源。 3. **解释下SPDK中的poll mode driver (PMD)?** PMD是指一种无需中断机制即可持续查询设备状态变化从而完成数据传输的方式,在这种架构下可以显著降低延迟时间因为避免了上下文中断切换带来的额外成本。 4. **谈谈你对DPDK vs SPDK的理解?** DPDK主要用于加速网络包处理而SPDK专注于提升块级存取效率;两者都采用了用户空间编程范式并通过旁路传统操作系统栈实现高效运作但是各自侧重点不同——前者偏向报文转发后者则更关注磁盘读写场景下的极致表现. 5. **描述一下SPDK的应用场景有哪些?** 主要应用于云服务提供商构建超大规模分布式文件系统或者对象存储解决方案当中比如Ceph RBD插件就集成了该框架以获得更好的随机小IO性能指标;另外还有数据库引擎层面上也可能引入此类库来进行定制化改造进而满足特定业务需求对于低延时高并发事务型负载尤为适用. 6. **列举几个重要的配置选项或API接口名称。** - `spdk_env_init`: 初始化整个执行环境。 - `spdk_bdev_register` : 注册一个新的block device到全局列表里供其他组件发现使用。 - `spdk_poller_register`: 创建周期性回调函数用来定期触发某些逻辑流程例如健康监测统计上报等功能实现. 7. **如果遇到性能瓶颈应该怎样排查分析呢?** 可以借助perf top之类的Linux内置诊断工具观察热点函数调用链路找出潜在问题所在位置再针对性调整代码结构或是修改相关参数设置尝试缓解症状直至达到预期目标为止. 8. **请简单说明下SPDK中reactor的作用原理。** Reactors负责监听来自各个channel上的事件请求并将它们分发给对应的handler去实际处理具体任务每一个core上都会启动独立线程作为单独worker instance相互之间不存在锁竞争关系因此具备良好的扩展性和可维护性特点. 9. **分享一次你在项目实践中运用SPDK解决实际难题的经历吧!** 这类开放性题目可以根据个人经历灵活作答关键是突出自己对该领域知识掌握程度的同时展现出解决问题的能力水平比如说曾经针对某款新型SSD产品适配过程中发现了原生驱动存在兼容性缺陷于是深入研究内部源码最终成功修复漏洞贡献给了社区等等案例均能有效加分. --- #### 数据平面开发套件面试技巧 - 提前熟悉官方文档资料尤其是最新版本release notes部分往往包含了重要改动亮点介绍有助于快速把握趋势方向; - 多参与GitHub Issues讨论区互动不仅可以积累实战经验还能结识志同道合的朋友形成良好人脉圈; - 定期跟踪业界动态保持敏感度及时更新自己的技能树确保始终站在前沿阵地之上迎接挑战。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值