Month: March 2024
-
Windows上vscode建立C/C++开发环境
这里以在windows 10/11上建立开发环境为例,由于vscode IDE比较轻量级而且开源免费,支持多种高级编程语言,插件工具支持丰富,是现在广泛普及的编程IDE。在windows平台上开发c/c++程序可以使用两种编译器环境。(1)、用原生windows系统,使用开源的c++编译器,可以参考引文下载链接。(2)、用WSL的linux环境,用linux环境下的gcc,g++编译器;通过如下命令安装:sudo apt install g++ gdb make。 这里以第(2)种情况来做说明,首先要在windows系统上安装好WSL。具体安装方法可以参考引文。 在vscode IDE中要按ctrl+shift+p弹出”WSL:Connect to WSL using Distro…. “,选择安装的WSL对应的ubuntu版本,然后打开特定的工程目录文件,在vscode当前打开的根目录下建立.vscode目录并创建launch.json文件。内容如下: 在.vscode同一级目录下建立tasks.json。内容如下: References
-
云计算相关技术简介(五)-Neutron组件相关技术概念简介
Neutron组件模块是openstack项目中负责提供网络服务的组件,它基于软件定义网络的思想,实现了网络虚拟化下的资源管理。本篇文章将简要介绍neturon网络组件的相关的技术的简要介绍,具体的相关技术的详细介绍后面会在实践环节安排专门的篇幅进行阐述。 一般的,OpenStack中网络实现包括vlan、gre、vxlan等模式,在OpenStack中,所有网络有关的逻辑管理均在Network节点中实现,例如DNS、DHCP以及路由等。Compute节点上只需要对所部署的虚拟机提供基本的网络功能支持,包括隔离不同租户的虚拟机和进行一些基本的安全策略管理(即security group)。安全组的对象是虚拟网卡,由L2 Agent来实现,比如neutron_openvswitch_agent 和 neutron_linuxbridge_agent,会在计算节点上通过配置 iptables 规则来限制虚拟网卡的进出访问。计算节点上运行着虚拟机。如果不启用 DVR 特性,则所有的网络相关的服务,都在网络节点上进行。即计算节点上的网络只需要实现二层转发即可。 GRE:General Routing Encapsulation,一种通过封装来实现隧道的方式。在openstack中一般是基于L3的GRE,即original pkt/GRE/IP/Ethernet(从左到右layer依次降低)。隧道协议将这些其他协议的数据包重新封装在新的包头中发送。被封装的数据包在隧道的两个端点之间通过网络进行路由,被封装数据包在网络上传递时所经历的逻辑路径称为隧道。简单来说,隧道技术是一类网络协议,是将一个数据包封装在另一个数据包中进行传输的技术;使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。通过网络隧道技术,可以使隧道两端的网络组成一个更大的内部网络。 DVR(Distributed Virtual Router,DVR),按照 Neutron 原先的设计,所有网络服务都在网络节点上进行,这意味着大量的流量和处理,给网络节点带来了很大的压力。这些处理的核心是路由器服务。任何需要跨子网的访问都需要路由器进行路由。为了降低网络节点的负载,同时提高可扩展性,OpenStack 自 Juno 版本开始正式引入了分布式路由DVR特性(用户可以选择使用与否),来让计算节点自己来处理原先的大量东西向流量和非 SNAT 南北流量(有 floating IP 的 vm 跟外面的通信)。这样网络节点只需要处理占到一部分的 SNAT (无 floating IP 的 vm 跟外面的通信)流量,大大降低了负载和整个系统对网络节点的依赖。很自然的,FWaaS 也可以跟着放到计算节点上。DHCP 服务、VPN 服务目前仍然需要集中在网络节点上进行。 VXLAN,VXLAN(Virtual Extensible LAN)是一种用于解决数据中心内部网络限制和提高网络的灵活性与可扩展性的网络虚拟化技术。它于2011年被提出,旨在扩展和改进传统的虚拟局域网(VLAN)功能。VXLAN技术通过封装原始以太网帧(包含MAC地址、VLAN标签等)到UDP报文中来工作。这种封装允许VXLAN跨越不同的网络段和IP子网(将原始以太网帧作为应用数据用UDP协议进行封装),从而实现网络虚拟化功能。具体的关于VXLAN的详细介绍请参考引文。 VXLAN现在是比较常用的SDN的虚拟网络的实现。这里将详细介绍一下相关的实现原理细节。上面就是VXLAN系统的网络结构图,对相关组成部分做一些介绍,如TAP设备:模拟一个二层的网络设备,可以接受和发送二层网包。VETH:虚拟ethernet接口(virtual eth),通常以pair的方式出现,一端发出的网包,会被另一端接收,可以形成两个网桥之间的通道。在上图中的qbr-xxx/qbr-yyy一般简称为qbr。qbr是Quantum Bridge的缩写,而OpenStack网络组件的前一个名称就是Quantum,qbr就是虚拟网桥,用来做安全组控制的。qvb:neutron veth, Linux Bridge-side。qvo:neutron veth, OVS-side。br-int是集成的网桥,实现将数据包转化为VLAN包作用;br-tun是将VLAN进一步封装成VXLAN隧道技术,而且上图左边部分的这些虚拟实现都是在计算节点内部实现的相关的网络虚拟化功能。其中下面以出报文和入报文的过程示例进行一个简要的说明。 其中上图中的计算节点和网络节点通过物理交换机相连,把vxlan的包封装成IP包进行传输。 出报文的转换过程 注:出br-tun时,VLAN变为VXLAN,并转为VNI=100。 入报文的转换过程 网络节点担负着进行网络服务的任务,包括DHCP、路由和高级网络服务等。一般包括三个网桥:br-tun、br-int…
-
C++11中atomic类型和内存模型
本篇文章介绍C++11中的原子变量的内存模型,内存模型比较复杂,与多线程、CPU缓存以及指令优化都有关系,这里记录一下现在的理解,如有不正确的地方欢迎批评指正。后续也会进一步更新更深入的理解。 C++11是在C/C++99之后出现的变动较大的C++版本,一般Mordern C++是指C++11以后的C++。Modern C++有很多新的特性,其中automic变量(原子变量)就是一种支持的新的特殊类型。所谓原子变量,顾名思义,针对这些变量的操作都是原子操作(完整不可分),这为多线程程序中的共享变量的实现提供了一个便捷的方法。C++11 对常见的原子操作进行了抽象,定义出统一的接口,并根据编译选项/环境产生平台相关的实现。新标准将原子操作定义为atomic模板类的成员函数,囊括了绝大多数典型的操作——读(load)、写(store)、CAS(Compare and Swap, 比较并替换,如compare_exchange_weak)等。 现代的处理器并不是逐条处理机器指令的。内存模型是一个硬件上的概念,表示的是机器指令(或者将其视为汇编指令也可以)是以什么样的顺序被处理器执行的。指令1、2、3(a赋值)和指令4、5(b赋值)毫不相干。一些处理器可能将指令乱序执行,比如按照1->4->2->5->3这样的顺序(超标量流水线,即一个时钟周期里发射多条指令)。如果指令是“乱序”执行的,我们称这样的内存模型为弱顺序的(weak ordered)。弱顺序的内存模型的好处在可以进一步挖掘指令中的并行性,提高指令执行的性能。 顺序一致内存顺序/memory_order_seq_cst,memory_order_seq_cst 表示该原子操作必须顺序一致的,这是C++11中所有atomic原子操作的默认值。这样来理解“顺序一致”:即代码在线程中运行的顺序与程序员看到的代码顺序一致。也就是说,用此值提示编译器“不要给我重排序指令,不要整什么指令乱序执行,就按照我代码的先后顺序执行机器指令”。在示例代码中,a的赋值语句先于b的赋值语句执行,这种称之为”先于发生(happens-before)“关系。用memory_order_seq_cst 可以确保这种happens_before关系。 松散内存顺序memory_order_relaxed,表示该原子操作指令可以任由编译器重排或者由处理器乱序执行。和普通变量的对编译器的表现没有什么差异。 上面讲的顺序一致和松散方式对应着两个极端——一个是严格禁止”指令乱序加速优化“,一个是允许随便”指令乱序加速优化“。但是现实的逻辑问题是:严格禁止”指令乱序优化“,指令执行不够快;允许随便”指令乱序优化“,在多线程程序场景下很可能又违反了计算的正确逻辑得不到正确结果。 Release-acquire内存顺序,memory_order__acquire规则定义:本线程中,所有后续的读写操作,必须在本条原子操作完成后执行。(本线程中,读写操作在本代码后面的要保证我先读),memory_order_release规则定义:本线程中,所有之前的内存读写操作完成后,才能执行本原子写操作。(在本线程中,写操作在本代码前面的要保证你们先写,我最后写……)下面有一段示例代码说明。memory_order_release,Perform release operation. Informally speaking, prevents all preceding memory operations to be reordered past this point.;memory_order_acquire,Perform acquire operation. Informally speaking, prevents succeeding memory operations to be reordered before this point.memory_order_acq_rel,Perform both release and acquire operation. memory_order_acquire & memory_order_release成对作用在一个原子对象上,能保证在多个线程中对这个原子对象的修改和读取是一致的。 memory_order_acquire & memory_order_release 相比 relaxed序具有更大的同步开销。 上述的直观的理解这么解释:关于原子变量的load读操作如果设为memory_order_acquire,在本线程内后面的内存读写必须等待读操作完成后才能进行,同理原子变量的store写操作如果设为memory_order_release,则在本线程内前面的内存读写必须在store写操作之前完成。两个不同的线程共享的原子变量a,如果在线程1中成功load到线程2store后的状态,则线程2中store之前的共享的内存数据状态对于线程1是可见的。如上面的代码所示,只有Thread1中的b.store写入2后,Thread2读取的b的状态才是2,这时才会退出while循环,这时Thread2的后面的代码中a的状态就是Thread1中保存的值1(因为Thread1中保证a.store会在b.store之前完成。 C++标准库中的memory order其实与具体的machine无关的,在实现上会通过memory barrier(FENCE)来进行order,memory barrier在不同CPU类型上表现不一定一致。 CAS的操作以compare_exchange_weak函数为例进行说明, The memory…
-
云计算相关技术简介(四)-docker和虚拟机
上一篇文章中介绍过openstack中虚拟机镜像服务模块glance,就说到虚拟机镜像和docker镜像,当时没有具体展开,这篇文章将较为详细介绍虚拟机技术和docker容器相关技术之间的比较。不正确的地方欢迎批评指正。 首先虚拟机的概念是相对于物理机器而言的,虚拟机是依赖于物理计算机而设计实现的逻辑计算机,根据物理计算机的特性,有基于单机的虚拟机,如基于wmware虚拟机管理软件,在单台计算机上构建多个虚拟机器,从而可以方便模拟不同计算节点,如搭建大数据的模拟环境。也有基于多个甚至很多个物理机器之上构建的虚拟机管理系统,这类的虚拟机管理软件有openstack和VMware vSphere等,甚至一些大的公司会构建自己的虚拟机软件系统管理平台(可以参考引文中的介绍),一般这样基于分布式环境的虚拟机调度和管理系统成为云计算平台。 docker容器技术,容器是利用namespace将文件系统、进程、网络、设备等资源进行隔离,利用cgroup对权限、cpu资源进行限制,最终让容器之间互不影响,容器无法影响宿主机。docker容器之间属于进程之间隔离,而虚拟机之间属于系统之间的隔离。 虚拟机的镜像文件实实在在就是操作系统环境的persistent storage,docker镜像是一个“应用程序和它运行依赖环境”的封装。当镜像运行起来后即是docker容器。运行时的容器本质是操作系统下的一个进程,这些进程共享同一个宿主机OS的内核。与传统VM相比,docker是一种操作系统虚拟化技术,并不需要在镜像内安装GuestOS。docker在共享宿主机内核的基础上包装内核提供的一系列API,这些API中最重要的就是namespace和cgroup。通过namespace实现隔离,通过cgroup实现资源限制。一般管理docker镜像的服务称为docker hub,现有的也有多个开放的docker镜像源。 一般虚拟机是云计算系统中IAAS平台的关键技术,是建立在cpu硬件虚拟化和操作系统级的软件虚拟化(如KVM等)的基础之上的。而docker容器可以理解为在host操作系统之上运行的一个特殊的进程。而docker容器以及基于此之上的编排技术k8s等则是相关的PAAS平台的所依赖的技术,大数据平台如hadoop可以基于虚拟机之上直接部署,也可以基于容器环境部署。具体可以参考后两个引文链接。docker容器技术的出现,大大方便了开发部署的效率,开发环境和部署环境可以快速复制分发,不需要每个开发人员为了开发库和开发机器环境的兼容问题去浪费时间和精力,有种一劳永逸的感觉。关于docker容器相关的技术细节,如dockerfile的编写,一些CLI命令的使用如docker容器的启动等等,会在后续的相关课程中进行介绍。 References
-
云计算专业企业实践(三)-openstack系统组件介绍
这次的实践内容是通过网络会议进行的,昨天的实践今天补充记录一下,以备后续查阅。现在流媒体通信技术比较成熟,网络视频会议等工具使得很多物理上远距离的沟通变得方便很多,在云计算专业实践中,除了物理服务器的布置,网络拓扑结构的组织和安排以及布线等需要在现场进行实践锻炼外,其他如技能知识点的学习,相关软件系统的安装部署和维护都可以远程进行,工作不再太多的受物理距离的限制,可以节省出出行的时间来,有利于一天的生活工作安排。 言归正传,openstack是一个虚拟机平台系统,是IAAS系统中处于服务器硬件节点集合和原生操作系统之上运行的一个分布式系统,其功能用简介的一句话概括可以理解为虚机调度分配和管理系统。其中openstack系统上层实现主要是python语言,底层的开发有基于更高性能的c++语言。下面首先介绍一下openstack的几大模块。后续根据进一步的熟悉和理解再去补充或新增专门描述细节的文章,不正确的地方欢迎批评指正。 1、horizon-dashboard模块,GUI模块,理解为管理员和openstack系统进行交互的用户界面,是管理整个运行在底层(水平线下)openstack系统的维护通道,通过界面可以了解系统的运行状态等信息; 2、nova-compute模块,计算模块,也是openstack最核心和主要的模块,提供了nova-api,会涉及调用其他的模块如虚拟机镜像服务模块,存储模块,网络模块,用户认证模块等,是虚拟机调度、分配和运行管理的核心组件,也用到了cpu硬件虚拟化和linux内核中hypervisor虚拟化组件的功能,实际云计算平台运维的工作中有50%以上的问题会集中在此模块; 3、cinder-volume模块,存储模块,支持swift(openstack自带存储模块)和ceph分布式存储模块。提供cinder-api供horizon-dashboard层调用; 4、neturon-network模块,提供vpc(virtual private cloud)功能,可以通过逻辑封装实现虚拟网络的功能,vpc可以实现虚拟交换机,vxlan也是虚拟实现的局域网,可以方便不同租户和项目之间的隔离;网络模块也是很重要的模块,这部分逻辑虚拟实现的功能比较多,相关技术和概念相对也较复杂,后续会有机会再专门去记录和介绍; 5、glance-image service模块,是虚拟机镜像模块,负责存储和管理虚机镜像,通过管理多种虚机镜像,支持用户选择合适的镜像进行服务部署;在这里镜像是虚机操作系统镜像,如ubuntu系统还是windows系统的镜像文件,而容器镜像是docker服务中的运行在docker虚拟化技术上的系统环境镜像,是容器启动的系统文件。是不同的镜像概念; 6、keystore-identity service模块,为用户认证模块,提供了用户的信息,如用户设置的安全组策略,用户的身份信息等,主要用作权限认证,在其他模块中可能会调用该模块去验证权限等操作。 以上为openstack的主要的模块组件,实际的云计算环境部署的时候,一般的部署的步骤是:1、搭建云计算的物理服务器和硬件网络拓扑,如机架式服务器,三层交换机和网络布线等硬件物理结构的设计和实施;2、原生操作系统的安装,以及相关的环境设置,如hostname,ssh免密登录等;3、openstack云平台环境的安装,有基于kolla方式的较为便捷的部署方式,通过openstack kolla ansible(编排工具,偏向于支持运维服务)进行较为方便的安装部署,其中有几个种地按的配置文件需要了解,如globals.yaml,multinode.yaml等配置文件,需要对里边的配置项有比较深入的理解。 Reference
-
云计算专业企业实践(二)-ceph存储
今天参加云计算第二次企业实践,阳光明媚,春天来了。午餐后和一起过来的老同事在附近的公园散了会步,感受到了久违的温暖阳光,公园的树木一动不动,水平如镜,温暖而安静。 今天学习的技术主要是ceph存储,ceph存储是云计算中比较流行的存储技术,实现了分布式的大容量高可靠性和伸缩性存储功能。可以支持上千个存储节点,容量达到TB到PB级别。下面简要说说ceph的技术概要,欢迎补充和批评指正。 ceph的技术架构大体是这样的:(1)、底层是RADOS分布式存储系统,RADOS即为Reliable Autonomic Distributed Object Store,也就是可信赖的自动分布式对象存储,RADOS中的pool,PG(placement group)和OSD(object storage device)以及hash,crush等算法实现了具有数据冗余副本的分布式存储系统,如果有数据盘损坏,该系统设计的crush算法能够比较方便实现自愈。(2)librados库,支持访问底层的rados对象库,支持多种高级语言,是中间层的一个开发库,向上层提供服务。(3)最上层的开发库有radosgw,类比于公有云里边的对象存储,块存储rbd(虚拟机中申请的磁盘)和cephfs(类比于共享文件)等机制。 上层应用接口:Ceph上层应用接口包括对象存储RADOSGW、块存储RBD和文件系统存储CephFS。RADOSGW提供与Amazon S3和Swift兼容的RESTful API网关,供相应的对象存储应用开发使用;RBD提供标准的块设备接口,常用于虚拟化场景下为虚拟机创建volume。 其中虽然对上层提供了不同的存储服务,如块存储,在申请虚机时可以作为虚拟机的块磁盘使用,还有rados gateway提供了类似于基于bucket和file的两层结构的对象存储,和cephfs文件存储系统(类似于nfs和windows共享文件),但是这些不同的存储方式的底层都是基于rados的高效分布式存储的,由于在ceph中一般都是采用object这个单位进行的分片存储,分布式存储的文件读写就可能采用并行的机制,实现高吞吐量的IO读写。 细节还有很多,如要理解crush算法,理解不同的管理工具和配置文件的使用等等,还有和openstack云计算平台的集成等等,具体到后面的实践环节再补充更新。 References