首页 文章 精选 留言 我的

精选列表

搜索[服务],共10000篇文章
优秀的个人博客,低调大师

优化技术专题-系统服务优化系列-这绝对是你的知识盲点,NUMA的为什么存在

NUMA的产生背景 在NUMA架构出现前,CPU欢快的朝着频率越来越高的方向发展(纵向发展)。受到物理极限的挑战,又转为核数越来越多的方向发展(横向发展)。在一开始,内存控制器还在北桥中,所有CPU对内存的访问都要通过北桥来完成。此时所有CPU访问内存都是“一致的”,如下图所示: 这样的架构称为UMA(Uniform Memory Access),直译为“统一内存访问”,这样的架构对软件层面来说非常容易,总线模型保证所有的内存访问是一致的,即每个处理器核心共享相同的内存地址空间。但随着CPU核心数的增加,这样的架构难免遇到问题,比如对总线的带宽带来挑战、访问同一块内存的冲突问题。为了解决这些问题,有人搞出了NUMA。 注意:北桥芯片(North Bridge)是主板芯片组中起主导作用的最重要的组成部分,也称为主桥(Host Bridge)。 一般来说, 芯片组的名称就是以北桥芯片的名称来命名的,例如:英特尔845E芯片组的北桥芯片是82845E,875P芯片组的北桥芯片是82875P等等。 NUMA构架细节 通过“NUMA的产生背景”,让我们了解到了之前内存访问架构原则,与此相对的就是NUMA,NUMA 全称 Non-Uniform Memory Access,译为“非一致性内存访问”。这种构架下,不同的内存器件和CPU核心从属不同的Node,每个 Node 都有自己的集成内存控制器(IMC,Integrated Memory Controller)。 在 Node 内部,架构类似SMP,使用IMC Bus进行不同核心间的通信;不同的 Node间通过QPI(Quick Path Interconnect)进行通信,如下图所示: 一般来说,一个内存插槽对应一个Node。需要注意的一个特点是,QPI的延迟要高于IMC Bus,也就是说CPU访问内存有了远近(remote/local)之别,而且实验分析来看,这个差别非常明显。 在Linux中,对于NUMA有以下几个需要注意的地方: 默认情况下,内核不会将内存页面从一个 NUMA Node 迁移到另外一个 NUMA Node; 但是有现成的工具可以实现将冷页面迁移到远程(Remote)的节点:NUMA Balancing; 关于不同 NUMA Node 上内存页面迁移的规则,社区中有依然有不少争论。 NUMA详细分析 非一致性内存架构(Non-uniform Memory Architecture)是为了解决传统的对称多处理(Symmetric Multi-processor)系统中的可扩展性问题而诞生的。在对称多处理系统中,处理器共享北桥中的内存控制器来达到共同访问外部内存和IO的目的,也就是说所有的处理器对内存和I/O的访问方式和开销都是相同的。在这种系统中,随着更多的处理器被添加到SMP系统中,总线的竞争将会越来越大,系统的性能也必将随之大打折扣。SMP系统的示意图如下: 本地节点: 对于某个节点中的所有CPU,此节点称为本地节点;(速度最快) 邻居节点: 与本地节点相邻的节点称为邻居节点;(速度次之) 远端节点: 非本地节点或邻居节点的节点,称为远端节点。(速度最差) 超立方体可以作为一种有效的拓扑来描述NUMA系统,它将系统中的节点数限制在2^C内,C是每个节点拥有的邻居节点数,如下图所示 开销总结 以C=3为例,则对于节点1而言,2,3,5则为邻居节点,4,6,7,8为远端节点,显然访问开销的关系为 本地节点<邻居节点<远端节点。 NUMA案例分析 AMD Hyper-Transport 早期的SMP(对称多处理器系统) 只拥有一个位于北桥中的内存控制器,而如今更先进的做法是将内存控制器整合到CPU中去,这样每个CPU都拥有自己的内存控制器,不会相互之间产生竞争。 最先采用这种做法的一批处理器就是AMD在2003年推出的AMD Opteron系列处理器,其结构如下图所示: 每个CPU中都整合了一个内存控制器(IMC),并且CPU之间采用了一种Hyper-Transport的技术建立连接,这种连接可以使得CPU通过其他CPU来访问外部内存,当然访问开销要比访问本地内存更大。 操作系统的支持 为了支持NUMA架构,OS的设计必须将内存分布的特点考虑进去。 举一个简单的例子,假如一个进程运行在一个给定的处理器中,那么为这个进程所分配的物理内存就应该是该处理器的本地内存,而不是外部内存。 OS还要注意避免将一个进程从一个节点给迁移到另一个节点。在一个普通的多处理系统中,OS就应该已经尝试不去在处理器之间迁移进程,因为这意味着一个处理器的cache中的相关内容都将被丢失。如果在某种情况下必须进行迁移,那么OS可以随意选择一个空闲的处理器。 但是在NUMA系统中,可选择的新处理器将要受到一些限制,最重要的一点就是新处理器访问内存的开销不能比先前的处理器大,也就是说应该尽可能选择本地节点中的处理器。 当找不到符合条件的处理器,OS才能选择其他类型的处理器。 在这种较糟的情况下有两种选择: 如果进程只是暂时性的被迁移出去,可以再将其迁移回更加合适的处理器; 如果不是暂时性的,那么可以将该进程的内存拷贝到新处理器的内存中,这样就可以通过访问拷贝的内存来消除访问外部内存的开销,显然这是一种空间换时间的做法。 NUMA Node 操作 NUMA Node 分配 有两个NUMA Node,每个节点管理16GB内存。 NUMA Node 绑定 Node 和 Node 之间进行通信的代价是不等的,同样是 Remote 节点,其代价可能不一样,这个信息在 node distances 中以一个矩阵的方式展现。 我们可以将一个进程绑定在某个 CPU 或 NUMA Node 的内存上执行,如上图所示。 NUMA 状态

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

华为帐号服务学习笔记(三):10分钟完成Authorization Code模式客户端Demo开发

Demo开发准备 1、 安装Android Studio 3.5及以上版本;2、 安装JDK 1.8 及以上;3、 使用Android SDK Platform 19及以上;4、 使用Gradle 4.6及以上;5、 在华为开发者联盟注册成为华为开发者,如已注册,请跳过此步骤; 运行环境配置 之前按照华为帐号的官方指导试过demo开发,发现前期接入华为开发者联盟的各种步骤有点繁琐,各种界面来回切换,后来在Android Studio上发现HMS提供了一个IDE插件,可以帮忙快速集成。本次文章主要就介绍通过这个IDE插件来快速创建一个华为帐号demo。如果想自己手动按照步骤创建帐号的demo,可以直接查看这个官方指导:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/dev-process-0000001050443773IDE插件安装 这个工具叫HMS Toolkit,后来发现华为官方也有介绍,大家有兴趣的可以去它们主页了解下:https://developer.huawei.com/consumer/cn/huawei-toolkit/安装插件,直接在Android Studio里面,点击“File > Settings > Plugins” ,搜索“HMS”找到HMS Toolkit就可以了,点击安装然后重启Android Studio。创建android项目 在开发应用前,你得本地有一个Android项目,已有Android项目的可忽略。 步骤 1 打开Android Studio软件,点击“File > New > New Project” ,按自己需求选择,我这里选择的“Empty Activity”,点击“Next”。 步骤 2 在“Configure Your Project”界面填入项目名称、包名、项目存储位置、项目语言以及最低SDK版本,然后点击“Finish”完成项目创建。配置AppGallery Connect 为了接入华为,我们还需要在AppGallery Connect中创建应用,并做些基本设置。步骤 1 使用华为帐号登录AppGallery Connect(https://developer.huawei.com/consumer/cn/service/josp/agc/index.html)。要是没注册,直接按照页面指导完成帐号注册就行,然后选择“我的项目”。步骤 2 在我的项目页面点击“添加项目”。步骤 3 输入个名字作为项目名称,点击“确定”。步骤 4 项目创建成功后会自动进入“项目设置”页面,在这里找到“添加应用”并点击。 如果你本来就有项目并且已经有应用了,直接展开页面顶部的应用选择区域,选择“添加应用”。步骤 5 在“添加应用”页面中填写应用信息,特别注意平台和包名的,尤其是包名要和前面创建的android项目的包名一致。  选择平台:选择“Android”。  应用包名:需要与您正在开发的应用的包名保持一致。 配置完成后,后面的一些操作都可以忽略了,直接去Android Studio操作就行,安装的IDE插件可以帮忙进行设置。在Android Studio上为项目配置华为AGC和华为帐号 步骤 1 在Android Studio中,菜单栏选择“HMS > Configuration Wizard”。如果你没登录AppGallery Connect,这个工具会帮忙自动打开浏览器并提示登录。 步骤 2 登录后,在Configuration Wizard界面可以选择团队名称、对应的工程模块、Integrated Kits(选择Account Kit)和证书类型,点击“Generate”生成SHA256证书指纹,然后点击“Next”。选择团队名称和对应的工程模块之后,Toolkit会自动检测AGC上是否有对应的应用。若有报错,根据界面点击“Link”到AGC上检查是否已创建应用。如果没有,就创建个新的应用(这个就是前面“配置AppGallery Connect”那步),然后点击“Retry”。 关于证书类型说明如下:  Use your certificate:直接使用你自己创建的证书生成SHA256证书指纹,这种是用来应用发布的时候。关于证书的指导可参见Android证书签名(https://developer.android.com/studio/publish/app-signing#generate-key)。  Use Android debug certificate:选择Android自带的调试证书生成SHA256证书指纹,这种方式仅用于应用调试场景。我们这就是个Demo,为了简单我直接选的这个。 点击“Generate”可自动生成证书指纹,如果生成失败,检查证书信息是否正确,确保证书信息和指纹相匹配,或者根据生成证书指纹指导手工生成指纹,然后填写到指纹信息框内。 插件会自动对Account Kit的使用环境进行环境配置检查,我暂时还没遇到过失败的情况。全部检查项通过后直接点击“Go to coding assistant”按钮,就可以进入Account Kit的页面去选择调用的接口了。通过Coding Assistant集成Authorization Code模式登录帐号 步骤 1 在Android Studio中,选择“HMS > Coding Assistant”,然后在Kit列表中点击“Account Kit”。 步骤 2 鼠标放到“Signing In With an ID(Authorization Code)”这个行上,拖拽下,把这行拖放到代码区域。鼠标释放后,会弹出新增代码片段的选择框,直接点击“OK”,可以看到会生成Authorization Code登录的相关Activity文件和xml布局文件,并且AndroidManifest.xml、工程build.gradle和模块build.gradle都有一些新增信息。具体文件有哪些变化看后面的登录详解。 步骤 3 打开“AndroiManifest.xml”文件,将应用初始调用的Activity替换成步骤2生成的Activity,这样我们的APP就可以主动调用新加的Activity了。 这样,一个帐号登录的Demo就完成了。 Demo的运行调试,可以在自己的设备或远程真机里运行查看。 编译、调试 使用远程真机运行步骤 1 在Android Studio的菜单栏中选择“HMS > Cloud Debugging”或者在工具栏点击如下图标。步骤 2 远程真机界面,可以根据分辨率、Android版本那些来筛选要远程调试的真机。这里有个坑,深圳地域的真机不知道什么原因,是不能进入“设置”的,这导致帐号的Demo跑起来后无法拉起登录页面。强烈建议使用非深圳地域的真机进行测试。步骤 3 在菜单栏中点击 (Run按钮)或 (Debug按钮),在远程真机中运行或调试App。步骤 4 进入运行的项目,点击“AUTHORIZATIONCODE MODE SIGNIN”按钮,拉起华为帐号登录页面,这个页面就是通过Authorization Code方式登录的华为帐号。 使用本地真机运行 在菜单栏中点击 (Run按钮)或 (Debug按钮),在本地真机中运行或调试App。 真机运行结果示意如下:

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

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等操作系统。

用户登录
用户注册