专栏首页皮振伟的专栏[linux][storage]Linux存储栈

[linux][storage]Linux存储栈

前言: 随着Linux的版本升高,存储栈的复杂度也随着增加。作者在这里简单介绍目前Linux存储栈。 分析: 1,storage stack

在用户态,可以看到的磁盘主要有几种类型: a,/dev/vdx类设备。虚拟化场景下的virtio-blk设备。 b,/dev/sdx类设备。通常所说的scsi类型的磁盘,但是目前,包括sata,sas,ide,甚至usb磁盘,都会接入到scsi层,用户态看到的就是/dev/sdx设备。 c,/dev/sgx设备,sg是scsi generic的缩写。 d,文件系统,并且后端设备在本地。例如上图的/mnt/xfs是使用xfs来mount的。 e,网络文件系统,包括nfs,cifs。后端是在远端,用网络文件系统实现的。 f,远端块设备。上图中使用iscsi协议挂载在本地的块设备。 2,vfs vfs的主要作用就是抽象,各种各样的文件系统都有各自的实现,但是用户态的读写始终就是read,write,readv,writev,pread,pwrite等等几个API。 另外就是缓存的管理。page cache,buffer,以及文件映射等高级功能,都是vfs实现的。 无论是读写文件,读写设备,ioctl等,都是由vfs提供的通用的API,实现 了强大的“一切皆文件”。 如上图,尽管后端、驱动、层次各不相同,但是经过vfs的抽象,都成了“文件”。 3,virtio-blk 第一条蓝色的路径。在图中示例,使用裸数据的方式访问,没有经过文件系统,直接到了块层。块层把io请求分发给virtio-blk驱动。注意,这里virtio驱动最后会把数据写入到内存中(也就是vring buf,并不是写入到具体的设备中),然后还要访问PCI设备,因为virtio-blk本身就是一个虚拟的PCI设备,guest写入数据后,需要通知host来处理(也就是kick host)。 4,block raw io 如图的第二条绿色路径。物理上,是一块SATA盘。用户使用裸数据的方式访问,经过vfs,并不需要具体的文件系统处理,vfs把请求转到通用块层,块层继续把请求转成scsi请求,scsi generic layer继续向下请求,最后通过PCI协议出来请求数据。 物理上,HBA卡,RAID卡,或者其他的scsi控制器,通过PCI / PCI-e接口连接到主板上。接到PCI请求之后,解释数据,最后把scsi cmd发送给磁盘控制器 。 图中没有画出来virtio-scsi,virtio-scsi也是一种虚拟的scsi控制器。也是接入到通过的scsi generic layer中。 5,sg io 如上图,第三条紫色的路径。用户直接使用scsi cmd来访问设备。 注意,因为没有经过vfs的管理,就没有了cache。绕开了通用块层,io合并等高级特性也没有。 一般是宿主机使用scsi passthrough的方式,把物理磁盘透传给虚拟机的时候使用。 6, 文件系统 例如上图的第四条红色的路径,/mnt/xfs是使用xfs来mount的。 有xfs来支持,可以做文件映射,有page cache,有truncate,seek data&seek hole,日志恢复等等。对于一般用户来说,这种方式是使用最多的。 xfs(或者ext4)具体做的事情,就是把磁盘的裸数据,用自己的方式组织起来,更加容易操作,甚至断电的数据恢复等等。 7,网络文件系统 例如上图的第五条深绿色的路径,/mnt/nfs是使用nfs来mount的。 用户请求经过vfs,vfs并不会把请求交给通用块层,而是转发到socket。 数据在socket中经过ipv4的网络协议栈,最终net-device执行xmit,网卡驱动把数据转化成PCI请求。 物理上,网卡是一个PCI设备。PCI主桥通过PCI的地址BUS,DEVICE,FUNCTION的组合找到了设备,把请求发送给网卡,网卡解析数据后,发送的链路层。 8,iscsi iscsi的实现上,虚拟出来hba,iscsi的LUN就成为挂载到hba上block 设备。挂载成功后,lsscsi命令可以看到对应的块设备。 虚拟hba,把后端数据通过socket收发。 使用方式上,一种是直接使用libiscsi,直接操作。一种是挂载iscsi到本地的sdx设备,裸数据访问,或者格式化文件系统后再使用。 9,loop设备 loop设备是虚拟块设备。 loop设备中,设置了真正后端的file(这个file可以是真正的文件),和对应的file operation。 向loop设备中读写,loop设备经过转化操作,转到真正的后端的file operation中读写。 10,LVM Logical Volume Manager技术,这里简单说一下它的原理: a,内核已经有了虚拟块设备的能力。(例如上文的iscsi块设备,就不是真正的块设备) b,那么是可以虚拟出来本地的一个新的块设备 c,块设备的后端,是使用hash算法实现的,它的数据可以分散到真正的几块物理盘上 除此之外,LVM有更多的逻辑概念:PV(physical volume),VG(volume group),LV(logical volume),PE(physical extent)等。 理解LVM的逻辑的核心在于上文的图中:理解清楚存储栈的层次关系,虚拟块设备到物理块设备之间的映射。 11,uninterruptable sleep 使用Linux的人,或多或少可能都遇到过进程的D状态,也就是uninterruptable sleep。例如用iptables在nfs的服务端挡住2049端口,或者服务端的网卡直接down,那么在客户端访问nfs上文件的时候就会卡住,而且不能被杀掉。(原因是处于uninterruptable sleep状态的task不能被信号唤醒) 网络波动同样也会影响到iscsi块设备。 12,其他问题 scsi已经是 很成熟的框架了,但是在Linux4.14上,作者还是看到了scsi引起的kernel die。作者在前文《[linux][kernel]list_del引起的kernle die分析 》中分析了那次kernel die的原因和分析方法,就是遇到了这个bug。 13,解决方法 随着虚拟化技术的成熟,性能不断提高。尝试把存储栈迁移到虚拟机中,也许是一个不错的选择。哪怕虚拟机真的出现了kernel die,也不会真正影响到宿主机的运行,以及宿主机上的业务至少还是没有崩溃的。宿主机上迅速重新启动虚拟机,就可以快速恢复相关的服务。

本文分享自微信公众号 - AlwaysGeek(gh_d0972b1eeb60),作者:AlwaysGeek

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [linux][kernel]list_del引起的kernle die分析

    前言: 构造网络的恶劣环境:中断,恢复,中断,恢复。。。 复现了到kernel die的BUG。经过分析,是对同一个entry执行了两次list_del导致。 ...

    皮振伟
  • [Linux][mm]TLB shootdown和读取smaps对性能的影响 ​

    作者遇到了业务的一个性能抖动问题,在这里介绍一下它的原因和解决办法。 分析 1,page fault 在Linux上,进程分配到的内存是虚拟内存,经过内核...

    皮振伟
  • [kvm][virt]MMIO技术分析

    前言: 简单回顾一下前文,《内存映射技术分析》描述了虚拟内存的管理、内存映射;《物理内存管理》介绍了物理内存管理。《内存回收》介绍了一下PFRA内存回收。 上述...

    皮振伟
  • 为什么你学习js进展不大?

    许多同学在学习js的时候找不到方向,不知道往哪方面学,东一下西一下的不得其法,导致学习了许久,依然进展不大。这时候难免会有抱怨、灰心的情况,会觉得别人学起来感觉...

    web前端教室
  • JAVA之学习biginteger类的使用和bigdecimal类的使用

    吾爱乐享
  • FreeRTOS 任务调度 任务切换

    前面文章 < FreeRTOS 任务调度 任务创建 > 介绍了 FreeRTOS 中如何创建任务以及其具体实现。 一般来说, 我们会在程序开始先创建若干个任务...

    orientlu
  • 每天一道剑指offer-链表中环的入口结点

    乔戈里
  • ​《爱上潘大师》系列-你还记得那年的DataFrame吗

    这就造成有时候这一篇文章的概念会及其依赖上一篇文章,所以呢,花个两三分钟复习一下上一篇,你会更好理解这篇文章。

    知秋小一
  • 面试心得与总结——BAT、网易、蘑菇街

    之前实习的时候就想着写一篇面经,后来忙就给忘了,现在找完工作了,也是该静下心总结一下走过的路程了,我全盘托出,奉上这篇诚意之作,希望能给未来找工作的人一点指引和...

    用户4447430
  • 机器学习 - 模型离线评估

    模型上线之前可以利用测试数据集进行离线评估,主要指标可以根据具体的问题类型可以有以下的方案。

    大数据技术与机器学习

扫码关注云+社区

领取腾讯云代金券