• 关于

    h标签与p标签

    的搜索结果

回答

浏览器渲染机制 浏览器采用流式布局模型(Flow Based Layout)浏览器会把HTML解析成DOM,把CSS解析成CSSOM,DOM和CSSOM合并就产生了渲染树(Render Tree)。有了RenderTree,我们就知道了所有节点的样式,然后计算他们在页面上的大小和位置,最后把节点绘制到页面上。由于浏览器使用流式布局,对Render Tree的计算通常只需要遍历一次就可以完成,但table及其内部元素除外,他们可能需要多次计算,通常要花3倍于同等元素的时间,这也是为什么要避免使用table布局的原因之一。 重绘 由于节点的几何属性发生改变或者由于样式发生改变而不会影响布局的,称为重绘,例如outline, visibility, color、background-color等,重绘的代价是高昂的,因为浏览器必须验证DOM树上其他节点元素的可见性。 回流 回流是布局或者几何属性需要改变就称为回流。回流是影响浏览器性能的关键因素,因为其变化涉及到部分页面(或是整个页面)的布局更新。一个元素的回流可能会导致了其所有子元素以及DOM中紧随其后的节点、祖先节点元素的随后的回流。 <body> <div class="error"> <h4>我的组件</h4> <p><strong>错误:</strong>错误的描述…</p> <h5>错误纠正</h5> <ol> <li>第一步</li> <li>第二步</li> </ol> </div> </body> 在上面的HTML片段中,对该段落(p标签)回流将会引发强烈的回流,因为它是一个子节点。这也导致了祖先的回流(div.error和body – 视浏览器而定)。此外,h5和ol也会有简单的回流,因为其在DOM中在回流元素之后。大部分的回流将导致页面的重新渲染。 回流必定会发生重绘,重绘不一定会引发回流。 浏览器优化 现代浏览器大多都是通过队列机制来批量更新布局,浏览器会把修改操作放在队列中,至少一个浏览器刷新(即16.6ms)才会清空队列,但当你获取布局信息的时候,队列中可能有会影响这些属性或方法返回值的操作,即使没有,浏览器也会强制清空队列,触发回流与重绘来确保返回正确的值。 主要包括以下属性或方法: - offsetTop、offsetLeft、offsetWidth、offsetHeight - scrollTop、scrollLeft、scrollWidth、scrollHeight - clientTop、clientLeft、clientWidth、clientHeight - width、height - getComputedStyle() - getBoundingClientRect() 所以,我们应该避免频繁的使用上述的属性,他们都会强制渲染刷新队列。 减少重绘与回流 CSS 使用 transform 替代 top使用 visibility 替换 display: none ,因为前者只会引起重绘,后者会引发回流(改变了布局)避免使用table布局,可能很小的一个小改动会造成整个 table 的重新布局。尽可能在DOM树的最末端改变class,回流是不可避免的,但可以减少其影响。尽可能在DOM树的最末端改变class,可以限制了回流的范围,使其影响尽可能少的节点。 避免设置多层内联样式,CSS 选择符从右往左匹配查找,避免节点层级过多。 <div> <a> <span></span> </a> 对于第一种设置样式的方式来说,浏览器只需要找到页面中所有的 span 标签然后设置颜色,但是对于第二种设置样式的方式来说,浏览器首先需要找到所有的 span 标签,然后找到 span 标签上的 a 标签,最后再去找到 div 标签,然后给符合这种条件的 span 标签设置颜色,这样的递归过程就很复杂。所以我们应该尽可能的避免写过于具体的 CSS 选择器,然后对于 HTML 来说也尽量少的添加无意义标签,保证层级扁平。 - 将动画效果应用到position属性为absolute或fixed的元素上,避免影响其他元素的布局,这样只是一个重绘,而不是回流,同时,控制动画速度可以选择 requestAnimationFrame,详见探讨 requestAnimationFrame。 - 避免使用CSS表达式,可能会引发回流。 - 将频繁重绘或者回流的节点设置为图层,图层能够阻止该节点的渲染行为影响别的节点,例如will-change、video、iframe等标签,浏览器会自动将该节点变为图层。 - CSS3 硬件加速(GPU加速),使用css3硬件加速,可以让transform、opacity、filters这些动画不会引起回流重绘 。但是对于动画的其它属性,比如background-color这些,还是会引起回流重绘的,不过它还是可以提升这些动画的性能。 2. Javascript - 避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。 - 避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。 - 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。 - 对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流。
九旬 2020-05-24 11:22:47 0 浏览量 回答数 0

问题

【discuz伪静态】系列之三:TAG标签伪静态方案

此篇为系列教程,为还在为dz伪静态烦恼的站长们助力(译版:为了申请版主而做准备)!   以discuz!3.2 + nginx为例!...
wgrid.cn 2019-12-01 21:56:31 10085 浏览量 回答数 0

回答

创建一个包含模板间共享布局的模板,通常这样的模板包含: 页面头部、导航栏、脚部、内容展示区域。 Layout.html <!DOCTYPE html> <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <head> <title>Layout page</title> <script src="common-script.js"></script> </head> <body> <header> <h1>My website</h1> </header> <section layout:fragment="content"> <p>Page content goes here</p> </section> <footer> <p>My footer</p> <p layout:fragment="custom-footer">Custom footer here</p> </footer> </body> </html> 注意事项: 1. html标签上附上命名空间 2. section与脚部p标签上使用layout:fragment属性 这些是布局中的插入候选槽点,通过匹配内容模板中片段进行替换。 创建一些内容模板: Content1.html <!DOCTYPE html> <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorate="~{Layout}"> <head> <title>Content page 1</title> <script src="content-script.js"></script> </head> <body> <section layout:fragment="content"> <p>This is a paragraph from content page 1</p> </section> <footer> <p layout:fragment="custom-footer">This is some footer content from content page 1</p> </footer> </body> </html> html标签中的layout:decorate说明哪一个布局模板使用这个内容模板进行装饰。内容模板定义自身标题与脚本、content与custom-footer片段。custom-footer片段处于footer元素内部,这其实是不必要的,但是可能会是很方便的,如果想要做内容模板的静态模板,这是一开始使用Thymeleaf的原因之一。 在一个模板内片段名称必须唯一,否则可能会出现片段不匹配,各种各样的可笑事情会接踵而至。 不管如何,一旦告知Thymeleaf处理Content1.html,最终的页面会是这样子: <!DOCTYPE html> <html> <head> <title>Content page 1</title> <script src="common-script.js"></script> <script src="content-script.js"></script> </head> <body> <header> <h1>My website</h1> </header> <section> <p>This is a paragraph from content page 1</p> </section> <footer> <p>My footer</p> <p>This is some footer content from content page 1</p> </footer> </body> </html> 内容模板装饰Layout.html,结果是布局的组合,加上内容模板的片段(两个模板的<head>元素,来自内容模板的<title>元素替换布局文件内的,所有的元素来自布局文件,但是由所有指定的内容模板进行替换) 想了解更多可以如何控制<head>元素合并,参看<head>元素合并一小节。 装饰进程重定向处理从内容模板至布局,将layout:fragment部分从内容模板中挑选出来,因为布局需要它们。正因如此,任何在layout:fragment之外的东西实际从未得到执行,这说明在内容模板中不能这样做: <div th:if="${user.admin}"> <div layout:fragment="content"> ... </div> </div> 如果布局模板想要’内容’片段,那么会得到那个片段,不顾任何所在条件,因为那些条件不会执行。 如果说只想用绝对最小HTML代码量替换装饰器脚部: Content2.html <p layout:decorate="~{Layout}" layout:fragment="custom-footer"> This is some footer text from content page 2. </p> 这就是全部所需的东西!<p>标签同时用作根元素与片段定义,生成一个像这样的页面: <!DOCTYPE html> <html> <head> <title>Layout page</title> <script src="common-script.js"></script> </head> <body> <header> <h1>My website</h1> </header> <section> <p>Page content goes here</p> </section> <footer> <p>My footer</p> <p> This is some footer text from content page 2. </p> </footer> </body> </html> 可以把布局看作母版,会得以填充或者被内容(子模板)覆盖,仅当内容会填充/覆盖父类。以这种方式,布局充当某种’默认’,内容充当这种默认之上的实现。 给布局传送数据 子模板向上给母版布局传送数据,在涉及到布局/装饰过程的任意元素上使用th:with/ data-th-with属性处理器,可以在任何地方layout:decorate/ data-layout-decorate 或者可以发现 layout:fragment/data-layout-fragment, 例如: 孩子/内容模板: <html layout:decorate="your-layout.html" th:with="greeting='Hello!'"> 1 父类/布局模板: <html> ... <p th:text="${greeting}"></p> <!-- You'll end up with "Hello!" in here --> 将来,或许会增加支持使用分片局部变量,很像Thymeleaf用于创建片段签名。 配置标题 鉴于布局方言自动用内容模板中所发现的重载布局<title>,可能会发现自己重复布局中发现的标题部分,尤其是想要创建面包屑或者在页面标题中保留页面名称。layout:title-pattern处理器可以免除重复布局标题的问题,通过使用一些特殊标记以想要标题如何出现的模式。 这是一个例子: Layout.html <!DOCTYPE html> <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <head> <title layout:title-pattern="$LAYOUT_TITLE - $CONTENT_TITLE">My website</title> </head> ... </html> layout:title-pattern处理器采取简单字符串,识别两种特殊标记:$LAYOUT_TITLE与$CONTENT_TITLE。每种标记在结果页中会被各自相应的标题替换。所以,如果有下面的内容模板: Content.html <!DOCTYPE html> <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" layout:decorator="Layout"> <head> <title>My blog</title> </head> ... </html> 结果页会是这样: <!DOCTYPE html> <html> <head> <title>My website - My blog</title> </head> ... </html> 这对<title>元素内的静态/内联文本或者<title>元素上发现使用th:text的动态文本均有效。 上述例子中的模式在布局中指定,所以对所有使用布局的内容模板均适用。如果在内容模板中指定另一种标题模式,那么会覆盖布局中发现的那个,允许细粒度的控制标题的展现形式。 可重用模板 假如发现有一些HTML或者结构经常性地重复,想要做成自己的模板从不同地方插入以便减少代码重复。(模块化Thymeleaf?)这个的例子可能会是一个模态面板,由几个HTML元素与CSS类构成,在网页应用中产生一个新窗口的效果: Modal.html <!DOCTYPE html> <html> <body> <div id="modal-container" class="modal-container" style="display:none;"> <section id="modal" class="modal"> <header> <h1>My Modal</h1> <div id="close-modal" class="modal-close"> <a href="#close">Close</a> </div> </header> <div id="modal-content" class="modal-content"> <p>My modal content</p> </div> </section> </div> </body> </html> 会发现可以将一些东西转换成像头部、ID的变量,以便包含Modal.html的页面可以设定它们自己的名称/ID。继续尽可能泛型化编写模态代码,然而会遇到填充自己的模态框内容的问题,那是开始接触一些限制的地方。 一些页面使用单一消息的模态框,其他想要使用模态框容纳一些更复杂的东西比如接受用户输入的表单。模态框可能性变得无休无止,但是未支持想象,发现自己得不得将这段模态框代码拷贝到每一个模板中,每一次使用场合变化相应内容,重复同样的HTML代码维持同样的外观感受,打破了过程中的DRY原则。 主要妨碍适当重用的事情是无法将HTML元素传递至插入模板中。这正是layout:insert有用的地方。它运作起来完全像th:insert,但是通过指定与实现片段很像内容/布局实例,可以创建一个公共的结构,对插入它的模板使用场合作出响应。 这是一个更新的模态框模板,使用Thymeleaf与layout:fragment属性定义一个可替换的模态框内容部分以变得更加泛型化: Modal2.html Modal2.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> <body layout:fragment="modal(modalId, modalHeader)"> <div th:id="${modalId} + '-container'" class="modal-container" style="display:none;"> <section th:id="${modalId}" class="modal"> <header> <h1 th:text="${modalHeader}">My Modal</h1> <div th:id="'close-' + ${modalId}" class="modal-close"> <a href="#close">Close</a> </div> </header> <div th:id="${modalId} + '-content'" class="modal-content"> <div layout:fragment="modal-content"> <p>My modal content</p> </div> </div> </section> </div> </body> </html> 现在可以插入这个模板,使用layout:insert处理器与无论怎样需要实现modal-content片段,通过在调用模板插入元素内创建同样名称的片段: Content.html <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> ... <div layout:insert="Modal2 :: modal(modalId='message', modalHeader='Message')" th:remove="tag"> <p layout:fragment="modal-content">Message goes here!</p> </div> ... </html> 就像内容/布局实例,插入模板layout:fragment会被匹配片段名称的元素替换掉。在这种场合下,Modal2.html的整个modal-content部分会被上述自定义段落替换掉。这是结果: <!DOCTYPE html> <html> ... <div id="message-container" class="modal-container" style="display:none;"> <section id="message" class="modal"> <header> <h1>Message</h1> <div id="close-message" class="modal-close"> <a href="#close">Close</a> </div> </header> <div id="message-content" class="modal-content"> <p>Message goes here!</p> </div> </section> </div> ... </html> 定义在模板内包含Modal2.html的自定义消息作为模态框内容的一部分。在插入模板上下文环境中的片段与用于内容/布局过程中的片段一样工作:如果片段未在模板中定义,那么它不会覆盖插入模板中的内容,使得在可重用版本中创建默认。
景凌凯 2020-04-29 21:11:25 0 浏览量 回答数 0

回答

LZ的问题: 一切皆为框div、h1 或 p 元素常常被称为块级元素。这意味着这些元素显示为一块内容,即“块框”。与之相反,span 和 strong 等元素称为“行内元素”,这是因为它们的内容显示在行中,即“行内框”。您可以使用 display 属性改变生成的框的类型。这意味着,通过将 display 属性设置为 block,可以让行内元素(比如 元素)表现得像块级元素一样。还可以通过把 display 设置为 none,让生成的元素根本没有框。这样的话,该框及其所有内容就不再显示,不占用文档中的空间。——《W3School:CSS 定位》块框和行内框有明确的包含关系: 块框可以包含块框行内框可以包含行内框块框可以包含行内框行内框不应该包含块框(若违法这条规则,结果很复杂,但绝对难以达成想要的效果)更多区别: block元素默认宽度自适应于外层,而inline元素宽度自适应于内部block元素默认从上往下铺排,inline元素默认从左往右铺排block元素可以设置上下margin,inline元素不可以至于float,它主要是为了满足环绕的效果,请阅读:CSS float浮动的深入研究、详解及拓展(一)、(二)。 由于LZ缺的知识点太多,这里实在是写不完。还是建议完成w3school的相关课程学习,和codecademy的CSS Positioning类目下的课程。 如果LZ有英文阅读能力,在实践后可以以这篇文章来指导知识的深化:《【译】理解 CSS 规范》 下面主要是反驳“块级元素前后会带有换行符”的误导性观点。 CSS的问题,越基础,就越容易出现误解。 “块级元素前后会带有换行符”这种说法应该是来自于实战,用类比的方式做了相应知识点的内化。读到这句话,大家也可以很轻松地联想起word之类的文本排版软件的操作:Q: 如果我有文字段A和文字段B,我想让A和B左右不交叠,折开一行,我该怎么办?A: 按回车。Q: 如果我有文字段C和图片D,我想让D不出现在C中间,从C下延排起,我该怎么办?A: 按回车。 是这样的吗?把word之类的文本排版软件的思维带到HTML里面来,下面的思维应该很常见: 在两个元素之间死命摁回车,想让两个元素上下隔得远一些 标签放在任意两个元素之间,想让两个元素上下隔得远一些。http://jsfiddle.net/humphry/3Lk2Q/点击预览 我敢相信到现在都有人是用(或者另外一个有高度的 标签)而非margin来做的垂直间隔。用Word的方式来理解HTML,用来做间隔,等到试验出来用font-size和line-height去控制的高度,以调节两个div之间的垂直距离的时候,就彻彻底底被带到沟里去了。(《你真的了解HTML吗》)“块级元素前后会带有换行符”的误导性大于它的帮助,LZ甚至已经问出了“如果是display:inline;的话那元素没有换行符就会全挤在一行上是吗?”这样的问题。 换行符不是重点,重点是盒子。 要正确理解CSS排版中的这个基础部分,得先从文档流开始。 CSS为了达到日常排版的需求,给予了文档流以现实依据:我们的书写/阅读习惯:这里就展现了从右向左,从上到到下的语言书写。因此跟这个世界的现象一致,文档流的顺序不总是从左往右从上到下,一系列属性可以改变它,不过我们这里不谈这个,我们只谈常规流。 CSS中的文档流中的两种元素,行内框的堆叠方向对应着我们的书写顺序,而块框则默认从上往下堆叠: 行内框——inline——从左往右,从上往下块框——block——从上往下换行在这个顺序中重不重要?不重要,这个过程中,重点是框往哪个方向堆叠。 更加深入的常规流介绍:《w3help:常规流( Normal flow )》 前端是一个由实践发展起的方向,相关知识点的理解大家经常用的是类比,这很正常。盒子堆叠的机制用类比,说成是换行符,对不对呢? 对也不对。说对,是因为,让盒子不左右交叠、而是上下比邻的机制跟文本排版软件里面的回车分割确实相似;说不对,是因为,如果理解到了盒子的层面,理解了块级元素和行内元素是如何按照文档流方向进行排版,理解了float元素是如何做到环绕,理解了浮动和清除浮动,就会明白,“块级元素天生自带换行符”的说法带有根深蒂固的Word排版的思想,也很有误导性。 最好的理解CSS和HTML的办法,是用CSS和HTML的方式进行思考,而不是用其他的经验来套。这就像是英语口语,有英语思维,才能流利地表达。 更新:感谢P酱,这里将容易混淆的部分修改了。“行内框不应该包含块框”是CSS相关,标签无关的,“默认是行内的元素不应该包含默认是块级的元素”跟DTD声明和浏览器有关。但总体来说,破坏这两条规则很难达成想要的效果。
a123456678 2019-12-02 02:21:19 0 浏览量 回答数 0

回答

在云游戏、AI 模型推理、Deep Learning 教学等场景下,单个任务并不能完全使用整块 GPU 设备的计算和存储资源。为了使这类“小规模”任务仍能高效地使用 GPU,阿里云基于 Nvidia GPU 虚拟化方案提供了轻量级 GPU 计算实例。本文主要为您介绍 Kubernetes 集群如何支持轻量级 GPU 的管理和调度。 前提条件 您需要开通容器服务和访问控制(RAM)服务。 背景信息 轻量级 GPU 实例是在一台阿里云 ECS 虚拟机中装载了一块“小规格”的 GPU 卡。这块“小规格” GPU 卡提供的显存大小只有普通卡的几分之一,按不同实例规格区分。请参见GPU计算型实例概述。 用户在创建或者扩容 Kubernetes 集群时,只需为 Worker 节点选择合适的轻量级GPU实例规格(如 ecs.vgn* 系列)。或者将已存在的轻量级GPU 实例,通过自动/手动添加到 Kubernetes 集群中,此时在 Kubernetes 集群中使用轻量级 GPU 实例运行作业的过程与正常 GPU 实例一致。 本文将以创建 Kubernetes 集群时,添加 ecs.vgn5i 实例为例说明如何使用轻量级 GPU。 创建集群过程中,容器服务会进行如下操作: 创建 ECS,配置管理节点到其他节点的 SSH 的公钥登录,通过 CloudInit 安装配置 Kubernetes 集群。 创建安全组,该安全组允许 VPC 入方向全部 ICMP 端口的访问。 如果您不使用已有的 VPC 网络,会为您创建一个新的 VPC 及 VSwitch,同时为该 VSwitch 创建 SNAT。 创建 VPC 路由规则。 创建 NAT 网关及 EIP。 创建 RAM 子账号和 AccessKey,该子账号拥有 ECS 的查询、实例创建和删除的权限,添加和删除云盘的权限,SLB 的全部权限,云监控的全部权限,VPC 的全部权限,日志服务的全部权限,NAS 的全部权限。Kubernetes 集群会根据用户部署的配置相应的动态创建 SLB,云盘,VPC路由规则。 创建内网 SLB,暴露 6443 端口。 创建公网 SLB,暴露 6443、8443和 22 端口(如果您在创建集群的时候选择开放公网 SSH 登录,则会暴露 22 端口;如果您选择不开放公网 SSH 访问,则不会暴露 22 端口)。 使用限制 随集群一同创建的负载均衡实例只支持按量付费的方式。 Kubernetes 集群仅支持专有网络 VPC。 每个账号默认可以创建的云资源有一定的配额,如果超过配额创建集群会失败。请在创建集群前确认您的配额。 如果您需要提高配额,请提交工单申请。 每个账号默认最多可以创建 5 个集群(所有地域下),每个集群中最多可以添加 40 个节点。如果您需要创建更多的集群或者节点,请提交工单申请。 说明 Kubernetes 集群中,VPC 默认路由条目不超过48条,意味着 Kubernetes 集群使用 VPC 时,默认节点上限是 48 个,如果需要更大的节点数,需要您先对目标 VPC 开工单,提高 VPC 路由条目,再对容器服务提交工单。 每个账号默认最多可以创建 100 个安全组。 每个账号默认最多可以创建 60 个按量付费的负载均衡实例。 每个账号默认最多可以创建 20 个EIP。 ECS 实例使用限制: 仅支持 CentOS 操作系统。 支持创建按量付费和包年包月的 ECS 实例。 说明 实例创建后,您可以通过 ECS 管理控制台将按量付费转预付费,请参见按量付费转包年包月。 创建 VGN5I 型 Kubernetes 集群 此处创建的 VGN5I 型集群支持专有版 Kubernetes 和托管版 Kubernetes。下文示例中以创建托管版 Kubernetes为例为您介绍。 登录容器服务管理控制台。 在 Kubernetes 菜单下,单击左侧导航栏的集群 > 集群,单击页面右上角的创建 Kubernetes 集群。 在选择集群模板页面,选择标准托管版集群页面,并单击创建,进入Kubernetes 托管版页面。 创建集群 说明 为了创建 GPU 集群,通常情况下,Worker 节点使用 GPU 类型的 ECS。集群其他参数配置,请参见创建Kubernetes 托管版集群。 设置 Worker 节点的配置信息。本例中将 Worker 节点作为 GPU 工作节点,选择 GPU 计算型实例规格 vgn5i。 若您选择新增实例,则需要选择 Worker 节点的系列和规格,以及需要创建的 Worker 节点的数量(本示例创建 2 个 GPU 节点,实例类型为 ecs.vgn5i-m2.xlarge)。 设置work节点 若您选择添加已有实例,则需要预先在此地域下创建轻量级 GPU 云服务器。 完成其他配置后,单击创建集群,启动部署。 集群创建成功后,单击左侧导航栏中的集群 > 节点,进入节点列表页面。 选择所需的集群,选择创建集群时配置的 Worker 节点,单击操作列的更多 > 详情,查看该节点挂载的 GPU 设备。 在节点 详情 页面可以看到集群为该轻量级 GPU 实例添加了专门的标签,显示 GPU 设备数量,显存量和虚拟化 GPU 设备名,包括 aliyun.accelerator/nvidia_count: 1、aliyun.accelerator/nvidia_mem: 2048MiB 和 aliyun.accelerator/nvidia_name: GRID-P4-2Q。标签详情 运行 CUDA 容器验证轻量级 GPU 环境 轻量级 GPU 在容器服务 Kubernetes 集群中的使用方式和普通 GPU 类似,都是通过在 Pod 描述中指定该作业需要 nvidia.com/gpu 资源。由于一个实例中只有一块轻量级 GPU 设备,用户需要指定 nvidia.com/gpu为 1。 说明 如果集群中既有轻量级 GPU 实例,又有普通 GPU 实例,则需要在 Pod 描述中通过配置 nodeSelector 和节点标签指定调度到不同类型节点上。 这里可以用一个例子向您展示如何在 CUDA 容器中使用 CUDA 官方示例测试 GPU 设备。 在 Kubernetes 菜单下,单击左侧导航栏的应用 > 无状态,进入无状态(Deployment)页面。 单击页面右上角的创建使用模板创建 。 选择所需的集群,命名空间,选择样例模板或自定义,然后单击创建。 应用 本例中,示例模板是一个运行 CUDA 容器的 Deployment。 这里通过节点标签aliyun.accelerator/nvidia_mem: 2048MiB,将该 Pod 部署到创建 VGN5I 型 Kubernetes 集群中创建的轻量级 GPU 节点上。 apiVersion: apps/v1 kind: Deployment metadata: name: cuda-sample labels: app: cuda-sample spec: replicas: 1 selector: matchLabels: app: cuda-sample template: metadata: labels: app: cuda-sample spec: nodeSelector: aliyun.accelerator/nvidia_mem: 2048MiB containers: - name: cuda-sample image: nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 command: ["tail", "-f", "/dev/null"] resources: limits: nvidia.com/gpu: "1" 待 cuda-sample 启动后,通过 kubectl exec 命令进入该容器内部查看 GPU 设备情况和测试 CUDA 代码。 通过 kubectl 连接 Kubernetes 集群。 执行如下命令,获取 Pod 名称。 $kubectl get pod NAME READY STATUS RESTARTS AGE cuda-sample-79f9fc9cc5-hlpp5 1/1 Running 0 4h27m 执行如下命令,查看 GPU 设备情况。 可以看到该 Pod 容器中有一块 GRID P4-2Q 设备,提供 2048 MiB 显存。 $kubectl exec -it cuda-sample-79f9fc9cc5-hlpp5 bash root@cuda-sample-79f9fc9cc5-hlpp5:/# nvidia-smi Thu Nov 21 14:45:45 2019 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.70 Driver Version: 418.70 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 GRID P4-2Q On | 00000000:00:07.0 Off | N/A | | N/A N/A P8 N/A / N/A | 144MiB / 2048MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ 执行如下命令,查看 CUDA 版本,安装 CUDA Sample 示例,并测试示例代码。 root@cuda-sample-79f9fc9cc5-hlpp5:/# nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2017 NVIDIA Corporation Built on Fri_Sep__1_21:08:03_CDT_2017 Cuda compilation tools, release 9.0, V9.0.176 root@cuda-sample-79f9fc9cc5-hlpp5:/# apt-get update && apt-get install -y cuda-samples-9-0 ... root@cuda-sample-79f9fc9cc5-hlpp5:/# cd /usr/local/cuda-9.0/samples/0_Simple/simpleTexture root@cuda-sample-79f9fc9cc5-hlpp5:/usr/local/cuda-9.0/samples/0_Simple/simpleTexture# make ... root@cuda-sample-79f9fc9cc5-hlpp5:/usr/local/cuda-9.0/samples/0_Simple/simpleTexture# ./simpleTexture simpleTexture starting... GPU Device 0: "GRID P4-2Q" with compute capability 6.1 Loaded 'lena_bw.pgm', 512 x 512 pixels Processing time: 0.038000 (ms) 6898.53 Mpixels/sec Wrote './data/lena_bw_out.pgm' Comparing files output: <./data/lena_bw_out.pgm> reference: <./data/ref_rotated.pgm> simpleTexture completed, returned OK
1934890530796658 2020-03-27 10:03:05 0 浏览量 回答数 0

回答

查询云服务器ECS可用的实例规格资源。 描述 查询某一可用区中所有可用的ECS实例规格详情。 请求参数 名称 类型 是否必需 默认值 描述 Action String 是 - 操作接口名,系统规定参数,取值:ListAvailableEcsTypes。 RegionId String 是 - 地域 ID ZoneId String 是 - 可用区 ID。 SpotStrategy String 否 NoSpot 可选项:NoSpot、SpotWithPriceLimit 或 SpotAsPriceGo。具体含义请参考 ECS CreateInstance 接口同名参数。 InstanceChargeType String 否 PostPaid ECS 实例的付费类型,PostPaid:按量付费,PrePaid:包年包月。具体含义请参考 ECS CreateInstance 接口同名参数。 ShowSoldOut Boolean 否 - 显示实例规格是否卖完。 返回参数 除公共参数外返回如下结果: 名称 类型 描述 SupportSpotInstance Boolean 是否支持竞价实例。 InstanceTypeFamilies Array< InstanceTypeFamilyInfo> 实例规格所属的规格族。详细字段内容请看下面说明。 其中, InstanceTypeFamilyInfo 结构的格式如下: 名称 类型 描述 Generation String 实例规格族系列。 InstanceTypeFamilyId String 实例规格所属的规格族ID。更多详情,请参见 实例规格族。 Types Array< TypesInfo> 规格列表。 其中, TypesInfo 结构的格式如下: 名称 类型 描述 CpuCoreCount integer vCPU内核数目。 EniQuantity integer 实例规格支持网卡数量。 GPUAmount integer 实例规格附带GPU数量。 GPUSpec integer 实例规格附带GPU类型 。 InstanceTypeId String 实例规格ID。 MemorySize integer 内存大小,单位GiB。 Status String 实例状态。 InstanceBandwidthRx integer 内网入方向带宽限制,单位为kbps。 InstanceBandwidthTx integer 内网出方向带宽限制,单位为kbps。 InstancePpsRx integer 内网入方向PPS限制。 InstancePpsTx integer 内网出方向PPS限制。 示例 请求示例 https://ehpc.cn-hangzhou.aliyuncs.com/?Action=ListAvailableEcsTypes&RegionId=cn-hangzhou&ZoneId=cn-hangzhou-b&<公共请求参数> 返回示例 XML格式 4 819200 2 150000 ecs.n4.xlarge 819200 8 0 150000 ecs.n4 ecs-3 D9DD3AF8-1F91-4075-8669-55D10E45D9B1 true JSON格式 { "InstanceTypeFamilies": { "InstanceTypeFamilyInfo": [ { "Types": { "TypesInfo": [ { "CpuCoreCount": 4, "InstanceBandwidthRx": 819200, "EniQuantity": 2, "InstancePpsRx": 150000, "InstanceTypeId": "ecs.n4.xlarge", "InstanceBandwidthTx": 819200, "GPUSpec": "", "MemorySize": 8, "GPUAmount": 0, "InstancePpsTx": 150000 } ] }, "InstanceTypeFamilyId": "ecs.n4", "Generation": "ecs-3" } ] }, "RequestId": "D9DD3AF8-1F91-4075-8669-55D10E45D9B1", "SupportSpotInstance": true } 错误码 查询 E-HPC 接口错误码请访问 错误码。更多错误码,请访问 API 错误中心。 查询当前最新客户端版本号。 描述 查询当前 E-HPC 客户端最新版本号。 请求参数 字段 类型 是否必需 默认值 描述 Action String 是 - 操作接口名,系统规定参数,取值:ListCurrentClientVersion。 RegionId String 是 - 地域 ID。 返回参数 除公共返回参数外返回如下结果: 名称 类型 描述 ClientVersion String E-HPC 支持的最新客户端版本号。 示例 请求示例 https://ehpc.cn-hangzhou.aliyuncs.com/?Action=ListCurrentClientVersion&RegionId=cn-hangzhou&<公共请求参数> 返回示例 XML格式 04F0F334-1335-436C-A1D7-6C044FE73368 1.0.24 JSON格式 { "RequestId": "04F0F334-1335-436C-A1D7-6C044FE73368", "ClientVersion": "1.0.24" } 错误码 查询 E-HPC 接口错误码请访问 错误码。更多错误码,请访问 API 错误中心。 查询自定义/共享镜像列表。 描述 列出E-HPC产品支持的自定义/共享的镜像列表。 请求参数 字段 类型 是否必须 默认值 描述 Action String 是 - 操作接口名,系统规定参数,取值:ListCustomImages RegionId String 是 - 地域ID ImageOwnerAlias String 否 - 默认值:无,表示返回 self + others 不设置该参数说明不使用该参数进行过滤条件 BaseOsTag String 否 - 基础镜像操作系统标签(管控节点用)。例如:CentOS_7.2_64 返回参数 除公共返回参数外返回如下结果: 字段 类型 描述 Images Array E-HPC支持的自定义/共享的操作系统镜像列表 其中ImageInfo结构的格式如下: 字段 类型 描述 ImageId String 镜像ID ImageName String 镜像名称 ImageOwnerAlias String 镜像类型,system Status String 镜像状态,针对 marketplace ProductCode String 镜像产品code,针对 marketplace SkuCode String 镜像Sku code,针对 marketplace PricingCycle String 镜像计费单位,针对 marketplace PostInstallScript String 镜像后安装脚本 Description String 镜像描述 BaseOsTag BaseOsTag 对应的基础镜像操作系统标签。例如:CentOS_7.2_64 其中,BaseOsTag 结构的格式如下: 字段 类型 描述 OsTag String 操作系统镜像标签。例如:CentOS_7.2_64。 Platform String 操作系统平台。例如:CentOS。 Version String 操作系统版本。例如:7.2。 Architecture String 操作系统架构:i386或x86_64。 示例 请求示例 https://ehpc.cn-hangzhou.aliyuncs.com/?Action=ListCustomImages&RegionId=cn-hangzhou&<公共请求参数> 返回示例 XML格式 04F0F334-1335-436C-A1D7-6C044FE73368 HOUR available m-bp1h8aoe73p71iowjk96 CHESS5高性能集群管理软件 V5.0.27 cmjj028279 marketplace xxxxxx ECS x86_64 7.2 CentOS CentOS_7.2_64 JSON格式 { "RequestId": "04F0F334-1335-436C-A1D7-6C044FE73368", "PricingCycle": "HOUR", "Status": "available", "ImageId": "m-bp1h8aoe73p71iowjk96", "Description": "", "ImageName": "CHESS5高性能集群管理软件 V5.0.27", "ProductCode": "cmjj028279", "ImageOwnerAlias": "marketplace", "Uid": "xxxxxx", "SkuCode": "ECS", "BaseOsTag": { "Architecture": "x86_64", "Version": "7.2", "Platform": "CentOS", "OsTag": "CentOS_7.2_64" } } 错误码 查询E-HPC接口错误码请访问 错误码。更多错误码,请访问 API 错误中心。 查询支持的系统镜像列表。 描述 查询 E-HPC 支持安装的镜像列表。 请求参数 名称 类型 是否必需 默认值 描述 Action String 是 - 操作接口名,系统规定参数,取值:ListImages。 RegionId String 是 - 地域 ID。 返回参数 除公共返回参数外返回如下结果: 名称 类型 描述 OsTags Array E-HPC 支持的操作系统镜像列表。 其中 OsInfo 结构的格式如下: 名称 类型 描述 OsTag String 操作系统镜像标签。例如:CentOS_7.2_64。 Platform String 操作系统平台。例如:CentOS。 Version String 操作系统版本。例如:7.2。 Architecture String 操作系统架构:i386或x86_64。 示例 请求示例 https://ehpc.cn-hangzhou.aliyuncs.com/?Action=ListImages&RegionId=cn-hangzhou&<公共请求参数> 返回示例 XML格式 04F0F334-1335-436C-A1D7-6C044FE73368 x86_64 7.2 CentOS CentOS_7.2_64 x86_64 6.8 CentOS CentOS_6.8_64 JSON格式 { "RequestId": "04F0F334-1335-436C-A1D7-6C044FE73368", "OsTags": { "OsInfo": [ { "Architecture": "x86_64", "Version": "7.2", "Platform": "CentOS", "OsTag": "CentOS_7.2_64" }, { "Architecture": "x86_64", "Version": "6.8", "Platform": "CentOS", "OsTag": "CentOS_6.8_64" } ] } } 错误码 查询 E-HPC 接口错误码请访问 错误码。更多错误码,请访问 API 错误中心。 查询已安装软件列表。 描述 查询单个集群下已安装的软件列表。 请求参数 名称 类型 是否必需 默认值 描述 Action String 是 - 操作接口名,系统规定参数,取值:ListInstalledSoftware。 RegionId String 是 - 地域 ID。 ClusterId String 是 - 集群ID。 返回参数 名称 类型 描述 SoftwareList Array 已安装的软件列表。 其中,SoftwareListItem 结构包含以下字段: 名称 类型 描述 SoftwareVersion String 软件版本。 SoftwareStatus String 软件安装状态。 SoftwareId String 软件ID。 SoftwareName String 软件名。 示例 请求示例 https://ehpc.cn-hangzhou.aliyuncs.com/?Action=ListInstalledSoftware&RegionId=cn-hangzhou&ClusterId=<集群ID>&<公共请求参数> 返回示例 XML格式 200 3.2 Installing MPICH_3.2 mpich 52dc238f-5da3-4385-ba41-a1953a938c56 true JSON格式 { "code":"200","data":{ "SoftwareList":{ "SoftwareList":[{ "SoftwareVersion":"3.2", "SoftwareStatus":"Installing", "SoftwareId":"MPICH_3.2", "SoftwareName":"mpich" }] } }, "requestId":"52dc238f-5da3-4385-ba41-a1953a938c56", "successResponse":true } 错误码 查询 E-HPC 接口错误码请访问 错误码。更多错误码,请访问 API 错误中心。 查询推荐的 ECS 实例规格。 描述 查询 E-HPC 推荐的 ECS 实例规格。 请求参数 名称 类型 是否必需 默认值 描述 Action String 是 - 操作接口名,系统规定参数,取值:ListPreferredEcsTypes。 RegionId String 是 - 地域 ID ZoneId String 是 - 可用区 ID。 SpotStrategy String 否 NoSpot 可选项:NoSpot、SpotWithPriceLimit 或 SpotAsPriceGo。具体含义请参考 ECS CreateInstance 接口同名参数。 InstanceChargeType String 否 PostPaid ECS 实例的付费类型,PostPaid:按量付费,PrePaid:包年包月。具体含义请参考 ECS CreateInstance 接口同名参数。 返回参数 除公共返回参数外返回如下结果: 名称 类型 描述 SupportSpotInstance Boolean 是否支持竞价实例。 Series Array 推荐的 ECS 实例系列列表,每个系列包含 E-HPC 集群各种节点对应的推荐规格。 其中 SeriesInfo 结构的格式如下: 名称 类型 描述 SeriesId String 系列ID。例如:HighCompute、HighMem、GPU、All,其中 All 代表全部可选项。 SeriesName String 系列名称。例如:计算密集、大内存、显卡加速、自定义配置。 Roles Roles 本系列包含的,E-HPC 集群各种节点对应的推荐规格信息。 其中 Roles 结构的格式如下: 名称 类型 描述 Manager Array 管控节点(Manager)对应的推荐 ECS 规格列表。 Compute Array 计算节点(Compute)对应的推荐 ECS 规格列表。 Login Array 登录节点(Login)对应的推荐 ECS 规格列表。 示例 请求示例 https://ehpc.cn-hangzhou.aliyuncs.com/?Action=ListPreferredEcsTypes&RegionId=cn-hangzhou&ZoneId=cn-hangzhou-b&<公共请求参数> 返回示例 XML格式 04F0F334-1335-436C-A1D7-6C044FE73368 true SeriesAll All ecs.sn1ne.2xlarge ecs.sn1ne.4xlarge ecs.n1.tiny ecs.sn1ne.2xlarge ecs.sn1ne.4xlarge ecs.n1.tiny ecs.sn1ne.2xlarge ecs.sn1ne.4xlarge ecs.n1.tiny JSON格式 { "RequestId": "04F0F334-1335-436C-A1D7-6C044FE73368", "SupportSpotInstance": true, "Series": { "SeriesInfo": [ { "SeriesName": "SeriesAll", "SeriesId": "All", "Roles": { "Login": { "InstanceTypeId": [ "ecs.sn1ne.2xlarge", "ecs.sn1ne.4xlarge", "ecs.n1.tiny" ] }, "Manager": { "InstanceTypeId": [ "ecs.sn1ne.2xlarge", "ecs.sn1ne.4xlarge", "ecs.n1.tiny" ] }, "Compute": { "InstanceTypeId": [ "ecs.sn1ne.2xlarge", "ecs.sn1ne.4xlarge", "ecs.n1.tiny" ] } } } ] } } 错误码 查询 E-HPC 接口错误码请访问 错误码。更多错误码,请访问 API 错误中心。 查询可用地域列表。 描述 查询可以使用 E-HPC 的地域列表,关于地域的说明请查看 地域与可用区。 请求参数 名称 类型 是否必需 默认值 描述 Action String 是 - 操作接口名,系统规定参数,取值:ListRegions。 返回参数 除公共返回参数外返回如下结果: 名称 类型 描述 Regions Array 地域信息 RegionInfo 组成的列表。 其中 RegionInfo 结构的格式如下: 名称 类型 描述 RegionId String 地域 ID。 LocalName String 地域名称。 示例 请求示例 https://ehpc.cn-hangzhou.aliyuncs.com/?Action=ListRegions&<公共请求参数> 返回示例 XML格式 04F0F334-1335-436C-A1D7-6C044FE73368 cn-hangzhou 华东1(杭州) cn-shanghai 华东2(上海) JSON格式 { "RequestId": "04F0F334-1335-436C-A1D7-6C044FE73368", "Regions": { "RegionInfo": [ { "RegionId": "cn-hangzhou", "LocalName": "华东1(杭州)" }, { "RegionId": "cn-shanghai", "LocalName": "华东2(上海)" } ] } } 错误码 查询 E-HPC 接口错误码请访问 错误码。更多错误码,请访问 API 错误中心。 查询支持的软件列表。 描述 查询 E-HPC 产品支持安装的软件列表。 请求参数 名称 类型 是否必需 默认值 描述 Action String 是 - 操作接口名,系统规定参数,取值:ListSoftwares。 RegionId String 是 - 地域 ID。 EhpcVersion String 否 - E-HPC 产品版本号,可以调用 ListCurrentClientVersion 接口来进行查询。 返回参数 除公共返回参数外返回如下结果: 名称 类型 描述 Softwares Array 软件信息列表,每个条目对应某个 E-HPC 产品版本以及某个操作系统版本下,可以支持的一组软件名称及软件版本号。 其中 SoftwareInfo 结构的格式如下: 名称 类型 描述 EhpcVersion String E-HPC 版本号。 OsTag String 操作系统镜像标签,可通过 ListImages 接口查询。 SchedulerType String 调度器类型。 SchedulerVersion String 调度器软件版本。 AccountType String 域账号服务类型。 AccountVersion String 域账号服务版本。 Applications Array 集群应用软件列表,每条包含一个软件的名称 Name、版本号 Version、是否必选 Required。 其中 ApplicationInfo 结构的格式如下: 名称 类型 描述 Tag String 软件标签。例如:OpenMPI_1.8.7。 Name String 软件名称。 Version String 软件版本。 Required Boolean 是否必选。 示例 请求示例 https://ehpc.cn-hangzhou.aliyuncs.com/?Action=ListSoftwares&RegionId=cn-hangzhou&<公共请求参数> 返回示例 XML格式 04F0F334-1335-436C-A1D7-6C044FE73368 2.31 18.1.1 1.0.0 CentOS_7.2_64 pbs nis cuda-toolkit 0 ' CUDA_TOOLKIT_9.0 9.0 cudnn 0 CUDNN_9.0 9.0 JSON格式 { "RequestId": "04F0F334-1335-436C-A1D7-6C044FE73368", "Softwares": { "SoftwareInfo": [ { "AccountVersion": "2.31", "SchedulerVersion": "18.1.1", "EhpcVersion": "1.0.0", "OsTag": "CentOS_7.2_64", "SchedulerType": "pbs", "AccountType": "nis", "Applications": { "ApplicationInfo": [ { "Name": "cuda-toolkit", "Required": 0, "Tag": "CUDA_TOOLKIT_9.0", "Version": "9.0" }, { "Name": "cudnnt", "Required": 0, "Tag": "CUDNN_9.0", "Version": "9.0" } ] } } ] } } 错误码 查询 E-HPC 接口错误码请访问 错误码。更多错误码,请访问 API 错误中心。
1934890530796658 2020-03-23 23:09:20 0 浏览量 回答数 0

问题

【CSS学习全家桶】416道CSS热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动:或许你挑灯夜战只为一道难题或许你百思不解只求一个答案或许你绞尽脑汁只因一种未知那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了他们用户自己手中的技术来帮助用户成长本次活动特邀百位阿里技术专家对CSS常见问题进行了集...
管理贝贝 2019-12-01 20:07:24 8458 浏览量 回答数 1

回答

简介 HPL(the High-Performance Linpack Benchmark)是国际上最流行的用于测试高性能计算机系统浮点性能的benchmark。通过对高性能计算机采用高斯消元法求解一元N次稠密线性代数方程组的测试,评价高性能计算机的浮点性能。浮点计算峰值是指计算机每秒钟能完成的浮点计算最大次数。包括理论浮点峰值和实测浮点峰值。理论浮点峰值是该计算机理论上能达到的每秒钟能完成浮点计算最大次数,它主要是由CPU的主频决定的。 理论浮点峰值 = CPU主频 × CPU每个时钟周期执行浮点运算的次数 × 系统中CPU数 准备工作 若您尚未拥有E-HPC集群,请先创建E-HPC集群 运行以下示例需要在创建集群时或者软件管理界面上选择安装linpack软件包和intel-mpi通信库。勾选linpack勾选intel mpi 输入参数说明 输入文件HPL.dat包含了HPL的运行参数,下图是在单台scch5实例上运行HPL的推荐配置。 HPLinpack benchmark input file Innovative Computing Laboratory, University of Tennessee HPL.out output file name (if any) 6 device out (6=stdout,7=stderr,file) 1 # of problems sizes (N) 143360 256000 1000 Ns 1 # of NBs 384 192 256 NBs 1 PMAP process mapping (0=Row-,1=Column-major) 1 # of process grids (P x Q) 1 2 Ps 1 2 Qs 16.0 threshold 1 # of panel fact 2 1 0 PFACTs (0=left, 1=Crout, 2=Right) 1 # of recursive stopping criterium 2 NBMINs (>= 1) 1 # of panels in recursion 2 NDIVs 1 # of recursive panel fact. 1 0 2 RFACTs (0=left, 1=Crout, 2=Right) 1 # of broadcast 0 BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM) 1 # of lookahead depth 0 DEPTHs (>=0) 0 SWAP (0=bin-exch,1=long,2=mix) 1 swapping threshold 1 L1 in (0=transposed,1=no-transposed) form 1 U in (0=transposed,1=no-transposed) form 0 Equilibration (0=no,1=yes) 8 memory alignment in double (> 0) 测试过程中需要根据节点硬件配置而做出调整的运行参数主要有: 第5、6行:代表求解的矩阵数量与规模。矩阵规模N越大,有效计算所占的比例也越大,系统浮点处理性能也就越高;但与此同时,矩阵规模N的增加会导致内存消耗量的增加,一旦系统实际内存空间不足,使用缓存、性能会大幅度降低。矩阵占用系统总内存的80%左右为最佳,即N x N x 8 = 系统总内存 x 80% (其中总内存换算以字节为单位)。 第7、8行:代表求解矩阵过程中矩阵分块的大小。分块大小对性能有很大的影响,NB的选择和软硬件许多因素密切相关。NB值的选择主要是通过实际测试得出最优值,但还是有一些规律可循:NB不能太大或太小,一般在384以下;NB × 8一定是Cache line的倍数等。例如,L2 cache为1024K, NB就设置为192。另外,NB大小的选择还跟通信方式、矩阵规模、网络、处理器速度等有关系。一般通过单节点或单CPU测试可以得到几个较好的NB值,但当系统规模增加、问题规模变大,有些NB取值所得性能会下降。所以最好在小规模测试时选择3个左右性能不错的NB,再通过大规模测试检验这些选择。 第10~12行:代表二维处理器网格(P × Q)。P × Q = 系统CPU数 = 进程数。一般来说一个进程对于一个CPU可以得到最佳性能。对于Intel Xeon来说,关闭超线程可以提高HPL性能。P≤Q;一般来说,P的值尽量取得小一点,因为列向通信量(通信次数和通信数据量)要远大于横向通信。P = 2n,即P最好选择2的幂。HPL中,L分解的列向通信采用二元交换法(Binary Exchange),当列向处理器个数P为2的幂时,性能最优。例如,当系统进程数为4的时候,P × Q选择为1 × 4的效果要比选择2 × 2好一些。 在集群测试中,P × Q = 系统CPU总核数。 运行HPL测试 E-HPC控制台创建HPL.dat输入文件 返回E-HPC管理控制台,点选左侧栏的“作业”标签,进入作业管理界面。依次选择“创建作业”->“新建文件”->“使用文件模板”->“HPL.dat”,根据节点硬件配置调整HPL输入参数,得到HPL输入文件如下。 HPL.dat E-HPC控制台创建HPL.pbs作业脚本 在作业管理界面中,依次选择“创建作业”->“新建文件”->“使用文件模板”->“pbs demo”,对pbs demo脚本进行修改,得到HPL作业脚本HPL.pbs如下。 #!/bin/sh #PBS -j oe export MODULEPATH=/opt/ehpcmodulefiles/ module load linpack/2018 module load intel-mpi/2018 echo "run at the beginning" mpirun -n 1 -host /opt/linpack/2018/xhpl_intel64_static > hpl-ouput #测试单节点的浮点性能 mpirun -n -ppn 1 -host ,..., /opt/linpack/2018/xhpl_intel64_static > hpl-ouput #测试多节点的浮点性能 E-HPC控制台提交HPL测试作业 确定下图左侧作业基本参数后,点击右上角“确认”提交作业。作业个性化配置、作业导入、作业导出以及作业状态查看,请参见作业管理。 作业配置 E-HPC控制台查询作业状态 点击作业列表中HPL作业右侧的 “详情” 按钮,查看作业详细信息。 作业详细信息 E-HPC控制台查看结果文件 返回E-HPC管理控制台,点选集群右侧“更多”选项,选择“执行命令”,进入集群命令运行界面。 执行命令 在集群命令运行界面点击“批量执行”,选择集群登录/管控节点执行命令,查看HPL作业结果文件。 查看结果 从结果文件中获取测得的HPL浮点运算效率数据,格式如下。 T/V N NB P Q Time Gflops WC00C2R2 143360 384 1 1 XXXX XXXXXXX 简介 IMB (Intel MPI Benchmarks) 用于评估HPC集群在不同消息粒度下节点间点对点、全局通信的效率。 准备工作 若您尚未拥有E-HPC集群,请先创建E-HPC集群 运行以下示例需要在创建集群时或者软件管理界面上选择安装intel-mpi-benchmarks软件包和intel-mpi通信库 勾选IMBintel-mpi IMB测试方法说明 $ /opt/intel-mpi-benchmarks/2019/IMB-MPI1 -h #查看IMB支持的通信模式及参数说明 $ cd /home/ /<work_dir> #非root用户下执行 $ /opt/intel/impi/2018.3.222/bin64/mpirun -genv I_MPI_DEBUG 5 -np 2 -ppn 1 -host , /opt/intel-mpi-benchmarks/2019/IMB-MPI1 pingpong #测试两节点间pingpong通信模式效率,获取通信延迟和带宽 $ /opt/intel/impi/2018.3.222/bin64/mpirun -genv I_MPI_DEBUG 5 -np <N*2> -ppn 2 -host ,..., /opt/intel-mpi-benchmarks/2019/IMB-MPI1 -npmin 2 -msglog 19:21 allreduce #测试N节点间allreduce通信模式效率,每个节点开启两个进程,获取不同消息粒度下的通信时间 $ /opt/intel/impi/2018.3.222/bin64/mpirun -genv I_MPI_DEBUG 5 -np -ppn 1 -host ,..., /opt/intel-mpi-benchmarks/2019/IMB-MPI1 -npmin 1 -msglog 15:17 alltoall #测试N节点间alltoall通信模式效率,每个节点开启一个进程,获取不同消息粒度下的通信时间 ############关键参数说明############# -genv I_MPI_DEBUG 打印mpi debug信息 -np 指定mpi总进程数 -ppn 指定每个节点的进程数 -host 指定任务节点列表 -npmin 指定至少运行的进程数 -msglog 指定消息片粒度范围 运行IMB测试 E-HPC控制台创建IMB.pbs作业脚本 在作业管理界面中,依次选择“创建作业”->“新建文件”->“使用文件模板”->“pbs demo”,对pbs demo脚本进行修改,得到IMB作业脚本IMB.pbs如下。 #!/bin/sh #PBS -j oe #PBS -l select=2:ncpus= :mpiprocs=1 #N为节点CPU核数,实际测试中根据节点配置进行设置 export MODULEPATH=/opt/ehpcmodulefiles/ module load intel-mpi/2018 module load intel-mpi-benchmarks/2019 echo "run at the beginning" /opt/intel/impi/2018.3.222/bin64/mpirun -genv I_MPI_DEBUG 5 -np 2 -ppn 1 -host compute0,compute1 /opt/intel-mpi-benchmarks/2019/IMB-MPI1 pingpong > IMB-pingpong E-HPC控制台提交IMB测试作业 确定下图左侧作业基本参数后,点击右上角“确认”提交作业。作业个性化配置、作业导入、作业导出以及作业状态查看,请参见作业管理。 作业提交 E-HPC控制台查看结果文件 从E-HPC管理控制台,点选集群右侧“更多”选项,选择“执行命令”,进入集群命令运行界面。点击“批量执行”,选择集群登录/管控节点执行命令,查看IMB作业结果文件。 作业结果 简介 STREAM测试是内存测试中业界公认的内存带宽性能测试基准工具,是衡量服务器内存性能指标的通用工具。STREAM具有良好的空间局部性,是对 TLB 友好、Cache友好的一款测试,支持Copy、Scale、Add、Triad四种操作。 准备工作 若您尚未拥有E-HPC集群,请先创建E-HPC集群 运行以下示例需要在创建集群时或者软件管理界面上选择安装STREAM软件包 勾选stream 运行STREAM测试 E-HPC控制台编译STREAM 为了避免数据Cache重用对测试结果准确度产生较大影响,需确保STREAM开辟的数组大小远大于L3 Cache的容量且小于内存的容量。因此在实际测试中要根据测试节点配置对STREAM进行重新编译。由E-HPC管理控制台进入集群命令运行界面,登录节点执行如下操作。 编译stream $ cd /opt/stream/2018/; gcc stream.c -O3 -fopenmp -DSTREAM_ARRAY_SIZE=102410241024 -DNTIMES=20 -mcmodel=medium -o stream.1g.20 #-DSTREAM_ARRAY_SIZE用于指定STREAM一次搬运的数据量,-DTIMES用于指定迭代次数 E-HPC控制台创建STREAM.pbs作业脚本 在作业管理界面中,依次选择“创建作业”->“新建文件”->“使用文件模板”->“pbs demo”,对pbs demo脚本进行修改,得到STREAM作业脚本STREAM.pbs如下。 #!/bin/sh #PBS -j oe #PBS -l select=1:ncpus= #N为节点CPU核数,实际测试中根据节点配置进行设置 export MODULEPATH=/opt/ehpcmodulefiles/ module load stream/2018 echo "run at the beginning" OMP_NUM_THREADS=1 /opt/stream/stream.1g.20 > stream-1-thread.log OMP_NUM_THREADS=2 /opt/stream/stream.1g.20 > stream-2-thread.log OMP_NUM_THREADS=4 /opt/stream/stream.1g.20 > stream-4-thread.log OMP_NUM_THREADS=8 /opt/stream/stream.1g.20 > stream-8-thread.log ... OMP_NUM_THREADS= /opt/stream/stream.1g.20 > stream- -thread.log E-HPC控制台提交STREAM测试作业 确定下图左侧作业基本参数后,点击右上角“确认”提交作业。作业个性化配置、作业导入、作业导出以及作业状态查看,请参见作业管理。 提交作业 E-HPC控制台查看结果文件 从E-HPC管理控制台,点选集群右侧“更多”选项,选择“执行命令”,进入集群命令运行界面。点击“批量执行”,选择集群登录/管控节点执行命令,查看STREAM作业结果文件。 stream结果 简介 STREAM测试是内存测试中业界公认的内存带宽性能测试基准工具,是衡量服务器内存性能指标的通用工具。STREAM具有良好的空间局部性,是对 TLB 友好、Cache友好的一款测试,支持Copy、Scale、Add、Triad四种操作。 准备工作 若您尚未拥有E-HPC集群,请先创建E-HPC集群 运行以下示例需要在创建集群时或者软件管理界面上选择安装STREAM软件包 勾选stream 运行STREAM测试 E-HPC控制台编译STREAM 为了避免数据Cache重用对测试结果准确度产生较大影响,需确保STREAM开辟的数组大小远大于L3 Cache的容量且小于内存的容量。因此在实际测试中要根据测试节点配置对STREAM进行重新编译。由E-HPC管理控制台进入集群命令运行界面,登录节点执行如下操作。 编译stream $ cd /opt/stream/2018/; gcc stream.c -O3 -fopenmp -DSTREAM_ARRAY_SIZE=102410241024 -DNTIMES=20 -mcmodel=medium -o stream.1g.20 #-DSTREAM_ARRAY_SIZE用于指定STREAM一次搬运的数据量,-DTIMES用于指定迭代次数 E-HPC控制台创建STREAM.pbs作业脚本 在作业管理界面中,依次选择“创建作业”->“新建文件”->“使用文件模板”->“pbs demo”,对pbs demo脚本进行修改,得到STREAM作业脚本STREAM.pbs如下。 #!/bin/sh #PBS -j oe #PBS -l select=1:ncpus= #N为节点CPU核数,实际测试中根据节点配置进行设置 export MODULEPATH=/opt/ehpcmodulefiles/ module load stream/2018 echo "run at the beginning" OMP_NUM_THREADS=1 /opt/stream/stream.1g.20 > stream-1-thread.log OMP_NUM_THREADS=2 /opt/stream/stream.1g.20 > stream-2-thread.log OMP_NUM_THREADS=4 /opt/stream/stream.1g.20 > stream-4-thread.log OMP_NUM_THREADS=8 /opt/stream/stream.1g.20 > stream-8-thread.log ... OMP_NUM_THREADS= /opt/stream/stream.1g.20 > stream- -thread.log E-HPC控制台提交STREAM测试作业 确定下图左侧作业基本参数后,点击右上角“确认”提交作业。作业个性化配置、作业导入、作业导出以及作业状态查看,请参见作业管理。 提交作业 E-HPC控制台查看结果文件 从E-HPC管理控制台,点选集群右侧“更多”选项,选择“执行命令”,进入集群命令运行界面。点击“批量执行”,选择集群登录/管控节点执行命令,查看STREAM作业结果文件。 stream结果
1934890530796658 2020-03-23 18:05:57 0 浏览量 回答数 0

问题

剖析短视频分发过程中的用户体验优化技术点

深圳云栖大会已经圆满落幕,在3月29日飞天技术汇-弹性计算、网络和CDN专场中,阿里云CDN高级技术专家周哲为我们带来了《海量短视频极速分发》的主题分享,带领我们从视频内容采集、上传、存储和分发的角...
樰篱 2019-12-01 21:50:09 2644 浏览量 回答数 0

回答

在使用 gRPC(基于 HTTP/2)的 Kubernetes 服务时,到目标的单个连接将在一个 Pod 处终止。如果从客户端发送了多条消息,则所有消息将由该 Pod 处理,从而导致负载不均衡。本文通过示例介绍 gRPC 服务间负载不均衡的问题以及如何实现负载均衡。 背景信息 gRPC是一种基于 HTTP/2 的服务通信协议,使用基于 Protocol Buffers(简称为 PB)格式的服务定义。服务之间调用的数据可以被序列化为较小的二进制格式进行传输。使用 gRPC,可以从 .proto 文件生成多种语言的代码,这也就使得 gRPC 成为了多语言微服务开发的最佳选择之一。 使用基于 HTTP/1.1 的 RPC 时,一个简单的 TCP 负载平衡器足以胜任,因为这些连接都是短暂的,客户端将尝试重新连接,不会保持与运行中的旧 Pod 之间的连接。但是使用基于 HTTP/2 的 gRPC 时,TCP 连接保持打开状态,这样将保持连接到即将失效的 Pod,亦或使集群失去平衡。 gRPC 服务间调用的负载不均衡 通过一个示例了解下 Kubernetes 下的 gRPC 服务间调用的负载不均衡问题。 前提条件 已创建至少一个 Kubernetes 集群。 已设置通过 kubectl 连接该集群,详情参见通过kubectl连接Kubernetes集群。 登录容器服务控制台,在左侧导航栏选择集群 > 命名空间。 在命名空间页面,从集群下拉列表中选择对应的集群。 单击右上方的创建,在创建命名空间窗口,输入命名空间的名称,例如grpc-nosidecar,单击确定。 在命名空间 grpc-nosidecar 下部署 gRPC 服务的服务端 istio-grpc-server。 假设,待创建的描述文件为 istio-grpc-server.yaml,请执行如下命令: kubectl apply -n grpc-nosidecar -f istio-grpc-server.yaml 其中,istio-grpc-server.yaml 文件的内容如下: apiVersion: apps/v1 kind: Deployment metadata: name: istio-grpc-server-v1 labels: app: istio-grpc-server version: v1 spec: replicas: 1 selector: matchLabels: app: istio-grpc-server version: v1 template: metadata: labels: app: istio-grpc-server version: v1 spec: containers: - args: - --address=0.0.0.0:8080 image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server imagePullPolicy: Always livenessProbe: exec: command: - /bin/grpc_health_probe - -addr=:8080 initialDelaySeconds: 2 name: istio-grpc-server ports: - containerPort: 8080 readinessProbe: exec: command: - /bin/grpc_health_probe - -addr=:8080 initialDelaySeconds: 2 apiVersion: apps/v1 kind: Deployment metadata: name: istio-grpc-server-v2 labels: app: istio-grpc-server version: v2 spec: replicas: 1 selector: matchLabels: app: istio-grpc-server version: v2 template: metadata: labels: app: istio-grpc-server version: v2 spec: containers: - args: - --address=0.0.0.0:8080 image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-server imagePullPolicy: Always livenessProbe: exec: command: - /bin/grpc_health_probe - -addr=:8080 initialDelaySeconds: 2 name: istio-grpc-server ports: - containerPort: 8080 readinessProbe: exec: command: - /bin/grpc_health_probe - -addr=:8080 initialDelaySeconds: 2 apiVersion: v1 kind: Service metadata: name: istio-grpc-server labels: app: istio-grpc-server spec: ports: - name: grpc-backend port: 8080 protocol: TCP selector: app: istio-grpc-server type: ClusterIP 在命名空间 grpc-nosidecar 下部署 gRPC 服务的服务端 istio-grpc-client。 假设,待创建的描述文件为 istio-grpc-client.yaml,请执行如下命令: kubectl apply -n grpc-nosidecar -f istio-grpc-client.yaml 其中,istio-grpc-client.yaml 文件的内容如下: apiVersion: apps/v1 kind: Deployment metadata: name: istio-grpc-client labels: app: istio-grpc-client spec: replicas: 1 selector: matchLabels: app: istio-grpc-client template: metadata: labels: app: istio-grpc-client spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/aliacs-app-catalog/istio-grpc-client imagePullPolicy: Always command: ["/bin/sleep", "3650d"] name: istio-grpc-client apiVersion: v1 kind: Service metadata: name: istio-grpc-client spec: ports: - name: grpc port: 8080 protocol: TCP selector: app: istio-grpc-client type: ClusterIP 执行以下命令,查看 Pod 运行状态: kubectl get pod -n grpc-nosidecar 示例输出如下: NAME READY STATUS RESTARTS AGE istio-grpc-client-dd56bcb45-hvmjt 1/1 Running 0 95m istio-grpc-server-v1-546d9876c4-j2p9r 1/1 Running 0 95m istio-grpc-server-v2-66d9b8847-276bd 1/1 Running 0 95m 执行以下命令,登录到客户端 Pod 容器。 kubectl exec -it -n grpc-nosidecar istio-grpc-client-dd56bcb45-hvmjt sh 进入容器后,执行以下命令: /bin/greeter-client --insecure=true --address=istio-grpc-server:8080 --repeat=100 可以看到所有的请求都指向了一个 Pod: 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 由此可见,从客户端发送了所有消息都由一个 Pod 处理,从而导致负载不均衡。 使用 ASM 实现负载均衡 下面将示例说明如何通过 ASM 实现负载均衡。 前提条件 已创建至少一个服务网格 ASM 实例,并已经添加至少一个集群到该实例中。 已设置通过 kubectl 连接到该集群,详情参见通过kubectl连接Kubernetes集群。 登录容器服务控制台,在左侧导航栏选择集群 > 命名空间。 在命名空间页面,从集群下拉列表中选择对应的集群。 单击右上方的创建,在创建命名空间窗口,输入命名空间的名称,例如grpc-nosidecar,并新增标签istio-injection:enabled,单击确定。 命名空间 grpc-nosidecar 下部署 gRPC 服务的服务端 istio-grpc-server。 假设,待创建的描述文件为 istio-grpc-server.yaml,请执行如下命令: kubectl apply -n grpc-nosidecar -f istio-grpc-server.yaml istio-grpc-server.yaml 文件的内容,参见上文示例。 命名空间 grpc-nosidecar 下部署 gRPC 服务的服务端 istio-grpc-client。 假设,待创建的描述文件为 istio-grpc-client.yaml,请执行如下命令: kubectl apply -n grpc-nosidecar -f istio-grpc-client.yaml istio-grpc-client.yaml 文件的内容,参见上文示例。 执行以下命令,查看 Pod 运行状态: kubectl get pod -n grpc-nosidecar 此时可以看到每个 Pod 中包含了 2 个容器,其中一个容器就是注入的 Sidecar代理,示例输出如下: NAME READY STATUS RESTARTS AGE istio-grpc-client-dd56bcb45-zhfsg 2/2 Running 0 1h15m istio-grpc-server-v1-546d9876c4-tndsm 2/2 Running 0 1h15m istio-grpc-server-v2-66d9b8847-99v62 2/2 Running 0 1h15m 执行以下命令,登录到客户端 Pod 容器。 kubectl exec -it -n grpc-sidecar istio-grpc-client-dd56bcb45-zhfsg sh 进入容器后,执行以下命令: /bin/greeter-client --insecure=true --address=istio-grpc-server:8080 --repeat=100 可以看到所有的请求分别指向了对应的 2 个 Pod,比例接近于50:50,即负载均衡中的 Round-Robin。 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 2020/01/14 14:37:14 Hello world from istio-grpc-server-v2-66d9b8847-276bd 配置服务网格 ASM 实例的控制平面。 登录 ASM 控制台,进入待配置 服务网格的详情页。 在控制平面区域,选择命名空间页签,创建名为 grpc-sidecar 的命名空间。 选择目标规则页签,在 grpc-sidecar 命名空间下新建目标规则。YAML 文件内容如下: apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: dr-istio-grpc-server spec: host: istio-grpc-server trafficPolicy: loadBalancer: simple: ROUND_ROBIN subsets: - name: v1 labels: version: "v1" - name: v2 labels: version: "v2" 选择虚拟服务页签,在 grpc-sidecar 命名空间下新建虚拟服务。YAML 文件内容如下: apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vs-istio-grpc-server spec: hosts: - "istio-grpc-server" http: - match: - port: 8080 route: - destination: host: istio-grpc-server subset: v1 weight: 90 - destination: host: istio-grpc-server subset: v2 weight: 10 执行以下命令,登录到客户端 Pod 容器。 kubectl exec -it -n grpc-sidecar istio-grpc-client-dd56bcb45-zhfsg sh 进入容器后,执行以下命令: /bin/greeter-client --insecure=true --address=istio-grpc-server:8080 --repeat=100 可以看到所有的请求分别指向了对应的 2 个 Pod,但比例接近于90:10,并非默认的 Round-Robin。 选择虚拟服务页签,找到 grpc-sidecar 命名空间下名为 vs-istio-grpc-server 的虚拟服务,单击 YAML,调整虚拟服务的权重,以查看调用的不同结果。 修改内容如下: route: - destination: host: istio-grpc-server subset: v1 weight: 0 - destination: host: istio-grpc-server subset: v2 weight: 100 通过 Kubectl 登录容器,执行以下命令: /bin/greeter-client --insecure=true --address=istio-grpc-server:8080 --repeat=100 可以看到所有的请求分别指向了对应的 1 个 Pod,即版本 v2 对应的 Pod。
1934890530796658 2020-03-20 20:17:15 0 浏览量 回答数 0

问题

阿里云RedHatLinux服务器安装DiscuzX3.0详细笔记适合新手因为我就是个新手

以下内容大部分来自阿里云的官方帮助,但有些地方我觉得不太适合我这样的新手,经过我N次的重置服务器然后实验,整理了一下,希望能帮助到跟我一样的新手们! Linux 系统挂载数据盘 适用系统:Linux(Re...
no.9527 2019-12-01 21:24:31 28702 浏览量 回答数 7

问题

Nginx配置及Rewrite规则

Nginx Rewrite 规则相关指令 相关指令有if,rewrite,set,return,break等,其中最关键的就是rewrite.一个简单的Nginx Rewrite规则语法如下:rewrite ^/...
thisisdong 2019-12-01 21:14:25 38367 浏览量 回答数 5

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT