首页 文章 精选 留言 我的

精选列表

搜索[全模态理解],共10000篇文章
优秀的个人博客,低调大师

MaxCompute SQL原理解析及性能调优

分享内容 介绍了MaxCompute(原ODPS) SQL的基于mapreduce是如何实现的及一些使用小技巧,回顾了mapreduce各个阶段可能产生的问题及相应的处理方法,同时介绍了一些应对数据倾斜的处理方法,最后介绍了一些关于数据集构造、特征选择的技巧帮助减少资源利用。 分享嘉宾 顾茂杰 阿里云天池竞赛选手DesTiny 在天池参加过阿里移动推荐算法、新浪微博互动预测大赛、IJCAI 16,并在新浪微博互动预测大赛中获得冠军。现就职于蚂蚁金服,担任推荐平台算法工程师。 分享视频https://v.qq.com/iframe/player.html?vid=l0552ocwlax&width=670&height=376.875&auto=0 分享重点 阿里巴巴大数据-玩家社区https://yq.aliyun.

优秀的个人博客,低调大师

如何才能加深对Linux概念架构的理解

一、Linux内核在整个计算机系统中的位置 Fig 1 - 计算机系统分层结构 分层结构的原则:the dependencies between subsystems are from the top down: layers pictured near the top depend on lower layers, but subsystems nearer the bottom do not depend on higher layers. 这种子系统之间的依赖性只能是从上到下,也就是图中顶部的子系统依赖底部的子系统,反之则不行。 二、内核的作用 1.虚拟化(抽象),将计算机硬件抽象为一台虚拟机,供用户进程process使用;进程运行时完全不需要知道硬件是如何工作的,只要调用 Linux kernel 提供的虚拟接口virtual interface即可。 2.多任务处理,实际上是多个任务在并行使用计算机硬件资源,内核的任务是仲裁对资源的使用,制造每个进程都以为自己是独占系统的错觉。 PS:进程上下文切换就是要换掉程序状态字、换掉页表基地址寄存器的内容、换掉 current 指向的 task_struct 实例、换掉 PC ——>也就换掉了进程打开的文件(通过 task_struct 的 files 可以找到)、换掉了进程内存的执行空间(通过 task_struct 的 mem 可以找到)。 三、Linux内核的整体架构 Linux内核的整体架构 中心系统是进程调度器Process Scheduler,SCHED:所有其余的子系统都依赖于进程调度器,因为其余子系统都需要阻塞和恢复进程。当一个进程需要等待一个硬件动作完成时,相应子系统会阻塞这个进程;当这个硬件动作完成时,子系统会将这个进程恢复:这个阻塞和恢复动作都要依赖于进程调度器完成。 上图中的每一个依赖箭头都有原因: ◆进程调度器依赖内存管理器Memory manager:进程恢复执行时,需要依靠内存管理器分配供它运行的内存。 ◆IPC 子系统依赖于内存管理器:共享内存机制是进程间通信的一种方法,运行两个进程利用同一块共享的内存空间进行信息传递。 ◆VFS 依赖于网络接口Network Interface:支持 NFS 网络文件系统; ◆VFS 依赖于内存管理器:支持 ramdisk 设备 ◆内存管理器依赖于 VFS,因为要支持交换swapping,可以将暂时不运行的进程换出到磁盘上的交换分区swap,进入挂起状态。 四、高度模块化设计的系统,利于分工合作 只有极少数的程序员需要横跨多个模块开展工作,这种情况确实会发生,仅发生在当前系统需要依赖另一个子系统时。 硬件设备驱动hardware device drivers、文件系统模块logical filesystem modules、网络设备驱动network device drivers和网络协议模块network protocol modules这四个模块的可扩展性最高。 五、系统中的数据结构 1.任务列表Task List 进程调度器针对每个进程维护一个数据结构 task_struct;所有的进程用链表管理,形成 task list;进程调度器还维护一个 current 指针指向当前正在占用 CPU 的进程。 2.内存映射Memory Map 内存管理器存储每个进程的虚拟地址到物理地址的映射;并且也提供了如何换出特定的页,或者是如何进行缺页处理。这些信息存放在数据结构 mm_struct 中。每个进程都有一个 mm_struct 结构,在进程的 task_struct 结构中有一个指针 mm 指向次进程的 mm_struct 结构。 在 mm_struct 中有一个指针 pgd,指向该进程的页目录表(即存放页目录首地址)——>当该进程被调度时,此指针被换成物理地址,写入控制寄存器 CR3(x86体系结构下的页基址寄存器)。 3.I-nodes VFS 通过 inodes 节点表示磁盘上的文件镜像,inodes 用于记录文件的物理属性。每个进程都有一个 files_struct 结构,用于表示该进程打开的文件,在 task_struct 中有个 files 指针。使用 inodes 节点可以实现文件共享。文件共享有两种方式:(1)通过同一个系统打开文件 file 指向同一个 inodes 节点,这种情况发生于父子进程间;(2)通过不同系统打开文件指向同一个 inode 节点,举例有硬链接;或者是两个不相关的指针打开同一个文件。 4.数据连接Data Connection 内核中所有的数据结构的根都在进程调度器维护的任务列表链表中。系统中每个进程的的数据结构 task_struct 中有一个指针 mm 指向它的内存映射信息;也有一个指针 files 指向它打开的文件(用户打开文件表);还有一个指针指向该进程打开的网络套接字。 六、子系统架构 1.进程调度器Process Scheduler 架构 (1)目标 进程调度器是 Linux kernel 中最重要的子系统。系统通过它来控制对 CPU 的访问——不仅仅是用户进程对 CPU 的访问,也包括其余子系统对 CPU 的访问。 (2)模块 进程调度器 调度策略模块scheduling policy module:决定哪个进程获得对 CPU 的访问权;调度策略应该让所有进程尽可能公平得共享 CPU。 ◆体系结构相关模块architecture-specific module设计一组统一的抽象接口来屏蔽特定体系接口芯片的硬件细节。这个模块与 CPU 交互以阻塞和恢复进程。这些操作包括获取每个进程需要保存的寄存器和状态信息、执行汇编代码来完成阻塞或者恢复操作。 ◆体系结构无关模块architecture-independent module与调度策略模块交互将决定下一个执行的进程,然后调用体系结构相关的代码去恢复那个进程的执行。不仅如此,这个模块还会调用内存管理器的接口来确保被阻塞的进程的内存映射信息被正确得保存起来。 ◆系统调用接口模块system call interface允许用户进程访问 Linux Kernel 明确暴露给用户进程的资源。通过一组定义合适的基本上不变的接口(POSIX 标准),将用户应用程序和 Linux 内核解耦,使得用户进程不会受到内核变化的影响。 (3)数据表示 调度器维护一个数据结构——task list,其中的元素是每个活动的进程 task_struct 实例;这个数据结构不仅仅包含用来阻塞和恢复进程的信息,也包含额外的计数和状态信息。这个数据结构在整个 kernel 层都可以公共访问。 (4)依赖关系、数据流、控制流 正如前面提到过的,调度器需要调用内存管理器提供的功能,去为需要恢复执行的进程选择合适的物理地址,正因为如此,所以进程调度器子系统依赖于内存管理子系统。当其他内核子系统需要等待硬件请求完成时,它们都依赖于进程调度子系统进行进程的阻塞和恢复。这种依赖性通过函数调用和访问共享的 task list 数据结构来体现。所有的内核子系统都要读或者写代表当前正在运行进程的数据结构,因此形成了贯穿整个系统的双向数据流。 除了内核层的数据流和控制流,OS 服务层还给用户进程提供注册定时器的接口。这形成了由调度器对用户进程的控制流。通常唤醒睡眠进程的用例不在正常的控制流范围,因为用户进程无法预知何时被唤醒。最后,调度器与 CPU 交互来阻塞和恢复进程,这又形成它们之间的数据流和控制流——CPU 负责打断当前正在运行的进程,并允许内核调度其他的进程运行。 2.内存管理器Memory Manager 架构 (1)目标 内存管理模块负责控制进程如何访问物理内存资源。通过硬件内存管理系统(MMU)管理进程虚拟内存和机器物理内存之间的映射。每一个进程都有自己独立的虚拟内存空间,所以两个进程可能有相同的虚拟地址,但是它们实际上在不同的物理内存区域运行。MMU 提供内存保护,让两个进程的物理内存空间不互相干扰。内存管理模块还支持交换——将暂时不用的内存页换出到磁盘上的交换分区,这种技术让进程的虚拟地址空间大于物理内存的大小。虚拟地址空间的大小由机器字长决定。 (2)模块 内存管理子系统 ◆架构相关模块architecture specific module提供访问物理内存的虚拟接口。 ◆架构无关模块architecture independent module负责每个进程的地址映射以及虚拟内存交换。当发生缺页错误时,由该模块负责决定哪个内存页应该被换出内存——因为这个内存页换出选择算法几乎不需要改动,所以这里没有建立一个独立的策略模块。 ◆系统调用接口system call interface为用户进程提供严格的访问接口(malloc 和 free;mmap 和 ummap)。这个模块允许用进程分配和释放内存、执行内存映射文件操作。 (3)数据表示 内存管理存放每个进程的虚拟内存到物理内存的映射信息。这种映射信息存放在 mm_struct 结构实例中,这个实例的指针又存放在每个进程的 task_struct 中。除了存放映射信息,数据块中还应该存放关于内存管理器如何获取和存储页的信息。例如:可执行代码能够将可执行镜像作为备份存储;但是动态申请的数据则必须备份到系统页中。(这个没看懂,请高手解惑?) 最后,内存管理模块还应该存放访问和技术信息,以保证系统的安全。 (4)依赖关系、数据流和控制流 内存管理器控制物理内存,当页面失败 page fault 发生时,接受硬件的通知(缺页中断)—— 这意味着在内存管理模块和内存管理硬件之间存在双向的数据流和控制流。内存管理也依赖文件系统来支持交换和内存映射 I/O——这种需求意味着内存管理器需要调用对文件系统提供的函数接口procedure calls,往磁盘中存放内存页和从磁盘中取内存页。因为文件系统请求非常慢,所以在等待内存页被换入之前,内存管理器要让进程需要进入休眠——这种需求让内存管理器调用进程调度器的接口。由于每个进程的内存映射存放在进程调度器的数据结构中,所以在内存管理器和进程调度器之间也有双向的数据流和控制流。用户进程可以建立新的进程地址空间,并且能够感知缺页错误——这里需要来自内存管理器的控制流。一般来说没有用户进程到内存管理器的数据流,但是用户进程却可以通过 select 系统调用,从内存管理器获取一些信息。 3.虚拟文件系统Virtual File System 架构 (1)目标 虚拟文件系统为存储在硬件设备上数据提供统一的访问接口。可以兼容不同的文件系统(ext2,ext4,ntf等等)。计算机中几乎所有的硬件设备都被表示为一个通用的设备驱动接口。逻辑文件系统促进与其他操作系统标准的兼容性,并且允许开发者以不同的策略实现文件系统。虚拟文件系统更进一步,允许系统管理员在任何设备上挂载任何逻辑文件系统。虚拟文件系统封装物理设备和逻辑文件系统的细节,并且允许用户进程使用统一的接口访问文件。 除了传统的文件系统目标,VFS 也负责装载新的可执行文件。这个任务由逻辑文件系统模块完成,使得 Linux 可以支持多种可执行文件。 (2)模块 虚拟文件系统模块 ◆设备驱动模块device driver module ◆设备独立接口模块Device Independent Interface:提供所有设备的同一视图。 ◆逻辑文件系统logical file system:针对每种支持的文件系统。 ◆系统独立接口system independent interface提供硬件资源和逻辑文件系统都无关的接口,这个模块通过块设备节点或者字符设备节点提供所有的资源。 ◆系统调用模块system call interface提供用户进程对文件系统的统一控制访问。虚拟文件系统为用户进程屏蔽了所有特殊的特性。 (3)数据表示 所有文件使用 inode 表示。每个 inode 都记录一个文件在硬件设备上的位置信息。不仅如此,inode 还存放着指向逻辑文件系统模块和设备驱动的的函数指针,这些指针能够执行具体的读写操作。通过按照这种形式(就是面向对象中的虚函数的思想)存放函数指针,具体的逻辑文件系统和设备驱动可以向内核注册自己而不需要内核依赖具体的模块特性。 (4)依赖关系、数据流和控制流 一个特殊的设备驱动是 ramdisk,这个设备在主存中开辟一片区域,并把它当成持久性存储设备使用。这个设备驱动使用内存管理模块完成任务,所以在 VFS 与对内存管理模块存在依赖关系(图中的依赖关系反了,应该是 VFS 依赖于内存管理模块)、数据流和控制流。 逻辑文件系统支持网络文件系统。这个文件系统像访问本地文件一样,从另一台机器上访问文件。为了实现这个功能,一种逻辑文件系统通过网络子系统完成它的任务——这引入了 VFS 对网络子系统的一个依赖关系以及它们之间的控制流和数据流。 正如前面提到的,内存管理器使用 VFS 完成内存交换功能和内存映射 I/O。另外,当 VFS 等待硬件请求完成时,VFS 需要使用进程调度器阻塞进程;当请求完成时,VFS 需要通过进程调度器唤醒进程。最后,系统调用接口允许用户进程调用来存取数据。不像前面的子系统,VFS 没有提供给用户注册不明确调用的机制,所以没有从VFS到用户进程的控制流。 4.网络接口Network Interface 架构 (1)目标 网络子系统让 Linux 系统能够通过网络与其他系统相连。这个子系统支持很多硬件设备,也支持很多网络协议。网络子系统将硬件和协议的实现细节都屏蔽掉,并抽象出简单易用的接口供用户进程和其他子系统使用——用户进程和其余子系统不需要知道硬件设备和协议的细节。 (2)模块 网络协议层模块图 ◆网络设备驱动模块network device drivers ◆设备独立接口模块device independent interface module提供所有硬件设备的一致访问接口,使得高层子系统不需要知道硬件的细节信息。 ◆网络协议模块network protocol modules负责实现每一个网络传输协议,例如:TCP,UDP,IP,HTTP,ARP等等~ ◆协议无关模块protocol independent interface提供独立于具体协议和具体硬件设备的一致性接口。这使得其余内核子系统无需依赖特定的协议或者设备就能访问网络。 ◆系统调用接口模块system calls interface规定了用户进程可以访问的网络编程API。 (3)数据表示 每个网络对象都被表示为一个套接字socket。套接字与进程关联的方法和 inode 节点相同。通过两个 task_struct 指向同一个套接字,套接字可以被多个进程共享。 (4)数据流,控制流和依赖关系 当网络子系统需要等待硬件请求完成时,它需要通过进程调度系统将进程阻塞和唤醒——这形成了网络子系统和进程调度子系统之间的控制流和数据流。不仅如此,虚拟文件系统通过网络子系统实现网络文件系统(NFS)——这形成了 VFS 和网络子系统指甲的数据流和控制流。 七、结论 1.Linux 内核是整个 Linux 系统中的一层。内核从概念上由五个主要的子系统构成:进程调度器模块、内存管理模块、虚拟文件系统、网络接口模块和进程间通信模块。这些模块之间通过函数调用和共享数据结构进行数据交互。 2.Linux 内核架构促进了他的成功,这种架构使得大量的志愿开发人员可以合适得分工合作,并且使得各个特定的模块便于扩展。 ◆可扩展性一:Linux 架构通过一项数据抽象技术使得这些子系统成为可扩展的——每个具体的硬件设备驱动都实现为单独的模块,该模块支持内核提供的统一的接口。通过这种方式,个人开发者只需要和其他内核开发者做最少的交互,就可以为 Linux 内核添加新的设备驱动。 ◆可扩展性二:Linux 内核支持多种不同的体系结构。在每个子系统中,都将体系结构相关的代码分割出来,形成单独的模块。通过这种方法,一些厂家在推出他们自己的芯片时,他们的内核开发小组只需要重新实现内核中机器相关的代码,就可以讲内核移植到新的芯片上运行。 作者:Ivan Bowman 来源:51CTO

优秀的个人博客,低调大师

深入理解Openstack QoS控制实现与实践

0.什么是QoSFrom Wikipedia: Quality of service (QoS) is the overall performance of a telephony or computer network, particularly the performance seen by the users of the network. To quantitatively measure quality of service, several related aspects of the network service are often considered, such as error rates, bit rate, throughput, transmission delay, availability, jitter, etc. 简单来说,QoS是一种控制机制,提供针对不同用户或者不同数据流采用相应不同的优先级,或者根据应用程序的要求,保证数据流的性能达到一定的水准。QoS的保证对于容量有限的网络来说是十分重要的,特别是对于流媒体应用,例如VoIP和IPTV等,因为这些应用常常需要固定的传输率,对延时也比较敏感。 QoS通常指网络上的数据流控制,本文讨论的QoS则更广泛些,不仅包含了传统的网络数据流控制(即网络IO控制),还包括了本地磁盘的读写控制,比如IOPS等。其中包括两种类型: 质量控制:通过提供不同性能的硬件设备来满足不同应用的性能需求,比如存储设备有SATA、SSD、RAID等。 量化控制:针对应用,对其流量进行严格控制,比如IOPS、网络带宽等。 Openstack同时支持以上两种QoS控制,这些组件包括但不限于计算服务Nova、网络服务Neutron、块存储服务Cinder、对象存储Swift等,Ceph虽然不是Openstack的组件之一,但通常作为Openstack的存储后端,因此本文也会对其进行简单的介绍。 本文旨在归纳总结Openstack如何在应用层实现QoS控制,读者如果对底层实现原理感兴趣,可以查阅相关资料。 1.Ceph Ceph是近年来非常火热的开源统一分布式存储系统,最初是Sage Weil在University of California, Santa Cruz(UCSC)的PhD研究内容,目前由Inktank公司掌控Ceph的开发。Ceph同时支持块存储(LVM、裸硬盘)、对象存储(S3、Swift)、文件系统存储(HDFS、GFS),并且具有高扩展性、高可靠性、高性能的优点。 Ceph其中最广泛的应用之一是作为Openstack的存储后端,为Openstack提供统一分布式存储服务。Openstack组件中Nova、Glance、Cinder都支持直接对接Ceph,云主机的在线迁移、故障转移、镜像存储等功能都依赖于Ceph提供的统一分布式存储服务。 实际在部署时不同的机房或者机架可能配置不同的存储设备,比如SSD固态存储设备、SATA普通硬盘等,rbd image实例使用不同的存储后端,显然能够提供不同的性能。 我们知道ceph是通过crush算法和crush map决定对象如何分布存储的,cursh map描述了存储设备的层级拓扑(可以是物理拓扑,比如机架、机房、区域等,也可以是逻辑拓扑,比如故障域、性能等),整个map图是一个树状结构,如图: ssd /|\ /|\ rack1rack2rack3 /\.../\ host-1host-2host-mhost-n /\....../\ osd1osd2osd-mosd-n 其中中间节点由自定义的bucket type实例构成,通常和物理拓扑名称一致,比如room、rack、host等,叶子节点是真正的存储设备,对应一块硬盘或者分区。根据树的结构,每个存储设备(叶子)有唯一一条路径到root节点,该路径定义为crush location,比如: root=ssdrack=rack1host=host-1 crush map rule能够制定某个pool的数据放置策略,rule的格式如下: rule<rulename>{ ruleset<ruleset> type[replicated|erasure] min_size<min-size> max_size<max-size> steptake<bucket-name> step[choose|chooseleaf][firstn|indep]<N><bucket-type> stepemit } 其中ruleset为rule的id,type用于区分是存储驱动设备(replicated)还是RAID。min_size为最小副本数,如果副本数小于这个数,crush将不会选这个rule,同理max_size为最大副本数。step take开始选择root(注意图上我们只画了一棵树,但crush map可以有多棵树,因此存在多个root type),choose表示从子树种选择对应的bucket type,其中N表示选择的数量: N == 0, 表示设置为pool副本数量; N > 0 && N < replicas,表示真实的数量; N < 0,表示副本数减去该数的绝对值。 比如: stepchoosefirstn1typerack 表示从当前位置向下迭代遍历随机选择一个rack类型。 该step必须位于take或者choose之下。 chooseleaf和choose类似,唯一不同的是在选择的每个bucket中再从中选择一个叶子节点。 以官方例子说明: rulessd-primary{ ruleset5 typereplicated min_size5 max_size10 steptakessd stepchooseleaffirstn1typehost stepemit steptakesata stepchooseleaffirstn-1typehost stepemit } 假设冗余副本数为3,则以上规则会首先从ssd中选择其中一个host,然后在host中选择其中一个osd作为主节点,然后从sata中选择3-1=2个host,分别从当中选择一个osd节点,一共两个osd节点作为副本节点。 注: 主节点负责实际和client通信的节点,而副本节点不会直接和client通信,但会和主节点保持数据同步,当主节点挂了,其中一个副本节点会接管主节点。 在写入数据时,主节点会同步到副本节点,只有当所有的副本节点都写完后,主节点才算写成功,因此ceph采取的是强一致性模型(而Swift是最终一致性模型) 可以通过primary-affinity值设置选择为主节点的概率,值为0表示不会被选择为主节点,值为1表示表示选择为主节点的概率极大(考虑到有多个节点都为1的情况)。 关于crush map 和rule参考官方文档。 ceph中不同的pool可以定义不同的crush以及ruleset,从而可以实现不同的pool,选择不同的osd,比如固定某个pool选择ssd,另一个pool选择sata,其中官方也有个例子: device0osd.0 device1osd.1 device2osd.2 device3osd.3 device4osd.4 device5osd.5 device6osd.6 device7osd.7 hostssd-server-1{ id-1 algstraw hash0 itemosd.0weight1.00 itemosd.1weight1.00 } hostssd-server-2{ id-2 algstraw hash0 itemosd.2weight1.00 itemosd.3weight1.00 } hostsata-server-1{ id-3 algstraw hash0 itemosd.4weight1.00 itemosd.5weight1.00 } hostsata-server-2{ id-4 algstraw hash0 itemosd.6weight1.00 itemosd.7weight1.00 } rootsata{ id-5 algstraw hash0 itemsata-server-1weight2.00 itemsata-server-2weight2.00 } rootssd{ id-6 algstraw hash0 itemssd-server-1weight2.00 itemssd-server-2weight2.00 } rulesata{ ruleset1 typereplicated min_size0 max_size10 steptakeplatter stepchooseleaffirstn0typehost stepemit } rulessd{ ruleset2 typereplicated min_size0 max_size4 steptakessd stepchooseleaffirstn0typehost stepemit } 拓扑图如下: ssd|sata /\|/\ /\|/\ /\|/\ ssd-server-1ssd-server-2|sata-server-1sata-server-2 /\/\|/\/\ /\/\|/\/\ osd0osd1osd2osd3|osd4osd5osd6osd7 我们定义两个rule,假设冗余副本数为3,一个是ssd,它会从ssd中(即左边的树中)中选择osd,另一个是sata,从sata中(即右边的树种)选择osd。 我们创建两个pool,并关联ruleset: cephosdpoolsetsatacrush_ruleset1 cephosdpoolsetssdcrush_ruleset2 通过以上方式我们实现了不同性能的ceph pool,实现QoS质量控制。 那ceph是否支持量化控制呢,rbd目前好像并不支持控制,但可以通过qemu、kvm等控制读写速率。 2.Cinder 介绍完Ceph,接下来终于进入Openstack正题,首先从Cinder谈起。Cinder是Openstack的基础组件之一,提供块存储服务,类似AWS的EBS服务。但是Cinder本身并不提供块服务,而只是一个管理工具,由具体后端实现,后端包括比如LVM、Ceph RBD等,Cinder通过调用对应的驱动来完成volume的生命周期管理。 下面以Ceph RBD作为存储后端为例,首先介绍如何实现volume的QoS质量控制。Cinder支持多后端存储,不同的后端通过不同的配置组区别开,如: [sata-ceph] volume_backend_name=sata rbd_pool=sata volume_driver=cinder.volume.drivers.rbd.RBDDriver rbd_ceph_conf=/etc/ceph/ceph.conf ... [ssd-ceph] volume_backend_name=ssd rbd_pool=ssd volume_driver=cinder.volume.drivers.rbd.RBDDriver rbd_ceph_conf=/etc/ceph/ceph.conf ... 以上有两个配置组,分别为sata-ceph和ssd-ceph,这里我们都使用了ceph rbd作为存储后端,实际部署时可以是完全不同的存储后端,比如混合rbd和LVM。以上我们指定了不同pool以及不同的后端名称,后端名称是为了方便后续创建volume type引用。我们由上面关于Ceph中介绍可知,不同的pool可以定义不同的rule从而选择不同特性的硬件,如果能够绑定Ceph pool和volume问题就解决了,值得庆幸的是,Cinder就是这么实现的。 Cinder自定义volume type,分别创建ssd和sata两个volume type: cindertype-createssd cindertype-createsata 创建完后type后绑定volume_backend_name从而实现与ceph pool关联起来: cindertype-keysatasetvolume_backend_name=sata cindertype-keyssdsetvolume_backend_name=ssd 查看extra-specs: [root@server-39.0.lg.ustack.in~]$cinderextra-specs-list +--------------------------------------+------+-----------------------------------+ |ID|Name|extra_specs| +--------------------------------------+------+-----------------------------------+ |1a0cb988-58a6-43bf-b4ea-199e0e02239b|sata|{u'volume_backend_name':u'sata'}| |38344c5c-b61b-4677-9a48-e70d723b8620|ssd|{u'volume_backend_name':u'ssd'}| +--------------------------------------+------+-----------------------------------+ 此时只需要在创建时指定volume type就可以实现创建不同QoS性能的数据卷,比如: cindercreate--volume-typessd--display-nameint32bit-test-ssd1 以上我们通过自定义volume type并绑定不同的后端实现了对volume访问的QoS质量控制,接下来我们介绍如何通过制定volume type实现不同的QoS量化控制。和前面的步骤类似,首先创建一个high-iops-type volume type: cindertype-createhigh-iops-type cinder通过qos实例对volume进行量化控制,我们需要创建high-iops,设置读最大iops为2000,写最大iopos为1000: cinder qos-create high-iops consumer="front-end" read_iops_sec=2000 write_iops_sec=1000 查看qos列表: $cinderqos-list +--------------------------------------+-----------+-----------+---------------------------------------------------------+ |ID|Name|Consumer|specs| +--------------------------------------+-----------+-----------+---------------------------------------------------------+ |4ba70d30-eb36-4267-8ee5-5c9cc2f8af32|high-iops|front-end|{u'write_iops_sec':u'1000',u'read_iops_sec':u'2000'}| +--------------------------------------+-----------+-----------+---------------------------------------------------------+ 其中consumer的合法值为front-end、back-end、both。front-end表示使用前端控制(hypervisor控制,会在libvirt xml文件中定义), 而back-end表示使用后端控制(cinder drivers,需要driver支持),both表示前后端同时进行QoS控制。 最后绑定qos实例和volume type实例: QOS_SPEC_ID=4ba70d30-eb36-4267-8ee5-5c9cc2f8af32 VOLUME_TYPE_ID=26e33f06-e011-4cf7-a397-91a00ef0a233 cinderqos-associate$QOS_SPEC_ID$VOLUME_TYPE_ID 查看绑定情况: $cinderqos-get-association4ba70d30-eb36-4267-8ee5-5c9cc2f8af32 +------------------+----------------+--------------------------------------+ |Association_Type|Name|ID| +------------------+----------------+--------------------------------------+ |volume_type|high-iops-type|26e33f06-e011-4cf7-a397-91a00ef0a233| +------------------+----------------+--------------------------------------+ 下面我们创建一个volume验证其功能,我们创建时指定volume type为high-iops-type,并挂载到虚拟机中: cindercreate--volume-typehigh-iops-type--display-namehigh-iops-test1 SERVER_ID=1ea33417-b577-45cb-83a0-fc412e421811 VOLUME_ID=bb2ccbfb-654a-473e-9f35-ae548c8e59e1 novavolume-attach$SERVER_ID$VOLUME_ID 查看libvirt xml文件,截取部分disk信息如下: <disktype='network'device='disk'> <drivername='qemu'type='raw'cache='writeback'/> <authusername='admin'> <secrettype='ceph'uuid='bdf77f5d-bf0b-1053-5f56-cd76b32520dc'/> </auth> <sourceprotocol='rbd'name='openstack-00/volume-bb2ccbfb-654a-473e-9f35-ae548c8e59e1'> <hostname='10.0.103.61'port='6789'/> <hostname='10.0.103.62'port='6789'/> <hostname='10.0.103.63'port='6789'/> </source> <backingStore/> <targetdev='vdc'bus='virtio'/> <iotune> <read_iops_sec>2000</read_iops_sec> <write_iops_sec>1000</write_iops_sec> </iotune> <serial>bb2ccbfb-654a-473e-9f35-ae548c8e59e1</serial> <aliasname='virtio-disk2'/> <addresstype='pci'domain='0x0000'bus='0x00'slot='0x08'function='0x0'/> </disk> 由xml文件可见在iotune中对读写IOPS的控制。 以上总结了Openstack Cinder的QoS的控制,接下来将介绍Nova实现机制。 3.Nova Nova是Openstack最核心的服务,提供计算服务,其功能类似AWS EC2。官方描述为: Nova is an OpenStack project designed to provide power massively scalable, on demand, self service access to compute resources. Nova虽然没有直接方式对QoS质量进行控制,但我们可以通过主机集合(Host Aggregate)实现,比如我们有两个计算节点node-1,node-2,配置SSD磁盘,我们创建对应的主机集合并把两个节点加入到该主机集合中: novaaggregate-createssdnova novaaggregate-set-metadatassdssd=true novaaggregate-add-hostssdnode-1 novaaggregate-add-hostssdnode-2 创建一个新的flavor并设置key指定绑定的key-value: novaflavor-createssd.large68192804 novaflavor-keyset_key--name=ssd.large--key=ssd--value=true 查看flavor: $novaflavor-showssd.large +----------------------------+-------------------+ |Property|Value| +----------------------------+-------------------+ |OS-FLV-DISABLED:disabled|False| |OS-FLV-EXT-DATA:ephemeral|0| |disk|80| |extra_specs|{u'ssd':u'true'}| |id|6| |name|ssd.large| |os-flavor-access:is_public|True| |ram|8192| |rxtx_factor|1.0| |swap|| |vcpus|4| +----------------------------+-------------------+ 此时当用户指定ssd.large flavor时,调度器将筛选具有ssd=true标签的计算节点,其余不满足条件的主机将被过滤掉, 最后在node-1和node-2中选取作为虚拟机的宿主机。 同样地,Nova可通过flavor的Extra Specs实现QoS量化控制,以下内容直接参考官方文档-compute flavors: 比如限制IO最大读写速率为10MB/s: openstackflavorsetFLAVOR-NAME\ --propertyquota:read_bytes_sec=10240000\ --propertyquota:write_bytes_sec=10240000 除了IO控制,还支持CPU以及内存限制: CPU openstackflavorsetFLAVOR-NAME\ --propertyquota:cpu_quota=10000\ --propertyquota:cpu_period=20000 内存 openstackflavorsetFLAVOR-NAME\ --propertyquota:memory_shares_level=custom\ --propertyquota:memory_shares_share=15 设置虚拟机最大的disk写入数据为10MB/s: openstackflavorsetFLAVOR-NAME\ --propertyquota:disk_write_bytes_sec=10485760 另外,除了QoS控制,Flavor的强大之处远不止这些,还支持用户自定义CPU拓扑: openstackflavorsetFLAVOR-NAME\ --propertyhw:cpu_sockets=FLAVOR-SOCKETS\ --propertyhw:cpu_cores=FLAVOR-CORES\ --propertyhw:cpu_threads=FLAVOR-THREADS\ --propertyhw:cpu_max_sockets=FLAVOR-SOCKETS\ --propertyhw:cpu_max_cores=FLAVOR-CORES\ --propertyhw:cpu_max_threads=FLAVOR-THREADS 以及NUMA 拓扑: openstackflavorsetFLAVOR-NAME\ --propertyhw:numa_nodes=FLAVOR-NODES\ --propertyhw:numa_cpus.N=FLAVOR-CORES\ --propertyhw:numa_mem.N=FLAVOR-MEMORY 4.Swift Openstack Swift提供对象存储服务,功能类似AWS S3以及Ceph RGW,Swift可以通过配置不同的Storage Policies来实现不同性能的后端存储。具体可参看官方文档Stroage Policie. 5.Neutron Neutron是OpenStack项目中负责提供网络服务的组件,它基于软件定义网络(SDN)的思想,实现了网络虚拟化的资源管理。Neutron支持对虚拟网卡进行带宽流量限制,主要通过QoS Policy实现,需要在neutron server端配置项service_plugins中开启qos插件,参考Neutron QoS。 以下内容主要参考官方文档实例。首先创建一个Qos Policy: neutronqos-policy-createbw-limiter 设置带宽: neutronqos-bandwidth-limit-rule-createbw-limiter--max-kbps3000\ --max-burst-kbps300 通过neutron port-list找到需要限制带宽的端口(虚拟网卡): $neutronport-list +--------------------------------------+----------------------------------+ |id|fixed_ips| +--------------------------------------+----------------------------------+ |0271d1d9-1b16-4410-bd74-82cdf6dcb5b3|{...,"ip_address":"10.0.0.1"}| |88101e57-76fa-4d12-b0e0-4fc7634b874a|{...,"ip_address":"10.0.0.3"}| |e04aab6a-5c6c-4bd9-a600-33333551a668|{...,"ip_address":"10.0.0.2"}| +--------------------------------------+----------------------------------+ 关联port和QoS Policy: neutronport-update88101e57-76fa-4d12-b0e0-4fc7634b874a--qos-policybw-limiter 移除port和Qos Policy的关联: neutronport-update88101e57-76fa-4d12-b0e0-4fc7634b874a--no-qos-policy 创建port时可以指定QoS Policy: neutronport-createprivate--qos-policy-idbw-limiter 总结 本文详细介绍了Openstack基础服务的QoS控制,包括质量控制和量化控制,涉及的内容包括: Ceph通过crush map和ruleset选取不同性能的后端存储设备 Cinder支持多后端存储,Volume type绑定具体的后端从而实现不同性能的后端选择,并且可以自定义QoS实现数据卷的IO读写限制。 Nova可以通过Host Aggregate的Metadata以及Flavor Extra Specs控制调度器选取符合某些特性的(比如SSD)计算节点,通过Flavor Extra Specs实现虚拟机的IO读写限制。 Swift 支持多Policy,通过Storage Policies可以实现不同性能的后端存储设备。 Neutron通过Qos Policy完成对虚拟网卡的带宽限制。 由此可见,Openstack同时支持计算、存储和网络的QoS控制,通过QoS控制可以满足不同应用对不同资源的异构需求。 作者:付广平 来源:51CTO

优秀的个人博客,低调大师

大数据阿里云产品的简单介绍理解

很多人问,大数据是什么。一个时尚的技术名词,一个互联网时代的标志。给人高端大气上档次的感觉,很多公司不说自己有大数据都不好意思跟别人谈业务。那我就谈谈我的一些看法来结合阿里云的数加大数据产品比较粗俗的介绍下大数据到底是什么。 首先,从字面意思”大数据”,那可以感受到,数据量要大,这是一个必须的条件。举一个例子,比方说我要根据一些销售数据做一个报表给老板看,那么几千条数据甚至几万条,我用excel可以很方便的做出来,数据可以保存在自己电脑上。 那么,当数据几十万到几百万,excel就不能做了,就需要把数据放在数据库,比如常见的mysql等关系型数据库,来计算存储等,但是当数据量几千万几亿几十亿以上呢,怎么办?那就需要大量的服务器和更高的配置机器来存储,计算,做出来报表,这其中就需要大数据技术来实现。所以,大数据的根本条件是

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册