linux下pcie ssd - CSDN
精华内容
参与话题
  • PCIe SSD作为高速缓存的两大方式

    千次阅读 2013-09-13 16:16:06
    如同实体环境中的应用情况,PCIe SSD在虚拟环境中的典型应用方式亦是这两种:将PCIe SSD作为数据存储磁盘或是将PCIe SSD作为高速缓存。  过去2、3年来,市场上已经出现了不少采用PCIe接口的Flash内存存储产品...
    【文章摘要】解决支持性问题后,接下来便是虚拟环境中如何使用PCIe SSD的问题。如同实体环境中的应用情况,PCIe SSD在虚拟环境中的典型应用方式亦是这两种:将PCIe SSD作为数据存储磁盘或是将PCIe SSD作为高速缓存。

      过去2、3年来,市场上已经出现了不少采用PCIe接口的Flash内存存储产品,这些产品通常是一张内含控制器芯片与Flash内存颗粒、采用PCIe×4或×8接口的PCIe适配卡。将这种适配卡安装到服务器内,然后安装驱动程序,操作系统即可将Flash内存空间辨识为区块存储设备,接下来对其进行初始化与格式化后,就能像一般硬盘一样使用这种PCIe SSD的空间。

      硬件支持问题

      不过要在虚拟平台内使用PCIe SSD,却面临了硬件支持方面的障碍。必须让Hypervisor识别与驱动PCIe SSD设备,才能在虚拟环境中使用PCIe SSD的存储空间。但多数企业级PCIe SSD产品,目前都只提供Windows或Linux操作系统的驱动程序,缺乏对于当前最重要的虚拟平台VMware的支持,以致无法在VMware虚拟环境中使用PCIe SSD.

      通过整理几种主要企业级PCIe SSD产品的支持平台情况(如上图),发现并不是所有厂商都支持VMware虚拟环境,在所列出的11家供货商中,只有5家厂商的PCIe SSD产品,可提供适用于VMware环境的驱动程序,其余产品大都只有Windows与Linux两种平台的驱动程序,这也造成欲在这个环境使用PCIe SSD的用户,产品选择较为有限。

      当然若换成Hyper-V平台,硬件支持问题便小得多,只要是兼容于Windows Server 2008的存储设备,大都能为Hyper-V使用。但Hyper-V的整体功能与在企业环境中的普及度,仍与VMware有相当差距,而且更换平台牵扯较大,不太可能有用户仅仅是为了使用某种存储硬件,而将VMware换成Hyper-V.

      解决支持性问题后,接下来便是虚拟环境中如何使用PCIe SSD的问题。如同实体环境中的应用情况,PCIe SSD在虚拟环境中的典型应用方式亦是这两种:

      (1)将PCIe SSD作为数据存储磁盘

      也就是将PCIe SSD的空间作为虚拟平台的文件系统空间,或是虚拟机直接存取的区块型存储设备。

      考虑到成本与容量需求问题,显然不可能把全部的虚拟机,全都搬移到PCIe SSD的空间内,因此必须采取分层存储的概念,将最需要I/O效能的虚拟机,迁移到PCIe SSD提供的存储空间上。其余虚拟机则仍留在传统硬盘构成的存储空间内。

      只要虚拟平台的Hypervisor能识别与驱动PCIe SSD设备,就能将其格式化为可供虚拟机使用的文件系统或存储设备。

      (2)将PCIe SSD作为高速缓存

      将PCIe SSD的空间作为DRAM外的第二层高速缓存,借由PCIe SSD提供的数百GB空间,来提高快取命中率,降低前端服务器存取后端传统硬盘的机率。

      要将PCIe SSD作为虚拟平台的高速缓存,必须通过专门软件的支持,目前能提供这种型态应用的产品只有两家:Fusion-io用于搭配该公司PCIe SSD产品的ioTurbine软件,以及EMC刚推出的VFCache。

    展开全文
  • 1 查看是否安装了mdadm软件 # rpm -qa|grep mdadm 4.2 如果未安装,则使用yum 方式安装。 ...准备工作完毕,下面可以着手创建raid 了。...创建RAID0 需要两块硬盘,所以我们拿/dev/sdb 和/dev/sdc 来实验。...

    1 查看是否安装了mdadm软件

    # rpm -qa|grep mdadm

     

    4.2 如果未安装,则使用yum 方式安装。

     

    准备工作完毕,下面可以着手创建raid 了。

    五、创建RAID0

    5.1 新建分区

    创建RAID0 需要两块硬盘,所以我们拿/dev/sdb 和/dev/sdc 来实验。

    # fdisk /dev/sdb        //对sdb 进行分区

    输入"m", 获取帮助,输入"p", 查看分区前磁盘状态,其他Command action 具体含义请自行Google, Baidu。

     

    输入"n" 新建分区,这里我们将整个磁盘都划分成一个分区,然后输入"p" 查看分区情况。

     

    5.2 修改分区类型

    默认新建分区的类型是Linux,代号83,我们需要将其修改为raid 类型。输入"t" ,然后输入"L" 列出所有的文件格式,这里我们选择"fd Linux raid auto", 输入"fd",然后再输入"p" 查看分区情况,这是分区格式已经变成了Linux raid autodetect.

     

    5.3 保存分区

    输入"w" 保存分区。

     

    使用同样方法对/dev/sdc 进行分区操作。

    5.4 同步分区情况

    使用partprobe 命令同步分区情况。

     

    5.5 查看现在的状态

    # fdisk -l /dev/sdb /dev/sdc

     

    5.6 开始创建RAID0

    # mdadm -C /dev/md0 -ayes -l0 -n2 /dev/sd[b,c]1

     

    说明:

    -C  --create   创建阵列;

    -a  --auto    同意创建设备,如不加此参数时必须先使用mknod 命令来创建一个RAID设备,不过推荐使用-a yes参数一次性创建;

    -l   --level   阵列模式,支持的阵列模式有 linear, raid0, raid1, raid4, raid5, raid6, raid10, multipath, faulty, container;

    -n     --raid-devices    阵列中活动磁盘的数目,该数目加上备用磁盘的数目应该等于阵列中总的磁盘数目;

    /dev/md0     阵列的设备名称;

    /dev/sd{b,c}1  参与创建阵列的磁盘名称;

    5.7 查看raid0 状态

    # cat /proc/mdstat

    # mdadm -D /dev/md0

     

    说明:Raid Level : 阵列级别; 

       Array Size : 阵列容量大小;

       Raid Devices : RAID成员的个数;

       Total Devices : RAID中下属成员的总计个数,因为还有冗余硬盘或分区,也就是spare,为了RAID的正常运珩,随时可以推上去加入RAID的;

       State : clean, degraded, recovering 状态,包括三个状态,clean 表示正常,degraded 表示有问题,recovering 表示正在恢复或构建;

       Active Devices : 被激活的RAID成员个数;

       Working Devices : 正常的工作的RAID成员个数;

       Failed Devices : 出问题的RAID成员;

       Spare Devices : 备用RAID成员个数,当一个RAID的成员出问题时,用其它硬盘或分区来顶替时,RAID要进行构建,在没构建完成时,这个成员也会被认为是spare设备;

       UUID : RAID的UUID值,在系统中是唯一的;

    5.8 创建RAID 配置文件/etc/mdadm.conf

    RAID 的配置文件为/etc/mdadm.conf,默认是不存在的,需要手工创建。

    该配置文件的主要作用是系统启动的时候能够自动加载软RAID,同时也方便日后管理。但不是必须的,推荐对该文件进行配置。

    我们这里需要创建这个文件,测试中发现,如果没有这个文件,则reboot 后,已经创建好的md0 会自动变成md127。

    /etc/mdadm.conf 文件内容包括:

    由DEVICE 选项指定用于软RAID的所有设备,和ARRAY 选项所指定阵列的设备名、RAID级别、阵列中活动设备的数目以及设备的UUID号。

    5.8.1 创建/etc/mdadm.conf

    # echo DEVICE /dev/sd{b,c}1 >> /etc/mdadm.conf

    # mdadm –Ds >> /etc/mdadm.conf

    5.8.2 修改配置文件

    当前生成的/etc/mdadm.conf 文件内容并不符合所规定的格式,所以也是不生效的,这时需要手工修改该文件内容为如下格式:

    # cat /etc/mdadm.conf

    DEVICE /dev/sdb1 /dev/sdc1

    ARRAY /dev/md0 level=raid0 num-devices=2 UUID=5160ea40:cb2b44f1:c650d2ef:0db09fd0

    5.9 格式化磁盘阵列

    # mkfs.ext4 /dev/md0

     

    5.10 建立挂载点并挂载

    # mkdir /raid0

    # mount /dev/md0 /raid0/

     

    可以看到,/dev/md0 的可用大小为9.9G。

    5.11 写入/etc/fstab

    为了下次开机还能正常使用我们的RAID设备,需要将挂载的信息写入/etc/fstab 文件中。

     

    然后reboot 测试开机是否自动挂载,raid0 创建完毕。

     

    转载于:https://www.cnblogs.com/niezhongle/p/10917842.html

    展开全文
  • Linux中nvme驱动详解

    万次阅读 2018-05-25 11:35:03
    NVMe离不开PCIe,NVMe SSDPCIe的endpoint。PCIe是x86平台上一种流行的bus总线,由于其Plug and Play的特性,目前很多外设都通过PCI Bus与Host通信,甚至不少CPU的集成外设都通过PCI Bus连接,如APIC等。 NVMe SSD...

    NVMe离不开PCIe,NVMe SSD是PCIe的endpoint。PCIe是x86平台上一种流行的bus总线,由于其Plug and Play的特性,目前很多外设都通过PCI Bus与Host通信,甚至不少CPU的集成外设都通过PCI Bus连接,如APIC等。

      NVMe SSD在PCIe接口上使用新的标准协议NVMe,由大厂Intel推出并交由nvmexpress组织推广,现在被全球大部分存储企业采纳

    1.   NVMe Command

    NVMe Host(Server)和NVMe Controller(SSD)通过NVMe Command进行信息交互。NVMe Spec中定义了NVMe Command的格式,占用64字节。

    NVMe Command分为Admin Command和IO Command两大类,前者主要是用于配置,后者用于数据传输。

      NVMe Command是Host与SSD Controller交流的基本单元,应用的I/O请求也要转化成NVMe Command。

     

           详见《NVM_Express_Revision》

    2.   PCI总线

    在系统启动时,BIOS会枚举整个PCI的总线,之后将扫描到的设备通过ACPI tables传给操作系统。当操作系统加载时,PCI Bus驱动则会根据此信息读取各个PCI设备的Header Config空间,从class code寄存器获得一个特征值。

    class code是PCI bus用来选择哪个驱动加载设备的唯一根据。NVMe Spec定义的class code是010802h。NVMe SSD内部的Controller PCIe Header中class code都会设置成010802h。


    所以,需要在驱动中指定class code为010802h,将010802h放入pci_driver nvme_driver的id_table。之后当nvme_driver注册到PCI Bus后,PCI Bus就知道这个驱动是给class code=010802h的设备使用的。nvme_driver中有一个probe函数,nvme_probe(),这个函数才是真正加载设备的处理函数。

    #define PCI_CLASS_STORAGE_EXPRESS       0x010802

    static const struct pci_device_id nvme_id_table[] = {

    …….

    { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) },

    ……

    };

     

    3.   单独编译NVME驱动

    在老版本的源码中,可以在源码路径drivers/block中,增加Makefile内容如下,进行编译:

    obj-$(CONFIG_BLK_DEV_NVME)      += nvme.o

    nvme-objs := nvme-core.o nvme-scsi.o

    PWD := $(shell pwd)

    default:

            make -C /usr/src/kernels/3.10.0-327.x86_64/ M=$(PWD) modules

    clean:

            rm rf *.o *.ko

    然后直接make 即可生成nvme.ko文件。

    关于Makefile可以参考如下:

    KERNELVER ?= $(shell uname -r)

    KERNROOT = /lib/modules/$(KERNELVER)/build

    nvme:

        $(MAKE) -C $(KERNROOT) M=`pwd`/drivers/block                                            

    clean:

       $(MAKE) -C $(KERNROOT) M=`pwd`/drivers/block clean

    主要就两个文件:nvme-core.cnvme-scsi.c

           不过,最新的代码位于drivers/nvme/host,主要是core.cpci.c

    4.   注册和初始化

    我们知道首先是驱动需要注册到PCI总线。那么nvme_driver是如何注册的呢?

    当驱动被加载时就会调用nvme_init(drivers/nvme/host/pci.c)函数。在这个函数中,调用了kernel的函数pci_register_driver,注册nvme_driver,其结构体如下。

    static struct pci_driver nvme_driver = {

            .name           = "nvme",

            .id_table       = nvme_id_table,

            .probe          = nvme_probe,

            .remove         = nvme_remove,

            .shutdown       = nvme_shutdown,

            .driver         = {      

                    .pm     = &nvme_dev_pm_ops,

            },              

            .sriov_configure = nvme_pci_sriov_configure,

            .err_handler    = &nvme_err_handler,

    };

    这样PCI bus上就多了一个pci_driver nvme_driver。当读到一个设备的class code是010802h时,就会调用这个nvme_driver结构体的probe函数, 也就是说当设备和驱动匹配了之后,驱动的probe函数就会被调用,来实现驱动的加载。

    Probe函数主要完成四个工作:

    1.映射设备的bar空间到内存虚拟地址空间

    2.设置admin queue;

    3.添加nvme namespace设备;

    4.添加nvme Controller,提供ioctl接口。

           PCIe的Header空间和BAR空间是PCIe的关键特性。Header空间是PCIe设备的通有属性,所有的PCIe Spec功能和规范都在这里实现;BAR空间则是设备差异化的具体体现,BAR空间的定义决定了这个设备是网卡,SSD还是虚拟设备。BAR空间是Host和PCIe设备进行信息交互的重要介质,BAR空间的数据实际存储在PCIe设备上。Host这边给PCIe设备分配的地址资源,并不占用Host的内存资源。当读写BAR空间时,都需要通过PCIe接口(通过PCI TLP消息)进行实际的数据传输。

    接着来看下nvme_driver结构体中的.probe函数nvme_probe。

    static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)

    {

            int node, result = -ENOMEM;

            struct nvme_dev *dev;    

            unsigned long quirks = id->driver_data;

     

            node = dev_to_node(&pdev->dev);

            if (node == NUMA_NO_NODE)

                    set_dev_node(&pdev->dev, first_memory_node);

     

            dev = kzalloc_node(sizeof(*dev), GFP_KERNEL, node);

            if (!dev)       

                    return -ENOMEM;          

     

            dev->queues = kcalloc_node(num_possible_cpus() + 1,

                            sizeof(struct nvme_queue), GFP_KERNEL, node);

            if (!dev->queues)

                    goto free;               

     

            dev->dev = get_device(&pdev->dev);

            pci_set_drvdata(pdev, dev);

     

            result = nvme_dev_map(dev);

            if (result)

                    goto put_pci;            

     

            INIT_WORK(&dev->ctrl.reset_work, nvme_reset_work);

            INIT_WORK(&dev->remove_work, nvme_remove_dead_ctrl_work);

            mutex_init(&dev->shutdown_lock);

            init_completion(&dev->ioq_wait);

     

            result = nvme_setup_prp_pools(dev);

            if (result)     

                    goto unmap;              

     

            quirks |= check_vendor_combination_bug(pdev);

     

            result = nvme_init_ctrl(&dev->ctrl, &pdev->dev, &nvme_pci_ctrl_ops,

                            quirks);                 

            if (result)     

                    goto release_pools;      

     

            dev_info(dev->ctrl.device, "pci function %s\n", dev_name(&pdev->dev));

     

            nvme_reset_ctrl(&dev->ctrl);

     

            return 0;

    release_pools:

            nvme_release_prp_pools(dev);

     unmap:

            nvme_dev_unmap(dev);

     put_pci:

            put_device(dev->dev);

     free:

            kfree(dev->queues);

            kfree(dev);

            return result;

    }

           nvme_probe函数会通过nvme_dev_map函数(层层调用之后)映射设备的bar空间到内核的虚拟地址空间当中, pci协议里规定了pci设备的配置空间里有6个32位的bar寄存器,代表了pci设备上的一段内存空间,可以通过writel, readl这类函数直接读写寄存器。

    并分配设备数据结构nvme_dev,队列nvme_queue等,结构体如下。

    struct nvme_dev {

            struct nvme_queue *queues;

            struct blk_mq_tag_set tagset;

            struct blk_mq_tag_set admin_tagset;

            u32 __iomem *dbs;

            struct device *dev;

            struct dma_pool *prp_page_pool;

            struct dma_pool *prp_small_pool;

            unsigned online_queues;

            unsigned max_qid;

            int q_depth;

            u32 db_stride;

            void __iomem *bar;

            unsigned long bar_mapped_size;

            struct work_struct remove_work;

            struct mutex shutdown_lock;

            bool subsystem;

            void __iomem *cmb;

            pci_bus_addr_t cmb_bus_addr;

            u64 cmb_size;

            u32 cmbsz;

            u32 cmbloc;

            struct nvme_ctrl ctrl;

            struct completion ioq_wait;

     

            /* shadow doorbell buffer support: */

            u32 *dbbuf_dbs;

            dma_addr_t dbbuf_dbs_dma_addr;

            u32 *dbbuf_eis;

            dma_addr_t dbbuf_eis_dma_addr;

     

            /* host memory buffer support: */

            u64 host_mem_size;

            u32 nr_host_mem_descs;

            dma_addr_t host_mem_descs_dma;

            struct nvme_host_mem_buf_desc *host_mem_descs;

            void **host_mem_desc_bufs;

    };

           每个设备至少两个队列,一个是admin管理命令,一个是给I/O命令,这个队列概念和之前介绍块驱动中的磁盘队列一个道理,只是那个驱动比较基础,所以命令和IO并不区分队列,具体结构体如下。

    struct nvme_queue {

            struct device *q_dmadev;

            struct nvme_dev *dev;

            spinlock_t q_lock;

            struct nvme_command *sq_cmds;

            struct nvme_command __iomem *sq_cmds_io;

            volatile struct nvme_completion *cqes;

            struct blk_mq_tags **tags;

            dma_addr_t sq_dma_addr;

            dma_addr_t cq_dma_addr;

            u32 __iomem *q_db;

            u16 q_depth;

            s16 cq_vector;

            u16 sq_tail;

            u16 cq_head;

            u16 qid;

            u8 cq_phase;

            u8 cqe_seen;

            u32 *dbbuf_sq_db;

            u32 *dbbuf_cq_db;

            u32 *dbbuf_sq_ei;

            u32 *dbbuf_cq_ei;

    };

     

    继续说nvme_probe函数,nvme_setup_prp_pools,主要是创建dma pool,后面可以通过dma函数从dma pool中获得memory。主要是为了给4k128k的不同IO来做优化。

    nvme_init_ctrl函数会创建NVMe控制器结构体,这样在后后续probe阶段时候用初始化过的结构,其传入的操作函数集是nvme_pci_ctrl_ops

    static const struct nvme_ctrl_ops nvme_pci_ctrl_ops = {

            .name                   = "pcie",

            .module                 = THIS_MODULE,

            .flags                  = NVME_F_METADATA_SUPPORTED,

            .reg_read32             = nvme_pci_reg_read32,

            .reg_write32            = nvme_pci_reg_write32,

            .reg_read64             = nvme_pci_reg_read64,

            .free_ctrl              = nvme_pci_free_ctrl,

            .submit_async_event     = nvme_pci_submit_async_event,

    };

           另外NVMe磁盘的操作函数集,例如打开,释放等,结构体如下:

    static const struct block_device_operations nvme_fops = {

            .owner          = THIS_MODULE,

            .ioctl          = nvme_ioctl,

            .compat_ioctl   = nvme_ioctl,

            .open           = nvme_open,

            .release        = nvme_release,

            .getgeo         = nvme_getgeo,

            .revalidate_disk= nvme_revalidate_disk,

            .pr_ops         = &nvme_pr_ops,

    };

    5.   NVMe的IO

    机械硬盘时代,由于其随机访问性能差,内核开发者主要放在缓存I/O、合并I/O等方面,并没有考虑多队列的设计;而Flash的出现,性能出现了戏剧性的反转,因为单个CPU每秒发出IO请求数量是有限的,所以促进了IO多队列开发。

           驱动中的队列创建,通过函数kcalloc_node如下,可以看到队列数量是和系统中所拥有的cpu数量有关。

    dev->queues = kcalloc_node(num_possible_cpus() + 1,

                            sizeof(struct nvme_queue), GFP_KERNEL, node);

    Queue有的概念,那就是队列深度,表示其能够放多少个成员。在NVMe中,这个队列深度是由NVMe SSD决定的,存储在NVMe设备的BAR空间里。

    队列用来存放NVMe Command,NVMe Command是主机与SSD控制器交流的基本单元,应用的I/O请求也要转化成NVMe Command。

    不过需要注意的是,就算有很多CPU发送请求,但是块层并不能保证都能处理完,将来可能要绕过IO栈的块层,不然瓶颈就是操作系统本身了。

    当前Linux内核提供了blk_queue_make_request函数,调用这个函数注册自定义的队列处理方法,可以绕过io调度和io队列,从而缩短io延时。Block层收到上层发送的IO请求,就会选择该方法处理,如下图:

    从图中可 以看出NVMe SSD I/O路径并不经传统的块层。


    6.   DMA

    PCIe有个寄存器位Bus Master Enable,这个bit置1后,PCIe设备就可以向Host发送DMA Read Memory和DMA Write Memory请求。

    当Host的driver需要跟PCIe设备传输数据的时候,只需要告诉PCIe设备存放数据的地址就可以。

    NVMe Command占用64个字节,另外其PCIe BAR空间被映射到虚拟内存空间(其中包括用来通知NVMe SSD Controller读取Command的Doorbell寄存器)。

    NVMe数据传输都是通过NVMe Command,而NVMe Command则存放在NVMe Queue中,其配置如下图。


    其中队列中有Submission Queue,Completion Queue两个。

    7.   参考

    NVMe SPEC http://nvmexpress.org/

    Linux Driver Information

    NVM Express driver

    Improvements in the block layer

    Analysis of NVMe Driver Source Code in linux kernel 4.5

    NVMe驱动解析——关键的BAR空间


    展开全文
  • 多块PCIe SSD插在同一个主板上时,Linux 对这几块SSD的命名
    [root@host1 ~]# fdisk -l
    
    Disk /dev/nvme0n1: 800.2 GB, 800166076416 bytes, 1562824368 sectors  ---->>>注意名字:/dev/nvme0n1
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000b8fe5
    
            Device Boot      Start         End      Blocks   Id  System
    
    Disk /dev/nvme1n1: 800.2 GB, 800166076416 bytes, 1562824368 sectors ---->>>注意名字:/dev/nvme1n1
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0xd9b47686
    
            Device Boot      Start         End      Blocks   Id  System
    /dev/nvme1n1p1            2048    20973567    10485760   83  Linux
    /dev/nvme1n1p2        20973568   997535743   488281088   83  Linux
    /dev/nvme1n1p3       997535744  1416966143   209715200   83  Linux
    
    Disk /dev/nvme2n1: 800.2 GB, 800166076416 bytes, 1562824368 sectors  ---->>>注意名字:/dev/nvme2n1
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000a74ee
    
            Device Boot      Start         End      Blocks   Id  System
    /dev/nvme2n1p1            2048    20973567    10485760   83  Linux ---->>>注意分区的名字:带p1
    /dev/nvme2n1p2        20973568  1069549567   524288000   83  Linux
    /dev/nvme2n1p3      1069549568  1488979967   209715200   83  Linux
    
    Disk /dev/sda: 1999.3 GB, 1999307276288 bytes, 3904897024 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x000a8633
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *        2048     1026047      512000   83  Linux
    /dev/sda2         1026048    68134911    33554432   82  Linux swap / Solaris
    /dev/sda3        68134912   487565311   209715200   83  Linux
    [root@host1 ~]# 
    [root@host1 ~]# uname -r
    3.10.0-327.el7.x86_64
    [root@host1 ~]# cat /etc/redhat-release 
    Red Hat Enterprise Linux Server release 7.2 (Maipo)
    [root@host1 ~]# 
    
    
    

    展开全文
  • Linux PCIe SSD NVME 性能调优篇

    千次阅读 2015-07-20 13:52:47
    怎么调优 PBlaze IV PCIe SSD NVMe。 Go! 1. 中断绑定  在Redhat 6.5中的NVMe驱动会自动把全部的中断向量绑定到core0上,如果有多个SSD, core0将会成为瓶颈。  (1) Turns off the IRQ balancer: ...
  • linux RHEL 6.8 不能认识NVMe PCIE SSD

    千次阅读 2018-02-28 16:04:05
    Red Hat Enterprise Linux 6.8HP DL380 Gen9Intel® SSD DC P3600 Series SSD drive问题 RHEL 6.8 OS 不能识别 Intel NVMe PCIE SSD drive决议 下面的链接地址说明了intel SSD DC P3600已经在RHEL 6.5以上的OS版本中...
  • PCIe SSD有没有散热问题?

    千次阅读 2017-12-18 15:11:13
    目前市场上看到的PCIe SSD,基本上都是M.2接口。M.2接口SSD的优势就是小巧轻便,占据很小的物理空间。 不过,我们都知道,PCIe SSD采用NVMe协议,读写性能都在GB/s级别,所以在这么高速读写的过程中,难免会遇到...
  • 上篇文章谈到了PCIe SSD的发展和性能追求,并介绍了NVMe用以保障QoS的IOD。Memblaze已经对IOD进行了深入的调研,设计了一系列验证试验,这篇文章将基于两个具有代表性的试验说明NVM Set对于SSD提升QoS的重要作用。...
  • PCIe SSD 性能调优--概述篇

    千次阅读 2015-07-10 22:42:25
    PCIe SSD 在您系统上如何性能达不到厂家datasheet的读写值性能怎么办?难道也有坑? 不同的服务器,不同的BIOS配置,不同的PCIe SSD Firmware, 不同的驱动,不同的操作系统,不同的文件系统可能有不同的性能。 ...
  • Linux下测试SSD硬盘读写速率

    万次阅读 2017-09-19 20:20:19
    硬盘分为机械硬盘HDD和固态硬盘SSD两种。现在固态硬盘已经是大势所趋咯。SSD用的接口是NVME。在NVME协议下面还有一层PCIe协议。HDD硬盘接口有SATA,SATA接口常用的工作模式有AHCI。SATA硬盘接口最大速率是600MBytes/...
  • linux pci/pcie驱动

    千次阅读 2018-01-02 09:38:06
    /driver/pci/probe.c /arch/powerpc/kernel/pci_64.c 在pci驱动中pci调用pci_scan_device扫描每个设备的每个功能,当发现该功能存在时(通过读设备的vendor及product ID确定),就为该设备功能建立一个完整的...
  • PCIe SSD之SFF-8639和备受关注的热插拔功能热插拔功能是PCIe SSD的一项重要功能, 能大大简化设备更换和调试步骤。特别是在服务器厂商推出支持 U.2 接口的产品后,对热插拔的需求更加广泛。热插拔在 PBlaze5 PCIe ...
  • Linux 上格式化ssd硬盘操作步骤

    千次阅读 2016-04-07 10:28:28
    Linux 上格式化ssd硬盘操作步骤 规格:240G PCIe接口ssd 关闭服务器加上新硬盘 启动服务器,以root用户登录 查看硬盘信息 fdisk –l 创建新硬盘分区 跳过,我不需要ssd分区 格式化分区: mkfs.ext4 /dev/sdp 创建...
  • PCIe SSD在KVM场景中的应用及优化实践

    千次阅读 2015-07-30 11:38:19
    部署闪存明显是解决数据中心存储瓶颈的一个重要手段,特别是PCIe SSD,对数据中心性能的提升是立竿见影的。本文以KVM架构为例,对闪存在虚拟化环境中的优化和实践做个介绍。
  • Linux 检查PCIe盘协商速率是否正确

    千次阅读 2018-10-12 08:42:26
    1、 通过命令“lspci -vvv |grep “Non-Volatile””查询被测PCIE SSD NVMe卡是否被识别到 lspci -vvv |grep “Non-Volatile” 2、通过lspci查询命令lspci -s 85:00.0 -vvvxxx |grep “Speed”(85:0.0为ID号...
  • 如何描述PCIe SSD性能的稳定性?

    千次阅读 2016-05-17 13:58:46
    业界把瞬时出现比价大性能抖动现象称为“毛刺”,譬如产生超长延时等,这里需要引入IOPS一致性和QoS来描述产品性能的稳定性。本篇文章主要讨论的是PCIe SSD的QoS指标,并介绍当下主流的降低PCIe SSD性能抖动的技术。
  • PCIe SSD 加速MongoDB

    2015-07-22 17:46:50
    MongoDB压力上来了,扛不住了...不知道Memblaze PBlaze IV PCIe SSD 是否可以解决。 1. MongoDB有必要使用PCIe SSD? 官方说法是看你的应用。哈哈! 如果你的disk IO是瓶颈那是必须有必要的。 2. 我怎么知
  • 这篇文章主要对PostgreSQL做一个介绍,并比较了在PCIe SSD(本文使用Memblaze的PBlaze4 PCIe SSD)和硬件RAID聚合的SAS磁盘两种环境,PostgreSQL数据库的联机事务处理(OLTP)的性能。
  • 最近使用Intel的P3600 SSD做测试,该闪存设备使用的是比较新的接口规范nvme,由于Intel提供的是SuSE11sp3的驱动包,不能安装在SuSE11sp2上。故使用了nvme的源码进行了编译安装。安装过程挺简单:[root@ssd~]#tar-...
  • 测试结果 iops RandRead RandWrite ReadWrite intel1 475748 288411 280112 shannon1 637484 464788 587533 shannon2 580...
1 2 3 4 5 ... 20
收藏数 1,645
精华内容 658
热门标签
关键字:

linux下pcie ssd