• [技术干货] 【Linux】:初识网络-转载
    1. 计算机网络发展背景计算机网络的发展可以追溯到20世纪60年代。当时,美国国防部的高级研究计划署(ARPA)启动了一个名为ARPANET的研究项目,旨在将分布在全美的计算机连接起来,实现资源共享和信息交流。ARPANET于1969年建成,成为了世界上第一个计算机网络🔥  在随后的几十年里,计算机网络经历了从军用到民用、从局域网到广域网的快速发展。20世纪70年代,随着计算机和网络技术的不断进步,计算机网络开始向商业化和民用化方向发展。1974年,ARPANET采用了TCP/IP协议,这成为了今天互联网的基础。到了80年代,局域网(LAN)和广域网(WAN)开始普及,TCP/IP协议也成为互联网的标准协议,标志着互联网的正式建立独立模式:计算机之间相互独立 网络互联:多台计算机连接在一起, 完成数据共享 局域网LAN:计算机数量更多了, 通过交换机和路由器连接在一起 广域网WAN:将远隔千里的计算机都连在一起 所谓 “局域网” 和 “广域网” 只是一个相对的概念. 比如, 我们有 “天朝特色” 的广域网, 也可以看做一个比较大的局域网.重要性:计算机网络在现代社会中发挥着举足轻重的作用。它打破了数据的孤立状态,使得不同计算机之间能够高效地交换信息和共享资源。无论是工作、学习还是生活,计算机网络都已经成为人们不可或缺的一部分。它让人们能够随时随地访问互联网,获取各种信息和服务,极大地提高了工作效率和生活质量2. 网络协议🔥 网络协议,简称为协议,是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。这些规则详细规定了如何建立连接、如何互相识别、如何发送和接收数据等🐇 协议初识"协议"本质就是一种约定计算机之间的传输媒介是光信号和电信号。 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式思考:只要通信的两台主机约定好协议就可以了么?即使双方已经制定了通信协议,但如果一方使用频率来表示 01,而另一方使用信号强弱来表示 01,这就如同一方说中文,另一方说葡萄牙语。虽然大家遵循相同的 01 通信规则,但由于“表示方式”不同,即使订立了基本协议,也无法进行正常的通信。多样化的计算环境计算机生产厂商众多;计算机操作系统多种多样;计算机网络硬件设备种类繁多。在如此多样的环境下,如何确保来自不同厂商的计算机能够顺利通信?统一标准的需求因此,一个完善的协议需要更加详细和具体的规定,并且所有参与者都必须遵守这些规定。一些思考:技术被挖掘出了价值,广泛使用,第一生产力的特征才会表现出来,被看到。所以占领市场,制定标准的重要性就可以理解了。例如现在的鸿蒙系统(物联网),人工智能,大模型......现在都是在找应用场景来落地,进行普及和构建生态。软件分层的场景:高内聚,低耦合结构体和类,数据层面:继承和多态就是在实现软件分层数据类型上:文件和硬件不同 struct 设计线程池回调的方式模块之间:虚拟内存和页表等也是一种分层🐇 协议分层⭕ 为什么要分层?问题是层状的网络很庞大好维护例如两个人打电话真实情况:我们人其实在和电话沟通在逻辑上:我们认为,人和人,电话和电话在沟通举个例子: 本层之间有协议,层和层之间通过话筒(接口)连接 在这个例子中, 我们的"协议"只有两层: 语言层、通信设备层。但是实际的网络通信协议,设计的会更加复杂, 需要分更多的层但是通过上面的简单例子,我们是能理解,分层可以实现解耦合分层具有好维护的特征,可以实现只换同层内容⭕ 那么网络协议是如何分层的呢?🥝 OSI 七层协议OSI(Open System Interconnection,开放系统互连) 七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解. 🔥 其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议。🥝 TCP/IP五层(四层)模型TCP(传输层)/ IP(网络层) 是一组协议的代名词,它还包括许多协议,共同组成了TCP/IP协议簇TCP/IP 通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求物理层我们考虑的比较少,因此很多时候也可以称为 TCP/IP 四层模型一般而言对于一台主机:它的操作系统内核实现了从传输层到物理层的内容:对于一台路由器:它实现了从网络层到物理层;对于一台交换机:它实现了从数据链路层到物理层对于集线器:它只实现了物理层;但是并不绝对.很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发); UDP协议为用户数据报协议,在传输层工作TCP协议为传输控制协议,在传输层工作IP协议为网际协议,在网络层工作ARP协议为地址解析协议,在网络层工作ICMP协议为Internet控制报文协议,它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息,所以是通过IP协议来进行传输结构理解:物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层 💢 调制解调器(猫)也工作在物理层。(把模拟信号->数字信号,数字信号->模拟信号),家里安装的wifi,先是光纤接入猫,然后猫拉一个先连接路由器,路由器帮我们构建一个局域网然后我们就可以连接wifi了,我们发送的消息先传给路由器,路由器在经过物理设备猫,帮我们做数模转换把数据打到网络里然后数据才能发出去。(路由器真正识别才是真正的01这种二进制对东西)。数据链路层:负责建立设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。 有以太网、令牌环网, 无线LAN等标准。交换机(Switch)工作在数据链路层。确保了主机和直接连接的主机之间可以通信网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router,是涵盖关系,也有集线器,交换机......的功能)工作在网路层.传输层: 负责两台主机之间的数据传输。 如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机.应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 我们的网络编程主要就是针对应用层。数据拿过来了,以什么样的形式显示在不同的系统中,网络的系统调用接口大同小异3. 再识协议上面的内容,我们只是懂了一些基本概念,还是达不到我们的目标,下面我们再次重新理解协议和协议分层🍉 为什么要有 TCP/IP 协议?首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:SATA,IDE,SCSI等。只不过我们感知不到罢了。而且这些协议都在本地主机各自的硬件中,通信的成本、问题比较少。其次,网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议咯。所以,为什么要有 TCP/IP 协议?本质就是通信主机距离变远了🍉 什么是 TCP/IP 协议?TCP/IP 协议的本质是一种解决方案TCP/IP 协议能分层,前提是因为问题们本身能分层 TCP/IP 协议与操作系统的关系(宏观上,怎么实现的),如下图  所以究竟什么是协议?截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了OS 源代码一般都是用 C/C++语言写的。下面,仔细看看下面的图 💡 问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?🔖 回答:答案是肯定的!因为双方都有同样的结构体类型 struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别对方发来的数据,这不就是约定吗?关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型🔖 因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。🍉 理解网络协议栈结合 用户贯穿硬件 的结构进行理解: 层状是一样的,层和层之间进行匹配网络通信的本质:就是贯穿协议栈的过程 网络协议栈的层状结构中,每一层都有协议(约定的解读)信息传递要保证可靠性:要有序。所以每个协议层都要有自己的序号 -- 即 协议报头报头:在协议中,报头(Header)通常指的是数据包或帧的开头部分,其中包含了关于该数据包或帧的元信息。这些信息对于协议的正确路由和处理数据包/帧至关重要,确保成功地将它从发送方传递到接收方报头的重要性:报头在协议中扮演着至关重要的角色。它是数据包或帧的“身份证”,包含了必要的元信息和控制信息,以确保数据包能够正确、高效地传输到目标地址。同时,报头也是协议实现和调试的重要工具,通过分析报头信息,可以了解数据包在网络中的传输情况,诊断和解决网络故障网卡为什么要把数据交给内存?因为 冯诺依曼结构 规定的,到内存中才能被 OS 处理4. 网络传输基本流程🦌 局域网传输流程局域网: 这里主要以以太网为例🛹 认识以太网通信• 首先回答,两台主机在同一个局域网,是否能够直接通信?是的• 原理类似上课局域网内,两个直接连接的主机之间可以直接通信。例如投屏需要手机和电视连接同一个 wifi主流的局域网通讯协议:以太网太阳光八分钟到地球,宇宙中是否存在让光传递的介质--以太,就像空气一样的?后来物理界证实不存在,就是真空的。计算机科学家Q到,我们光电传输就有--以太网~🛹 认识 Mac 地址• 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址MAC 地址用来识别数据链路层中相连的节点;长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示 (如: 08:00:27:03:fb:19)在网卡出厂时就确定了,不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址,可能会冲突;也有些网卡支持用户配置 mac 地址)以太网中,任何时刻,只允许一台机器向网络中发送数据如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞所有发送数据的主机要进行碰撞检测和碰撞避免所以发送主机都要执行碰撞避免的算法,保证任何时刻都只有一台主机在发送消息所以局域网最好不会太大,和引入交换机没有交换机的情况下,一个以太网就是一个碰撞域交换机:划分碰撞域碰撞域:指在网络中,数据信号传输过程中可能发生冲突的区域。在同一个碰撞域内的所有设备共享同一物理介质,在一个碰撞域内,所有设备都监听同一个物理信道,并且任何时刻只能有一台设备发送数据。局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标 mac 地址判定💢 这里可以试着从系统角度来理解局域网通信原理,初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程🛹 同一个网段内的两台主机消息的发送初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程 而其中每层都有协议,所以当我进行进行上述传输流程的时候,要进行封装和解包 用户 A 从上到下进行封装,由硬件发出用户 B 从下到上进行解包,由硬件接收 用户 A B 都需要贯穿协议层,为啥要进行这么多交互,因为数据需要通过硬件来收发下面我们明确一下概念 报头部分,就是对应协议层的结构体字段,我们一般叫做报头除了报头,剩下的叫做有效载荷故,报文=报头+有效载荷报文被别人抓走了怎么办?为了确保网络安全,可以在应用层进行加密(令牌环),对方就看不到如何看待局域网?只允许一个发送,可以看作每台主机背后就是一个进程,网络的传输是共享资源,传输要互斥进行🛹 数据包封装和分用不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)数据段是在传输层(Transport Layer)处理的数据单元,通常用于描述TCP或UDP等传输协议封装的信息。在图中,“你好”这个字符串是应用层数据,在传输层会被封装成一个数据段,并添加上相应的头部信息,如序列号、确认号、源端口/目的端口等。数据报是在网络层(Network Layer)处理的数据单元,通常用于描述IP协议封装的信息。在图中,数据段经过网络层后会变成一个数据报,它包含了原始数据段以及其他必要的头部信息,例如源IP地址、目的IP地址、TTL(Time To Live)、协议类型等。​​​​​​​数据帧是在链路层(Link Layer)处理的数据单元,通常用于描述以太网驱动程序封装的信息。在图中,数据报经过链路层后会变成一个数据帧,它包含了原始数据报以及其他必要的头部信息,例如MAC地址(源MAC地址、目的MAC地址)、FCS(Frame Check Sequence)等。​​​​​​​总结来说,数据段是传输层的概念,数据报是网络层的概念,而数据帧则是链路层的概念。这些不同层次的数据单元在计算机网络中起着不同的作用,它们通过层层封装和解封装来实现数据的有效传输。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息.数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理.OSI的数据链路层通常同时使用报头和报尾进行封装通信的过程:本质就是不断的封装和解包的过程所以在逻辑上,就感觉是在同层传递,例如: ⭕ 扩展:几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力--分用封装的时候,一定要考虑后面的解包过程:如何将报文中的报头和有效载荷进行分离 —> 约定任何协议都要解决如何将自己的有效载荷交付给上一层的协议 —> 共性每层协议都要解决这两个问题🍒 封装 🍒 分用 因此后面我们学习任何协议,都要先宏观上建立这样的认识:问题1:协议,是如何做到解包的?🔥 协议解包(解封装)是指接收方从接收到的数据中逐层剥离头部信息,提取出有效载荷,并将其传递给上层协议的过程。解包的关键在于每层协议能够识别自己的头部信息,并根据这些信息决定如何处理数据。以下是协议解包的详细过程协议栈的每一层都会根据协议规范,解析并剥离自己的头部信息,然后将剩余的数据传递给上层协议。以下是逐层解封装的详细步骤:(1) 物理层接收方从物理介质(如网线、光纤)接收到原始的比特流。物理层将这些比特流组装成链路层的帧。(2) 链路层(如以太网)链路层解析帧的头部信息(如目标MAC地址、源MAC地址、帧类型等)。检查帧的完整性(通过校验和或CRC校验)。如果帧类型指示上层协议是IP协议,链路层会剥离帧头部和尾部,将IP数据包传递给网络层。(3) 网络层(如IP协议)网络层解析IP头部信息(如源IP地址、目标IP地址、协议类型等)。检查IP数据包的完整性(通过校验和)。如果协议类型指示上层协议是TCP或UDP,网络层会剥离IP头部,将TCP/UDP段传递给传输层。(4) 传输层(如TCP/UDP)传输层解析TCP/UDP头部信息(如源端口、目标端口、序列号、校验和等)。检查数据的完整性和顺序(TCP协议会进行校验和验证、数据重组等)。根据目标端口号,传输层会剥离TCP/UDP头部,将应用层数据传递给相应的应用层协议。(5) 应用层(如HTTP、FTP)应用层协议解析数据内容(如HTTP请求或响应)。根据协议规范处理数据,完成最终的业务逻辑。问题2:协议是如何做到将自己的有效载荷,交付给上层协议的?发送方封装:上层协议数据作为有效载荷传递给当前协议。当前协议添加头部信息,形成完整的报文。数据传输:封装后的报文通过网络传输到接收方。接收方解封装:接收方解析当前协议的头部信息,验证数据完整性。提取有效载荷,准备传递给上层协议。传递有效载荷:将有效载荷交给上层协议处理。关键点封装与解封装:每层协议添加或移除自己的头部信息。协议标识:头部信息中包含协议标识,确保数据传递给正确的上层协议。错误检测:通过校验和等机制确保数据传输的可靠性。🦌 跨网络传输流程🛴 令牌环🔥 令牌环网络中,所有的计算机或工作站被连接成一个逻辑或物理的环形拓扑结构,网络中数据的传输是通过一个特殊的控制信号,即“令牌”来管理的 令牌环网和以太网都属于数字链路层,但是底层协议是不一样的因为网络是层状结构的,所以替换底层协议,不影响传输🛴 认识 IP 地址我怎么知道是要跨网络交给主机的呢?IP 地址可以保证主机在全网的唯一性,例如:我们云服务器的连接 IP 就是唯一的两个小故事:从辽宁到云南,沿路旅游的路线如何设计从哪来,到哪去--一直是不变的--IP 地址--指导我们进行路径规划上一站从哪里来,下一站到哪里去--会一直变化,变化的依据是“我要去哪里”--Mac 地址相当于 IP 是大目标,Mac 是小目标指令:ip -a 可以查看当前的ip地址IP 地址是什么?IP地址是在IP协议中, 用来标识网络中不同主机的地址对于IPv4来说, IP地址是一个4字节, 32位的整数我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一字节, 范围是 0 - 255跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.IP 地址的意义为什么要去目标主机,先要走路由器?目的 IP 的意义IP地址的意义是:路径选择 —> 从哪里来,到哪里去,IP地址是永远不变的IP 地址为什么要交给路由器?路由器会重新解包,和封装 数据链层协议,实现了不同区域网之间的通信,解决了底层协议的差异化同一子网,没有路由器的话,就会底层协议需要一样IP 及上层是一样的,IP 协议屏蔽了底层网络的差异,靠的就是工作在 IP 层的路由器IP 实现了全球主机的软件虚拟层,一切皆是 IP 报文!也体现了网络层状结构的优越性然后结合封装与解包,体现路由器解包和重新封装的特点 🛴 对比 IP 地址和 Mac 地址的区别IP 地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正)Mac 地址一直在变目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依据,mac 地址是局域网转发的重要依据IP地址是一个数字,用于唯一标识网络中的一台主机。应用于网络层,基于网络拓扑描述起点和终点,Mac地址是物理网卡硬件地址,用于标识相邻设备,应用于链路层IP地址的分配是基于网络拓朴,MAC地址的分配是基于制造商IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层(数据链路层协议可以通过MAC地址使数据从一个节点传递到相同链路的另一个节点上)由于IP地址是一个逻辑地址,所以可以给MAC地址对应分配不同的IP地址,使网络通信更加灵活提炼 IP 网络的意义和网络通信的宏观流程 路由器,可以根据 IP 地址判断目的地在哪个局域网内,IP 地址的设计非常的巧妙,它在网络层,会根据目的地,进行路径选择时选择了下一个跳转的路由器。IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异ifconfig   --查看当前云服务器的MAC地址,IP地址IP数据报的收发方进行跨网投递时,发送方需利用ARP协议获取:发送方本网段路由器对应端口的MAC地址当需要跨网络进行传递的时候,也就是意味着需要找到该数据包的下一跳的MAC地址,所以认为从发送方出来,首先先到到达本网段的路由器,所以获取本网段的路由器的MAC地址🛴 补充 -- IP协议IP协议有两个版本, IPv4 和 IPv6IPv4地址解释IPv4地址是一个4字节(即32位)的整数,它可以被看作是一个无符号整数(unsigned int)。这意味着它可以表示从0到 (2^{32} - 1) 之间的任何整数值,即从0到4,294,967,295(约42亿)。四字节和32位的关系4字节:在计算机中,一个字节(Byte)等于8位(bits),所以4字节就是 (4 \times 8 = 32) 位。32位:指的是IPv4地址的总长度,由32个二进制位组成。点分十进制表示法点分十进制是一种常用的表示IPv4地址的方法,它将32位的二进制数分成四个8位的部分,每部分转换成十进制数,并用点(.)分隔开。例如,IPv4地址 192.168.0.1 就是点分十进制格式。每个数字的取值范围在点分十进制表示法中,每个数字代表一个字节(8位),因此它们的取值范围是从0到255。这是因为8位二进制数的最大值为 (2^8 - 1 = 255)。最小值:0,对应于8位全0,即 00000000。最大值:255,对应于8位全1,即 11111111。示例如下以 192.168.0.1 为例:第一部分 192 对应于二进制 11000000第二部分 168 对应于二进制 10101000第三部分 0 对应于二进制 00000000第四部分 1 对应于二进制 00000001合并起来就是 11000000 10101000 00000000 00000001,去掉空格后就是32位的二进制数 11000000101010000000000000000001。🔥 总的来说,IPv4地址是一个32位的无符号整数,通常以点分十进制的形式表示,每个部分都是一个8位的二进制数,取值范围是0到255。这种表示方法使得IPv4地址更加易于阅读和记忆。IPv6,IP地址是一个16个字符,128位比特位的整数。防止 IPv4 不够用要想普及一项技术,需要孵化出一个更大的运用场景,例如物联网使用 IPv6 的话...现在国家规定,公司要兼容 IPv6————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/island1314/article/details/144703475
  • [技术干货] 求助,aarch64 上的麒麟系统 + Ascend310P 如何使用 VTK?
    很显然无法直接 pip install,自己找源码编译,需要依赖 OpenGL 而 Ascend 计算卡又不支持。如果安装 mesa 又报错各种依赖装不上。论坛上有朋友成功搞定过的嘛?
  • [问题求助] 不支持FT2000CPU吗?安装报错[gauss-51615]欧拉、麒麟、等系统一样的报错
    安装报错[gauss-51615]欧拉、麒麟、等系统一样的报错。CPU型号FT2000
  • [问题求助] IBM system x3610支持ESX7.0系统安装吗?IBM system x3610支持ESX7.0系统安装吗?
    rtIBM system x3610支持ESX7.0系统安装吗?IBM system x3610支持ESX7.0系统安装吗?
  • [技术干货] 【华为开发者布道师】鸿蒙操作系统的图形子系统原理解析——东北大学 张昊阳
    参考书籍资料:《鸿蒙操作系统设计原理与架构》 (李毅,任革林)布道活动地点:东北大学(浑南校区)
  • [问题求助] openEuler 22.03版本的奇怪端口问题
    描述:使用openEuler 22.03操作系统发现一个奇怪问题,一个监听端口已经不存在,telnet 本地回环地址出现卡住现象。
  • [技术干货] sysMaster用户指南
    概述 sysMaster 是一套超轻量、高可靠的服务管理程序集合,是对 1 号进程的全新实现,旨在改进传统的 init 守护进程。它使用 Rust 编写,具有故障监测、秒级自愈和快速启动等能力,从而提升操作系统可靠性和业务可用度。 sysMaster 支持进程、容器和虚拟机的统一管理,其适用于服务器、云计算和嵌入式等多个场景。 sysMaster 实现思路是将传统 1 号进程的功能解耦分层,结合使用场景,拆分出 1+1+N 的架构。 如下面 sysMaster 系统架构图所示,主要包含三个方面: • sysmaster-init:新的 1 号进程提供系统初始化、僵尸进程回收、监控保活等功能,可单独应用于嵌入式场景。 • sysmaster-core:承担原有服务管理的核心功能,引入可靠性框架,使其具备崩溃快速自愈、热升级等能力,保障业务全天在线。 • sysmaster-exts:使原本耦合的各组件功能独立,提供系统关键功能的组件集合(如设备管理 devMaster,总线通信 busMaster 等),各组件可单独使用,可根据不同场景灵活选用。  ​图1 sysMaster整体架构图 sysMaster sysMaster 目前主要由 sysmaster 和 devmaster 两部分功能组成,其中 sysmaster 负责服务的管理,devmaster 负责设备的管理,下面将对这两部分功能进行说明。 
  • [技术干货] sysmaster使用说明
     本章主要通过一些实例来带领用户初步使用 sysmaster,例如:  如何创建 service服务单元配置文件。 如何管理单元服务,例如启动、停止、查看服务。 更多可以查阅官方手册。  创建单元配置文件 用户可以在 /usr/lib/sysmaster/system/目录下创建单元配置文件。  单元配置文件的类型 当前 sysmaster支持 target、socket、service类型的单元配置文件。  target:封装了一个由 sysmaster管理的启动目标,用于将多个单元集中到一个同步点。sysmaster提供不同阶段的 target单元,例如 multi-user.target代表系统已完成启动,用户可以依赖此目标,启动自己的服务。 socket:封装了一个用于进程间通信的套接字 socket, 以支持基于套接字的启动。例如用户可以配置 service单元依赖此 socket,当此 socket有数据写入时,sysmaster会拉起对应的 service单元。 service:封装了一个被 sysmaster监视与控制的进程。 单元配置文件的构成 单元配置文件通常由3块组成:  Unit:单元的公共配置说明,如服务名称、描述、依赖关系等。 Install:描述如何安装和启动服务。 Service、Socket:各个单元类型的配置。 创建service单元配置 sshd服务被用来远程登录到服务器,并在远程终端上执行命令和操作。 使用如下配置项来创建一个 sshd.service服务单元配置。  [Unit] Description=“OpenSSH server daemon” Documentation=“man:sshd(8) man:sshd_config(5)” After=“sshd-keygen.target” Wants=“sshd-keygen.target”  [Service] Type=“notify” EnvironmentFile=“-/etc/sysconfig/sshd” ExecStart=“/usr/sbin/sshd -D $OPTIONS” ExecReload=“/bin/kill -HUP $MAINPID” KillMode=“process” Restart=“on-failure” RestartSec=42  [Install] WantedBy=“multi-user.target” 以下是对单元配置文件中选项配置的说明,更多可以查阅官方手册。  Description:说明该 unit的主要功能。 Documentation:说明该 unit的文档链接。 After:配置同时启动的单元的先后顺序,sshd.service服务将在 sshd-keygen.target之后启动。 Wants:配置一个单元对另一个单元的依赖,启动 sshd.service服务,将会自动启动 sshd-keygen.target。 Type:配置 sysmaster 如何启动此服务,notify表明需要主进程启动完成后发送通知消息。 EnvironmentFile:设置环境变量的文件读取路径。 ExecStart:配置服务启动时执行的命令,启动 sshd.service服务会执行 sshd命令。 ExecReload:配置重新加载 sshd.service的配置时执行的命令。 KillMode:配置当需要停止服务进程时,杀死服务进程的方法,process表示只杀死主进程。 Restart:配置服务不同情况下退出或终止,是否重新启动服务,on-failure表示当服务非正常退出时重新启动服务。 RestartSec:配置当服务退出时,重新拉起服务的间隔时间。 WantedBy:配置依赖当前 sshd.service服务的单元。 管理单元服务 sctl是 sysmaster的命令行工具,用于检查和控制 sysmaster服务端行为和各个服务的状态,它可以启动、停止、重启、检查系统服务。  启动服务 使用以下命令可以启动 sshd服务和运行 ExecStart所配置的命令。  sctl start sshd.service 停止服务 使用以下命令可以停止 sshd服务,杀死 ExecStart所运行的进程。  sctl stop sshd.service 重启服务 使用以下命令可以重启 sshd服务,该命令会先停止后启动服务。  sctl restart sshd.service 查看服务状态 使用以下命令可以查看服务 sshd运行状态,用户可以查看服务的状态来获取服务是否正常运行。 
  • [技术干货] isocut 使用指南
     简介 openEuler 光盘镜像较大,下载、传输镜像很耗时。另外,使用 openEuler 光盘镜像安装操作系统时,会安装镜像所包含的全量 RPM 软件包,用户无法只安装部分所需的软件包。  在某些场景下,用户不需要安装镜像提供的全量软件包,或者需要一些额外的软件包。因此,openEuler 提供了镜像裁剪定制工具。通过该工具,用户可以基于 openEuler 光盘镜像裁剪定制仅包含所需 RPM 软件包的 ISO 镜像。这些软件包可以来自原有 ISO 镜像,也可以额外指定,从而满足用户定制需求。  本文档介绍 openEuler 镜像裁剪定制工具的安装和使用方法,以指导用户更好的完成镜像裁剪定制。  软硬件要求 使用 openEuler 裁剪定制工具制作 ISO 所使用的机器需要满足如下软硬件要求:  CPU 架构为 AArch64。 操作系统为 openEuler 22.03 LTS SP3。 建议预留 60 GB 以上的磁盘空间(用于运行裁剪定制工具和存放 ISO 镜像)。 安装工具 此处以 openEuler 22.03 LTS SP3 版本的 AArch64 架构为例,介绍 ISO 镜像裁剪定制工具的安装操作。  确认机器已安装操作系统 openEuler 22.03 LTS SP3(镜像裁剪定制工具的运行环境)。  $ cat /etc/openEuler-release openEuler release 22.03 LTS SP3 下载对应架构的 ISO 镜像(必须是 everything 版本),并存放在任一目录(建议该目录磁盘空间大于 20 GB),此处假设存放在 /home/isocut_iso 目录。  AArch64 架构的镜像下载链接为:  https://repo.openeuler.org/openEuler-22.03-LTS-SP3/ISO/aarch64/openEuler-22.03-LTS-SP3-everything-aarch64-dvd.iso  说明: x86_64 架构的镜像下载链接为:  https://repo.openeuler.org/openEuler-22.03-LTS-SP3/ISO/x86_64/openEuler-22.03-LTS-SP3-everything-x86_64-dvd.iso  创建文件 /etc/yum.repos.d/local.repo,配置对应 yum 源。配置内容参考如下,其中 baseurl 是用于挂载 ISO 镜像的目录:  [local] name=local baseurl=file:///home/isocut_mount gpgcheck=0 enabled=1 使用 root 权限,挂载光盘镜像到 /home/isocut_mount 目录(请与上述 repo 文件中配置的 baseurl 保持一致)作为 yum 源,参考命令如下:  sudo mount -o loop /home/isocut_iso/openEuler-22.03-LTS-SP3-everything-aarch64-dvd.iso /home/isocut_mount 使 yum 源生效:  yum clean all yum makecache 使用 root 权限,安装镜像裁剪定制工具:  sudo yum install -y isocut 使用 root 权限,确认工具已安装成功:  $ sudo isocut -h Checking input … usage: isocut [-h] [-t temporary_workspace] [-r rpm_path] [-k kickstart_file_path] [-p product_name] [-v version_number] [-i install_picture_path] [-c cut_packages] source_iso dest_iso  Cut openEuler iso to small one  positional arguments: source_iso source iso image dest_iso destination iso image  optional arguments: -h, --help show this help message and exit -t temporary_workspace temporary workspace -r rpm_path extern rpm packages path -k kickstart_file_path kickstart file path -p product_name The product name -v version_number The version number -i install_picture_path The path of background pictures during the installation -c cut_packages cut packages, yes/no, default is yes 裁剪定制镜像 此处介绍如何使用镜像裁剪定制工具基于 openEuler 光盘镜像裁剪或添加额外 RPM 软件包制作新镜像的方法。  命令介绍 命令格式 镜像裁剪定制工具通过 isocut 命令执行功能。命令的使用格式为:  isocut [ --help | -h ] [ -t <temporary_workspace> ] [ -r <rpm_path> ] [ -k <kickstart_file_path> ] [ -p <product_name> ] [ -v <version_number>] [ -i <install_picture_path> ] [ -c <cut_packages> ] < source_iso > < dest_iso >  参数说明 参数 是否必选 参数含义 –help | -h 否 查询命令的帮助信息。 -t <temporary_workspace> 否 指定工具运行的临时目录 temporary_workspace,其中 temporary_workspace 为绝对路径。默认为 /tmp 。 -r <rpm_path> 否 用户需要额外添加到 ISO 镜像中的 RPM 包路径。 -k <kickstart_file_path> 否 用户需要使用 kickstart 自动安装,指定 kickstart 模板路径。 -p <product_name> 否 产品名称。 -v <version_number> 否 产品版本号。 -i<install_picture_path> 否 中度换标替换图片路径。 -c <cut_packages> 否 用户需要通过指定 cut_packages 参数,选择是否需要裁剪rpm包。默认为裁剪rpm包。 source_iso 是 用于裁剪的 ISO 源镜像所在路径和名称。不指定路径时,默认当前路径。 dest_iso 是 裁剪定制生成的 ISO 新镜像存放路径和名称。不指定路径时,默认当前路径。 说明:  表中提到的路径均支持绝对路径和相对路径。 中度换标替换图片路径下图片文件命名及像素要求如下:  安装引导界面左侧边栏背景图: sidebar-bg.png 290780 安装引导界面左上角logo图片: sidebar-logo.png 13232 设置信息上侧工具栏背景图: topbar-bg.png 831*105 软件包来源 新镜像的 RPM 包来源有:  原有 ISO 镜像。该情况通过配置文件 /etc/isocut/rpmlist 指定需要安装的 RPM 软件包,配置格式为 “软件包名.对应架构”,例如:kernel.aarch64 。  额外指定。执行 isocut 时使用 -r 参数指定软件包所在路径,并将添加的 RPM 包按上述格式添加到配置文件 /etc/isocut/rpmlist 中。  说明:  裁剪定制镜像时,若无法找到配置文件中指定的 RPM 包,则镜像中不会添加该 RPM 包。 若 RPM 包的依赖有问题,则裁剪定制镜像时可能会报错。 kickstart 功能介绍 用户需要实现镜像自动化安装,可以通过 kickstart 的方式。在执行 isocut 时使用 -k 参数指定 kickstart 文件。  isocut 为用户提供了 kickstart 模板,路径是 /etc/isocut/anaconda-ks.cfg,用户可以基于该模板修改。  修改 kickstart 模板 若用户需要使用 isocut 工具提供的 kickstart 模板,需要修改以下内容:  必须在文件 /etc/isocut/anaconda-ks.cfg 中配置 root 和 grub2 的密码。否则镜像自动化安装会卡在设置密码的环节,等待用户手动输入密码。 如果要添加额外 RPM 包,并使用 kickstart 自动安装,则在 /etc/isocut/rpmlist 和 kickstart 文件的 %packages 字段都要指定该 RPM 包。 接下来介绍 kickstart 文件详细修改方法。  配置初始密码 配置 root 初始密码 /etc/isocut/anaconda-ks.cfg 中 root 初始密码的默认配置如下,其中 ${pwd} 需要替换成用户实际的加密密文:  rootpw --iscrypted ${pwd} 这里给出设置 root 初始密码的方法(需使用 root 权限):  添加用于生成密码的用户,此处假设 testUser:  $ sudo useradd testUser 设置 testUser 用户的密码。参考命令如下,根据提示设置密码:  $ sudo passwd testUser Changing password for user testUser. New password: Retype new password: passwd: all authentication tokens updated successfully. 查看 /etc/shadow 文件,获取加密密码(用户 testUser 后,两个 : 间的字符串,此处使用 *** 代替):  $ sudo cat /etc/shadow | grep testUser testUser:***:19052:0:90:7:35:: 拷贝上述加密密码替换 /etc/isocut/anaconda-ks.cfg 中的 pwd 字段,如下所示(请用实际内容替换 *** ):  rootpw --iscrypted *** 配置 grub2 初始密码 /etc/isocut/anaconda-ks.cfg 文件中添加以下配置,配置 grub2 初始密码。其中 ${pwd} 需要替换成用户实际的加密密文:  %addon com_huawei_grub_safe --iscrypted --password=‘${pwd}’ %end 说明:  配置 grub 初始密码需要使用 root 权限。  grub 密码对应的默认用户为 root 。  系统中需有 grub2-set-password 命令,若不存在,请提前安装该命令。  执行如下命令,根据提示设置 grub2 密码:  $ sudo grub2-set-password -o ./ Enter password: Confirm password: grep: .//grub.cfg: No such file or directory WARNING: The current configuration lacks password support! Update your configuration with grub2-mkconfig to support this feature. 命令执行完成后,会在当前目录生成 user.cfg 文件,grub.pbkdf2.sha512 开头的内容即 grub2 加密密码:  $ sudo cat user.cfg GRUB2_PASSWORD=grub.pbkdf2.sha512.*** 复制上述密文,并在 /etc/isocut/anaconda-ks.cfg 文件中增加如下配置:  %addon com_huawei_grub_safe --iscrypted --password=‘grub.pbkdf2.sha512.***’ %end 配置 %packages 字段 如果需要添加额外 RPM 包,并使用 kickstart 自动安装,需要在 /etc/isocut/rpmlist 和 kickstart 文件的 %packages 字段都指定该 RPM 包。  此处介绍在 /etc/isocut/anaconda-ks.cfg 文件中添加 RPM 包。  /etc/isocut/anaconda-ks.cfg 文件的 %packages 默认配置如下:  %packages --multilib --ignoremissing acl.aarch64 aide.aarch64 … NetworkManager.aarch64 %end 将额外指定的 RPM 软件包添加到 %packages 配置中,需要遵循如下配置格式:  “软件包名.对应架构”,例如:kernel.aarch64  %packages --multilib --ignoremissing acl.aarch64 aide.aarch64 … NetworkManager.aarch64 kernel.aarch64 %end 操作指导 说明:  请不要修改或删除 /etc/isocut/rpmlist 文件中的默认配置项。 isocut 的所有操作需要使用 root 权限。 待裁剪的源镜像可以为基础镜像,也可以是 everything 版镜像,例子中以基础版镜像 openEuler-22.03-LTS-SP3-aarch64-dvd.iso 为例。 例子中假设新生成的镜像名称为 new.iso,且存放在 /home/result 路径;运行工具的临时目录为 /home/temp;额外的 RPM 软件包存放在 /home/rpms 目录。 修改配置文件 /etc/isocut/rpmlist,指定用户需要安装的 RPM 软件包(来自原有 ISO 镜像)。  sudo vi /etc/isocut/rpmlist 确定运行镜像裁剪定制工具的临时目录空间大于 8 GB 。默认临时目录为 /tmp,也可以使用 -t 参数指定其他目录作为临时目录,该目录必须为绝对路径。本例中使用目录 /home/temp,由如下回显可知 /home 目录可用磁盘为 38 GB,满足要求。  $ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.2G 0 1.2G 0% /dev tmpfs 1.5G 0 1.5G 0% /dev/shm tmpfs 1.5G 23M 1.5G 2% /run tmpfs 1.5G 0 1.5G 0% /sys/fs/cgroup /dev/mapper/openeuler_openeuler-root 69G 2.8G 63G 5% / /dev/sda2 976M 114M 796M 13% /boot /dev/mapper/openeuler_openeuler-home 61G 21G 38G 35% /home 执行裁剪定制。  场景一:新镜像的所有 RPM 包来自原有 ISO 镜像  $ sudo isocut -t /home/temp /home/isocut_iso/openEuler-22.03-LTS-SP3-aarch64-dvd.iso /home/result/new.iso Checking input … Checking user … Checking necessary tools … Initing workspace … Copying basic part of iso image … Downloading rpms … Finish create yum conf finished Regenerating repodata … Checking rpm deps … Getting the description of iso image … Remaking iso … Adding checksum for iso … Adding sha256sum for iso … ISO cutout succeeded, enjoy your new image “/home/result/new.iso” isocut.lock unlocked … 回显如上,说明新镜像 new.iso 定制成功。  场景二:新镜像的 RPM 包除来自原有 ISO 镜像,还包含来自 /home/rpms 的额外软件包  sudo isocut -t /home/temp -r /home/rpms /home/isocut_iso/openEuler-22.03-LTS-SP3-aarch64-dvd.iso /home/result/new.iso 场景三:使用 kickstart 文件实现自动化安装,需要修改 /etc/isocut/anaconda-ks.cfg 文件  sudo isocut -t /home/temp -k /etc/isocut/anaconda-ks.cfg /home/isocut_iso/openEuler-22.03-LTS-SP3-aarch64-dvd.iso /home/result/new.iso cut packages 功能介绍 基于 openEuler 发布的标准 ISO 镜像进行最小系统定制裁剪,定制安装过程中支持按需裁剪 RPM 包。  通过指定cut_packages参数,用户可以自行选择是否需要裁剪RPM包。  操作指导 场景一:用户不裁剪RPM包  $ sudo isocut -t /opt/tlriso/tmp -p openEuler -c no -v 22.03-LTS-SP3 openEuler-22.03-LTS-SP3-x86_64-dvd.iso openEuler-22.03-LTS-SP3-x86_64-dvd_new.iso Checking input … Checking user … Checking necessary tools … Initing workspace … Copying basic part of iso image … Getting the description of iso image … Downloading rpms … Finish create yum conf finished Regenerating repodata … Checking rpm deps … Skip checking rpm deps!! Replacing install background pictures … Updating EFI config file … Updating legacy config file … Updating treeinfo file … Customizing kickstart file … Remaking iso … Adding checksum for iso … Adding sha256sum for iso … ISO cutout succeeded, enjoy your new image “openEuler-22.03-LTS-SP3-x86_64-dvd_new.iso” isocut.lock unlocked … 回显如上,说明新镜像 new.iso 定制成功。  场景二:用户裁剪rpm包  sudo isocut -t /opt/tlriso/tmp -p openEuler -c yes -v 22.03-LTS-SP3 openEuler-22.03-LTS-SP3-x86_64-dvd.iso openEuler-22.03-LTS-SP3-x86_64-dvd_new.iso 场景三:默认裁剪rpm包,参数取值为空  sudo isocut -t /opt/tlriso/tmp -p openEuler -v 22.03-LTS-SP3 openEuler-22.03-LTS-SP3-x86_64-dvd.iso openEuler-22.03-LTS-SP3-x86_64-dvd_new.iso 
  • [技术干货] 磁盘IO子系统性能调优
     调优思路 CPU的Cache、内存和磁盘之间的访问速度差异很大,当CPU计算所需要的数据并没有及时加载到内存或Cache中时,CPU将会浪费很多时间等待磁盘的读取。计算机系统通过cache、RAM、固态盘、磁盘等多级存储结构,并配合多种调度算法,来消除或缓解这种速度不对等的影响。但是缓存空间总是有限的,我们可以利用局部性原理,尽可能的将热点数据提前从磁盘中读取出来,降低CPU等待磁盘的时间浪费。因此我们的部分优化手段其实是围绕着如何更充分的利用Cache获得更好的IO性能。  另外,本章节也会介绍从文件系统层面的优化手段。  主要优化参数 优化项  优化项简介  默认值  生效范围  鲲鹏916  鲲鹏920  脏数据缓存到期时间  调整脏数据缓存到期时间,分散磁盘的压力。  3000(单位为0.01秒)  立即生效YY  脏页面占用总内存最大的比例  调整脏页面占用总内存最大的比例(以memfree+Cached-Mapped为基准),增加PageCache命中率。  10%  立即生效YY  脏页面缓存占用总内存最大的比例  调整脏页面占用总存最大的比例,避免磁盘写操作变为O_DIRECT同步,导致缓冲机制失效。  40%  立即生效YY  调整磁盘文件预读参数  根据局性原理,在读取磁盘数据时,额外地多读一定量的数据缓存到内存。  128KB  立即生效YY  磁盘IO调度方式  根据业务处理数据的特点,选择合适的IO调度器。  cfq  立即生效YY  文件系统  选用性能更好的文件系统以及文件系统相关的选项。 二、 介绍 iostat是调查磁盘IO问题使用最频繁的工具。它汇总了所有在线磁盘统计信息,为负载特征归纳,使用率和饱和度提供了指标。它可以由任何用户执行,统计信息直接来源于内核,因此这个工具的开销基本可以忽略不计。  安装方式 iostat一般会随系统安装。如果没有,以CentOS为例,可以使用以下命令安装:  yum -y install sysstat 使用方式 命令格式:直接使用命令+参数,例如  iostat -d -k -x 1 100 常用参数如下:  参数  说明  -c  显示CPU使用情况。  -d  显示磁盘使用情况。  -k  以KB为单位显示。  -m  以M为单位显示。  -p  显示磁盘单个的情况。  -t  显示时间戳。  -x  显示详细信息。  我们也可以在最后添加统计周期和统计时长,比如上面的样例中,是要求以1s为周期统计,总共统计100s。  输出格式:  Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util sda 0.02 7.25 0.04 1.90 0.74 35.47 37.15 0.04 19.13 5.58 1.09 dm-0 0.00 0.00 0.04 3.05 0.28 12.18 8.07 0.65 209.01 1.11 0.34 dm-1 0.00 0.00 0.02 5.82 0.46 23.26 8.13 0.43 74.33 1.30 0.76 dm-2 0.00 0.00 0.00 0.01 0.00 0.02 8.00 0.00 5.41 3.28 0.00 参数含义如下:  参数  说明  rrqm/s  每秒合并放入请求队列的读操作数。  wrqm/s  每秒合并放入请求队列的写操作数。  r/s  每秒磁盘实际完成的读I/O设备次数。  w/s  每秒磁盘实际完成的写I/O设备次数。  rkB/s  每秒从磁盘读取KB数。  wkB/s  每秒写入磁盘的KB数。  avgrq-sz  平均请求数据大小,单位为扇区(512B)。  avgqu-sz  平均I/O队列长度(操作请求数)。  await  平均每次设备I/O操作的等待时间(毫秒)。  svctm  平均每次设备I/O操作的响应时间(毫秒)。  %util  用于I/O操作时间的百分比,即使用率。  重要参数详解:  rrqm/s和wrqm/s,每秒合并后的读或写的次数(合并请求后,可以增加对磁盘的批处理,对HDD还可以减少寻址时间)。如果值在统计周期内为非零,也可以看出数据的读或写操作的是连续的,反之则是随机的。 如果%util接近100%(即使用率为百分百),说明产生的I/O请求太多,I/O系统已经满负荷,相应的await也会增加,CPU的wait时间百分比也会增加(通过TOP命令查看),这时很明显就是磁盘成了瓶颈,拖累整个系统。这时可以考虑更换更高性的能磁盘,或优化软件以减少对磁盘的依赖。 await(读写请求的平均等待时长)需要结合svctm参考。svctm的和磁盘性能直接有关,它是磁盘内部处理的时长。await的大小一般取决于svctm以及I/O队列的长度和。svctm一般会小于await,如果svctm比较接近await,说明I/O几乎没有等待时间(处理时间也会被算作等待的一部分时间);如果wait大于svctm,差的过高的话一定是磁盘本身IO的问题;这时可以考虑更换更快的磁盘,或优化应用。 队列长度(avgqu-sz)也可作为衡量系统I/O负荷的指标,但是要多统计一段时间后查看,因为有时候只是一个峰值过高。 三、 介绍 blktrace是一个用户态的工具,提供I/O子系统上时间如何消耗的详细信息,从中可以分析是IO调度慢还是硬件响应慢等。配套工具blkparse从blktrace读取原始输出,并产生人们可读的输入和输出操作摘要。btt作为blktrace软件包的一部分而被提供,它分析blktrace输出,并显示该数据用在每个I/O栈区域的时间量,使它更容易在I/O子系统中发现瓶颈。  安装方式 以CentOS为例,可以使用以下命令安装:  yum -y install blktrace 使用方式 使用blktrace命令抓取指定设备的IO信息,如:  blktrace -w 120 -d /dev/sda “-w”后接的参数指定抓取时间,以秒为单位;“-d”后接的参数指定设备。  命令执行完后会生成一系列以device.blktrace.cpu格式命令的二进制文件。  使用blkparse命令解析blktrace生成的数据,如:  blkparse -i sda -d blkparse.out “-i”后接的参数指定输入文件名,由于blktrace输出的文件名默认都是device.blktrace.cpu格式,所以只需输入前面的“device”即可;“-d”后接的参数指定二进制输出文件。  这个命令会将分析结果输出到屏幕,并且将分析结果的二进制数据输出到blkparse.out文件中。  使用btt命令查看IO的整体情况,如:  btt -i blkparse.out “-i”后接的参数指定输入文件名。  Q2Q:多个发送到块IO层请求的时间间隔。 Q2G:生成IO请求所消耗的时间,包括remap(可能被DM(Device Mapper)或MD(Multiple Device, Software RAID)remap到其它设备)和split(可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(split)成多个物理I/O)的时间。 G2I:IO请求进入IO Scheduler所消耗的时间,包括merge(可能会因为与其它I/O请求的物理位置相邻而合并成一个I/O)的时间。 I2D:IO请求在IO Scheduler中等待的时间。 D2C:IO请求在driver和硬件上(IO请求被driver提交给硬件,经过HBA、电缆(光纤、网线等)、交换机(SAN或网络)、最后到达存储设备,设备完成IO请求之后再把结果发回)所消耗的时间。 Q2C:整个IO请求所消耗的时间(Q2I + I2D + D2C = Q2C),相当于iostat的await。 正常情况D2C占比90%以上,若I2D占比较高,可以尝试调整IO调度策略。 四、原理 PageCache中需要回写到磁盘的数据为脏数据。在应用程序通知系统保存脏数据时,应用可以选择直接将数据写入磁盘(O_DIRECT),或者先写到PageCache(非O_DIRECT模式)。非O_DIRECT模式,对于缓存在PageCache中的数据的操作,都在内存中进行,减少了对磁盘的操作。  修改方式 系统中提供了以下参数来调整策略:  /proc/sys/vm/dirty_expire_centiseconds此参数用于表示脏数据在缓存中允许保留的时长,即时间到后需要被写入到磁盘中。此参数的默认值为30s(3000 个0.01秒)。如果业务的数据是连续性的写,可以适当调小此参数,这样可以避免IO集中,导致突发的IO等待。可以通过echo命令修改:  echo 2000 > /proc/sys/vm/dirty_expire_centisecs /proc/sys/vm/dirty_background_ratio脏页面占用总内存最大的比例(以memfree+Cached-Mapped为基准),超过这个值,pdflush线程会刷新脏页面到磁盘。增加这个值,系统会分配更多的内存用于写缓冲,因而可以提升写磁盘性能。但对于磁盘写入操作为主的业务,可以调小这个值,避免数据积压太多最后成为瓶颈,可以结合业务并通过观察await的时间波动范围来识别。此值的默认值是10,可以通过echo来调整: echo 8 > /proc/sys/vm/dirty_background_ratio /proc/sys/vm/dirty_ratio为脏页面占用总内存最大的比例,超过这个值,系统不会新增加脏页面,文件读写也变为同步模式。文件读写变为同步模式后,应用程序的文件读写操作的阻塞时间变长,会导致系统性能变慢。此参数的默认值为40,对于写入为主的业务,可以增加此参数,避免磁盘过早的进入到同步写状态。 说明 如果加大了脏数据的缓存大小和时间,在意外断电情况下,丢失数据的概率会变多。因此对于需要立即存盘的数据,应该采用O_DIRECT模式避免关键数据的丢失。 
  • [其他问题] 华为鲲鹏920 5220 内核4.14.0-115.el7a.0.1.aarch64 系统:centos 7.6.1810(altarch)如何安装dotnet5和dotnet7
    安装完dotnet后执行dotnet --info报错,  执行dotnet --list  又没问题 ,大概意思libicuil8n..so.50这个文件有问题,但又找不到正常文件cannot get symbol ucol_setMaxVariable_50 from libicui18n error:/lib64/libicuil8n..so.50: undefined symbol:ucol_setMaxVariable_50 Aborted
  • [问题求助] gaussDB是否能像mysql一样在windows和linux安装呢,如果可以是在哪里下载相关安装包呢
    gaussDB是否能像mysql一样在windows和linux安装呢,如果可以是在哪里下载相关安装包呢
  • [案例分享] 如何关闭和开启透明大页transparent_hugepage
    关闭 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag 修改完成后,请执行如下命令,使参数生效。 reboot 打开 echo always> /sys/kernel/mm/transparent_hugepage/enabled echo always> /sys/kernel/mm/transparent_hugepage/defrag 修改完成后,请执行如下命令,使参数生效。 reboot 透明大页的enabled和defrag的取值有三个 always madvise 和never
  • [案例分享] windows环境下查询端口是否被占用
    windows环境下查询端口是否被占用netstat -aon|findstr "具体的端口号",例如:netstat -aon|findstr "5432"TCP 0.0.0.0:5432 0.0.0.0:0 LISTENING 11108TCP 127.0.0.1:65432 0.0.0.0:0 LISTENING 1092TCP [::]:5432 [::]:0 LISTENING 11108UDP 127.0.0.1:65432 *:* 1092
  • [技术干货] 产品的操作系统功能域介绍
       基于台区SCU操作系统规范要求,使用国产操作系统RTOS和轻量化容器引擎isulad,满足了嵌入式轻量化、资源占用少的要求,为应用层提供稳定的基础服务平台。主要定制特性如下:基于RTOS基础能力实现进程管理、内存管理和文件系统管理等基础功能和性能规格要求。适配电力行业安全标准,满足安全启动、可信启动要求。使用国产轻量化容器isula实现容器功能。基于台区规范要求,增加了命令行、设备管理等基础管理功能。操作系统板级外设驱动适配。功能名称功能简述日志管理对日志大小、转存等进行管理;日志压缩等用户管理添加、删除用户;用户权限控制;用户密码修改等网络管理对网络IP、路由等进行配置4G上网 提供4G上网功能  设备管理  提供容器管理  安全加固  安全启动、权限控制,用户隔离  驱动适配  支持载波、交采、串口管理、4G上网、以太网 表1 操作系统功能域简述表   
总条数:21 到第
上滑加载中