<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[shuningzhang的专栏]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/shuningzhang</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; shuningzhang]]></copyright><item><title><![CDATA[人工智能绘画的进化：大模型图像生成能力横评]]></title><link>https://blog.csdn.net/shuningzhang/article/details/160408443</link><guid>https://blog.csdn.net/shuningzhang/article/details/160408443</guid><author>shuningzhang</author><pubDate>Wed, 22 Apr 2026 21:52:23 +0800</pubDate><description><![CDATA[本文对比测试了豆包、元宝、千问、Gemini和ChatGPT五大AI模型在数据压缩主题插画生成上的表现。所有模型均采用相同提示词生成手绘风格图片，均能呈现压缩类型（有损/无损）和算法（如哈夫曼编码）等核心内容。豆包、元宝、千问均生成4张相似图片，其中元宝增加了手机边框元素但存在乱码问题。Gemini生成的图片细节更丰富，包含算法原理示意图。测试结果表明当前主流AI绘画模型已具备专业插图生成能力，不同模型在呈现形式和细节处理上各具特色。]]></description><category></category></item><item><title><![CDATA[第2章：基于内存的只读文件系统]]></title><link>https://blog.csdn.net/shuningzhang/article/details/159538823</link><guid>https://blog.csdn.net/shuningzhang/article/details/159538823</guid><author>shuningzhang</author><pubDate>Sat, 18 Apr 2026 22:39:49 +0800</pubDate><description><![CDATA[本文是基于FUSE文件系统的第2篇文章。本篇将引入目录的概念，也就是在我们实现的文件系统中，不仅仅有文件，还有目录。在上一章中，我们实现了一个极简的 HelloFS，它只有一个硬编码的文件。虽然它展示了 FUSE3 的基本工作流程，但距离一个真正的文件系统还有很大差距：它不支持多级目录、不支持多个文件、所有内容都是字符串常量硬编码的。本章将引入文件系统最核心的数据结构概念——，并用 C++ 的标准库容器在内存中构建一棵完整的文件目录树。]]></description><category></category></item><item><title><![CDATA[第1章：文件系统原理与 FUSE3 环境搭建]]></title><link>https://blog.csdn.net/shuningzhang/article/details/159534426</link><guid>https://blog.csdn.net/shuningzhang/article/details/159534426</guid><author>shuningzhang</author><pubDate>Wed, 08 Apr 2026 20:52:30 +0800</pubDate><description><![CDATA[摘要： 本章通过HelloFS实例演示如何基于FUSE开发用户态文件系统。文件系统是操作系统的核心组件，传统内核文件系统开发门槛高，而FUSE允许在用户空间实现文件系统，简化开发调试。Linux通过VFS抽象层统一管理不同文件系统，FUSE则借助内核模块和libfuse库实现请求转发。示例中创建了一个只读文件系统，包含硬编码的单一文件，展示了FUSE的核心工作流程：用户请求经VFS转发至FUSE内核模块，再通过/dev/fuse设备与用户态程序交互。开发环境搭建涉及安装libfuse3-dev工具链，并通过]]></description><category></category></item><item><title><![CDATA[从零开发文件系统：基于 FUSE3 的实战指南 - 大纲]]></title><link>https://blog.csdn.net/shuningzhang/article/details/159534283</link><guid>https://blog.csdn.net/shuningzhang/article/details/159534283</guid><author>shuningzhang</author><pubDate>Sat, 28 Mar 2026 12:05:06 +0800</pubDate><description><![CDATA[前面我们挖了一个大坑，计划写一些列的文章，介绍如何从零开发一个文件系统。但是前一段时间一直写忙着写一本关于存储方面的书，原定的关于从零开发文件系统的相关文章就一直没有更新。最近这本书已经交稿，可以稍微有点空闲的时间，打算把原来挖的坑给天上。写作这一系列文章的源起是我的拙著《文件系统技术内幕》介绍了文件系统的原理和流程，并结合了一些的开源实现。很多读者朋友反馈开源项目过于庞大，代码阅读比较费劲。]]></description><category></category></item><item><title><![CDATA[纠删码技术，更省钱的分布式系统的可靠性技术]]></title><link>https://blog.csdn.net/shuningzhang/article/details/150651864</link><guid>https://blog.csdn.net/shuningzhang/article/details/150651864</guid><author>shuningzhang</author><pubDate>Sat, 23 Aug 2025 21:01:50 +0800</pubDate><description><![CDATA[摘要：本文介绍了纠删码技术作为替代副本技术的存储方案，通过数学矩阵运算实现数据冗余，在保证可靠性的同时显著降低存储成本。以RS(n,m)编码为例，详细解析了其生成矩阵原理、数据恢复机制，并对比了分布式存储中的范德蒙德和柯西矩阵应用。文章还探讨了本地可修复码(LRC)技术对网络开销的优化，最后以Ceph实现为例展示了纠删码的实际应用，包括Jerasure库的编码/解码函数接口说明。该技术使存储效率提升至66%以上，已广泛应用于主流分布式存储系统。]]></description><category></category></item><item><title><![CDATA[网络大提速，RDMA，IB，iWrap]]></title><link>https://blog.csdn.net/shuningzhang/article/details/149463910</link><guid>https://blog.csdn.net/shuningzhang/article/details/149463910</guid><author>shuningzhang</author><pubDate>Sat, 19 Jul 2025 13:57:18 +0800</pubDate><description><![CDATA[本文介绍了高性能网络传输技术RDMA及其实现方式。传统以太网数据传输需要多次内存拷贝，导致高延迟。RDMA技术通过直接内存访问实现零拷贝、内核旁路和CPU卸载，显著提升传输性能。RDMA主要有三种实现：专有的IB协议、基于以太网的RoCE（分v1/v2版本）和基于TCP的iWARP。三者虽然协议栈不同，但都通过Verbs软件包提供统一API。文章还比较了各协议的架构特点，并介绍了通过Soft-RoCE进行软件模拟的方法。这些技术通过减少数据拷贝和协议处理开销，有效解决了分布式系统中的网络传输瓶颈问题。]]></description><category></category></item><item><title><![CDATA[从宿主机到虚拟机，云环境下主机端IO路径的变化]]></title><link>https://blog.csdn.net/shuningzhang/article/details/143819146</link><guid>https://blog.csdn.net/shuningzhang/article/details/143819146</guid><author>shuningzhang</author><pubDate>Sat, 16 Nov 2024 16:24:54 +0800</pubDate><description><![CDATA[KVM的全称是Kernel-based Virtual Machine，也就是基于内核的虚拟机，它本身只是一个内核模块，实现CPU和内存的虚拟化。Qemu: 最早的Qemu通过软件的方式实现了计算机硬件的虚拟化，由于采用纯软件的虚拟化，其效率要低很多。目前的Qemu实现了对KVM的支持，并通过一个工具集提供了丰富的功能，如qemu-system-x86_64和qemu-img等。由于Qemu/KVM是开源免费的，我们可以基于Ubuntu系统快速的部署一个支持KVM虚拟化的环境，并创建一个虚拟机。]]></description><category></category></item><item><title><![CDATA[学习存储协议的利器，聊聊tcpdump和Wireshark]]></title><link>https://blog.csdn.net/shuningzhang/article/details/139214490</link><guid>https://blog.csdn.net/shuningzhang/article/details/139214490</guid><author>shuningzhang</author><pubDate>Sun, 26 May 2024 14:23:56 +0800</pubDate><description><![CDATA[其中选项-i表示要监测的网络接口，-w是将抓取的数据写入的文件，后面则表示监测的协议和端口号。这里的支持是指它能将我们抓取的二进制数据与具体的协议字段对应起来，直接给我们展示解析后的结果，非常直观。执行上述命令后，tcpdump就处于监听数据的状态，此时我们可以通过redis的命令行写入一些数据来验证tcpdump抓包的过程。具体可以执行如下命令。实际上WireShark本身就是一个抓包工具，如果安装的是桌面版的操作系统，我们可将其安装到待抓包的虚拟机中，直接抓包，就不需要借助tcpdump了。]]></description><category></category></item><item><title><![CDATA[最简单文件系统的升级，增加文件创建和读写功能]]></title><link>https://blog.csdn.net/shuningzhang/article/details/137998081</link><guid>https://blog.csdn.net/shuningzhang/article/details/137998081</guid><author>shuningzhang</author><pubDate>Sat, 20 Apr 2024 14:12:17 +0800</pubDate><description><![CDATA[首先要看的自然是创建文件的实现，也就是create函数的实现，具体代码如下所示。需要注意的是，在init函数中我们调用了syslog函数，该函数用于向系统日志中记录一条日志，方便我们了解程序的运行情况。当然我们最终实现的文件系统肯定是基于硬盘的，目前的设计思路是为了降低学习的门槛和坡度，达到循序渐进的目的。这里文件的描述信息是通过一个名称为inode的结构体表示的，这也是模仿的Linux文件系统中的概念。打开文件的函数实现也是非常简单的，我们只需要查询一下map，看看要打开的文件是否存在。]]></description><category></category></item><item><title><![CDATA[基于Fuse的最简单的文件系统]]></title><link>https://blog.csdn.net/shuningzhang/article/details/136120772</link><guid>https://blog.csdn.net/shuningzhang/article/details/136120772</guid><author>shuningzhang</author><pubDate>Thu, 15 Feb 2024 15:37:45 +0800</pubDate><description><![CDATA[首先我们介绍一下什么是文件系统。文件系统是一个将硬盘的线性地址转换为层级结构的软件系统，其核心是给用户呈现层级结构的目录树（如下图所示）。在文件系统中有两个非常重要的概念，一个是文件，另外一个是目录（或者文件夹）。其中目录是一个容器，可以存储文件或者目录（称为子目录）。文件是存储数据的实体，我们的数据都是以文件的形态进行存储的。文件有很多种类，比如视频文件、音频文件、Word文档和文本文件等等。]]></description><category></category></item><item><title><![CDATA[分布式虚拟文件系统，如何实现多种存储系统的融合]]></title><link>https://blog.csdn.net/shuningzhang/article/details/135930147</link><guid>https://blog.csdn.net/shuningzhang/article/details/135930147</guid><author>shuningzhang</author><pubDate>Tue, 30 Jan 2024 12:27:54 +0800</pubDate><description><![CDATA[为了给不同的计算框架提供存储服务，存储的服务类型也是很多，常见的如AWS的S3存储、NFS文件系统和Ceph分布式系统等。如下是Alluxio在计算和存储系统中的关系图，可以看到Alluxio以存储系统为后端，可以管理S3、HDFS和文件系统等多种类型的存储系统，进而为计算平台提供目前市面上常见协议的接口。Alluxio利用的是本地存储空间，我们可以在Alluxio目录下找到一个名称为underFSStorage的目录，刚才我们拷贝的文件都在这里。同时，我们可以通过该GUI浏览存储系统中的资源。]]></description><category></category></item><item><title><![CDATA[全面了解SSD，SSD关键术语全面解析]]></title><link>https://blog.csdn.net/shuningzhang/article/details/135683025</link><guid>https://blog.csdn.net/shuningzhang/article/details/135683025</guid><author>shuningzhang</author><pubDate>Thu, 18 Jan 2024 20:05:54 +0800</pubDate><description><![CDATA[SMART（Self-Monitoring, Analysis and Reporting Technology，自我监控、分析和报告技术）：前面多次提到过这个术语，这是一个硬盘健康状态监控机制，可以提供 SSD 的各种健康状态信息，包括上述的 TBW 和 PE Cycles，以及其他如温度、错误率等信息。Wear Leveling（磨损均衡）：由于SSD的存储单元有擦写次数的限制，SSD控制器的算法会尽量保证闪存芯片的存储单元之间均匀分配写入操作，以最大限度地延长SSD的寿命。]]></description><category></category></item><item><title><![CDATA[为什么都说NFS读写性能差，如何进行优化？]]></title><link>https://blog.csdn.net/shuningzhang/article/details/133490109</link><guid>https://blog.csdn.net/shuningzhang/article/details/133490109</guid><author>shuningzhang</author><pubDate>Mon, 02 Oct 2023 13:06:53 +0800</pubDate><description><![CDATA[如下图是通过Wireshark抓取的网络通信的数据包，可以看出，NFS在访问文件的时候客户端与服务端有的交互除了WRITE之外，还有很多其它的交互，包括ACCESS、LOOKUP和SETATTR等。核心原则是减少客户端与服务端的交互次数，因此我们在访问文件的时候应该尽量保持文件的打开状态，避免重复打开关闭文件，这样NFS全路径的逐级检查。但是，如果是自己开发的应用程序， 在保存数据的时候尽量以大文件的形式，而非小文件的形式，这对性能是有益的。所以，对于一个长路径进行逐级的确认也是必须的。]]></description><category></category></item><item><title><![CDATA[企业级磁盘阵列存储系统由硬到软全析]]></title><link>https://blog.csdn.net/shuningzhang/article/details/133364555</link><guid>https://blog.csdn.net/shuningzhang/article/details/133364555</guid><author>shuningzhang</author><pubDate>Wed, 27 Sep 2023 22:02:40 +0800</pubDate><description><![CDATA[所以，存储系统在设计的时候采用双机互备的方式，当其中一个系统出现问题的时候，另外一个系统可以接管服务，从而保证存储服务的连续性。如下图是V7000的管理界面，在该界面中最左侧的是物理硬盘，包括控制器内置硬盘和扩展柜的硬盘。存储软件栈的最上层是协议层。企业级磁盘阵列是由一组设备构成的存储系统，主要包括两种类型的设备，分别是控制器和扩展柜，其中控制器只有一台，扩展柜可以没有，也可以有多台。所以，除了CPU和内存，其它部件都不需要控制器关机就可以更换，从而更进一步的提高系统的可用性，降低业务中断的时间。]]></description><category></category></item><item><title><![CDATA[对象存储，从单机到分布式的演进]]></title><link>https://blog.csdn.net/shuningzhang/article/details/133364159</link><guid>https://blog.csdn.net/shuningzhang/article/details/133364159</guid><author>shuningzhang</author><pubDate>Wed, 27 Sep 2023 21:31:28 +0800</pubDate><description><![CDATA[纠删码技术不是简单的将数据存储在多个节点上，而是将原始数据切割为若干数据块，并计算出多个校验数据块，然后将原始数据块和校验数据块存储在不同的节点上。其中副本的存放位置是通过设备ID来表示的。虽然在底层数据是分散在多个节点上的，但给用户呈现的单一的命名空间，也就是用户并不会感知到底层是由多个节点构成的。在实际生产中并不会使用单机部署的对象存储，原因是如果服务器宕机，那么我们就无法访问其中的数据了，也就是所谓的单点故障问题。所以，对于企业级的对象存储，通常采用的是分布式的架构，也就是数据会被存储在多个节点上。]]></description><category></category></item><item><title><![CDATA[什么是云存储，从对象存储说起？]]></title><link>https://blog.csdn.net/shuningzhang/article/details/132890652</link><guid>https://blog.csdn.net/shuningzhang/article/details/132890652</guid><author>shuningzhang</author><pubDate>Thu, 14 Sep 2023 21:03:55 +0800</pubDate><description><![CDATA[云存储与传统存储的区别在于，云存储中的资源通常通过互联网可以直接访问，而传统存储通常不对外提供直接访问的接口。在《存储系统形态之争，从块存储到统一存储》一文中我们提到了对象存储的概念，知道目前很多企业级存储都是支持对象存储的，比如EMC、NetApp和华为等。在启动服务时包含两个参数，分别时console的地址端口信息和数据的存储路径（需要注意的是，在生产环境数据通常是要存储在独立的硬盘上的）。在本文中，我们介绍了对象存储的基本概念，并对块存储、文件系统和对象存储提供的功能进行了概要的对比。]]></description><category></category></item><item><title><![CDATA[SPDK的块设备抽象层，从一个简单的示例程序讲起]]></title><link>https://blog.csdn.net/shuningzhang/article/details/132069307</link><guid>https://blog.csdn.net/shuningzhang/article/details/132069307</guid><author>shuningzhang</author><pubDate>Wed, 02 Aug 2023 18:54:15 +0800</pubDate><description><![CDATA[其他如数据读写的API，其第一个参数都是打开设备API返回的指针，第二个参数是一个IO通路（channel），IO通路与硬件的队列相对应，第三到第五个参数则是数据缓冲区、访问的位置和数据的长度，这几个参数跟Linux的read和write函数很像。为了能够实现丰富的功能，SPDK实现了一个块设备抽象层，其功能与Linux内核的块设备层类似，这个块设备抽象层称为BDEV。BDEV的下层实现对不同种类型设备的支持，在BDEV子系统初始化的时候会对调用模块初始化的函数指针进行模块的初始化，如图是基本函数调用。]]></description><category></category></item><item><title><![CDATA[深入理解SPDK读写数据的过程，从应用到NVMe驱动]]></title><link>https://blog.csdn.net/shuningzhang/article/details/131840203</link><guid>https://blog.csdn.net/shuningzhang/article/details/131840203</guid><author>shuningzhang</author><pubDate>Thu, 20 Jul 2023 21:21:16 +0800</pubDate><description><![CDATA[除了上述基本的API外，SPDK还有一些扩展功能的API，以写数据的API为例，比如支持SGL的spdk_nvme_ns_cmd_writev，以及spdk_nvme_ns_cmd_writev_with_md和spdk_nvme_ns_cmd_writev_ext等函数。回到读数据的API，可以看到其实现与写数据的API基本一样，唯一区别的地方操作码不同，写数据是SPDK_NVME_OPC_WRITE，这里是SPDK_NVME_OPC_READ。写数据的API与读数据的API参数一致，并没有明显的差异。]]></description><category></category></item><item><title><![CDATA[深入聊一下机械硬盘的相关内容]]></title><link>https://blog.csdn.net/shuningzhang/article/details/131135302</link><guid>https://blog.csdn.net/shuningzhang/article/details/131135302</guid><author>shuningzhang</author><pubDate>Fri, 09 Jun 2023 21:39:12 +0800</pubDate><description><![CDATA[本文是《数据存储通识课》合集的一部分，本合集希望通过一系列文章科普数据存储相关技术内容。同时，本系列文章不仅仅是科普，还会进行有深度解析，理论结合实现，从代码实现层面进行剖析​]]></description><category></category></item><item><title><![CDATA[初识SPDK，从SPDK的软件架构到使用实操]]></title><link>https://blog.csdn.net/shuningzhang/article/details/130903823</link><guid>https://blog.csdn.net/shuningzhang/article/details/130903823</guid><author>shuningzhang</author><pubDate>Sat, 27 May 2023 17:35:48 +0800</pubDate><description><![CDATA[本文是《数据存储通识课》合集的一部分，本合集希望通过一系列文章科普数据存储相关技术内容。同时，本系列文章不仅仅是科普，还会进行有深度解析，理论结合实现，从代码实现层面进行剖析。欢迎关注“数据存储张”，老张是深耕存储十几载，就业于存储No1公司的资深工程师。]]></description><category></category></item></channel></rss>