理论+实操,带你了解多沙箱容器运行时Kuasar

摘要:华为云DTSE技术布道师张天阳结合沙箱容器发展历程,介绍华为云多沙箱容器运行时 Kuasar 项目优势,开启多沙箱容器运行时上手实践体验。

本文分享自华为云社区《理论+实操,带你了解多沙箱容器运行时Kuasar》,作者:华为云社区精选。

本期《多沙箱容器运行时Kuasar开发上手实践》主题直播中,华为云DTSE技术布道师张天阳结合沙箱容器发展历程,介绍华为云多沙箱容器运行时 Kuasar 项目优势,为开发者演示 Kuasar 的安装运行方式,开启多沙箱容器运行时上手实践体验。

顺势而出的沙箱容器

2013年,docker 横空出世,云计算进入容器时代,所谓的容器也就是运行在宿主机上的进程,通过 Namespace 和 Cgroup 技术进行隔离和限制,和主机共享内核。

2014年,kubernetes 开源并成为主流的容器编排工具。在 kubernetes 中,Pod 是一个或多个容器的集合,容器间可以共享网络和存储,为此引入了 pause 容器来实现这一特性。

“与宿主机系统共享内核的容器,是存在着巨大的安全隐患。”华为云DTSE技术布道师张天阳讲到。

也正是看到这个问题,在2017年底,沙箱(Sandbox)容器技术兴起,它将容器进程限制在一个封闭的沙箱环境中,防止其对系统和其他容器造成破坏,具有极高的安全性。

沙箱天然符合 Pod 的定义,它为一组容器提供了一个隔离的环境,在沙箱环境中运行的容器,就是沙箱容器。根据沙箱隔离的边界可分为:

  • 轻量虚拟机沙箱(MicroVM Sandbox):在宿主机上模拟一套完整的虚拟机,容器运行在虚拟机内,具有非常高的安全隔离效果。
  • 用户态内核沙箱(Application Kernel Sandbox):通过一个运行在用户态的内核程序,拦截并实现容器的系统调用,从而保证容器间的安全隔离性。
  • WebAssembly沙箱(Wasm Sandbox):将容器运行在 WebAssembly 的运行时中,依赖 WebAssembly 的能力提供进进程级别的隔离。

每种沙箱在极速弹性、安全隔离和标准通用维度有各自的优势,目前云厂商都已在生产环境布局了沙箱容器产品,每个沙箱借助 containerd Shim v2 均实现了一套管理面的程序,彼此之间不相兼容。

2023年3月,containerd 在其 v1.7.0 版本中发布了 Sandbox API 特性,该特性提供了一套管理沙箱的API,它的出现使得容器和沙箱的概念解耦,“容器归容器,沙箱归沙箱”,创建 Pod 就是创建沙箱,不再需要借助 pasue 容器。

沙箱容器已成为云原生场景下的安全的解决方案,我们希望借助 Sandbox API 的力量,实现一种支持多种沙箱技术的容器运行时。

然而单一容器隔离技术无法满足用户云上业务对安全隔离、极速弹性、标准通用等多个维度的诉求。基于此,华为云于2023 年 4 月在荷兰阿姆斯特丹举办的 KubeCon + CloudNativeCon Europe 2023 云原生峰会上正式开源Kuasar 。新开源的多沙箱容器运行时 Kuasar 可以充分利用节点资源、降本增效,为用户提供更安全高效的沙箱场景解决方案。

Kuasar架构技术大揭秘

Kuasar 是一个多沙箱容器运行时,那么什么是容器运行时?简单说容器运行时是一个负责拉起容器,管理容器运行状态的运行时组件,可以分为高阶容器运行时和低阶容器运行时两类:

  • 高阶容器运行时:负责 CRI 的实现,从高维度管理容器和镜像实例,containerd, CRI-O, docker 还有 iSulad 都是典型的高阶容器运行时。
  • 低阶容器运行时:负责 OCI 实现,真正操作容器。Kata-containers 和 runC 等都是低阶容器运行时。

Kuasar 属于低阶容器运行时,和高阶容器运行 containerd 交互,Kuasar 主要由两个模块组成:

  • Kuasar-Sandboxer:实现了 Sandbox API,负责管理沙箱生命周期和资源分配。Sandboxer 以插件的形式和 containerd 交互。
  • Kuasar-Task:实现了 Task API,负责管理容器的生命周期和资源分配。

MicroVM Sandboxer:虚机进程提供了完整的虚拟化层和 Linux 内核, vmm-sandboxer 负责创建虚机和调用 API, vmm-task 作为虚机里的 init 进程负责拉起容器进程,容器的 IO 流则可通过虚机的 vsock 或 uds 导出。

App Kernel Sandboxer: Quark 是一种新型的 App Kernel Sandbox,使用自己的 QVisor 作为 hypervisor 和自定义内核 QKernel。QVisor 只负责KVM虚拟机的生命周期管理,Qkernel 拦截所有的系统调用,并通知 QVisor 处理。quark-sandboxer 拉起 Qvisor 和 Qkernel,每当需要启动容器时,QVisor 中的 quark-task 将调用 Qkernel 来启动一个新的容器。同一 Pod 中的所有容器都将在同一个进程中运行。

Wasm Sandboxer:WebAssembly 沙箱定义了一套新的指令集和虚拟机。所有程序必须编译成 Wasm 指令集才能在 Wasm 虚拟机中运行,因此对应用程序有很高的要求。wasm-sandboxer 和 wasm-task 为一个独立的进程,每当需要在沙箱中启动容器时,wasm-task 将 fork 一个新进程,启动一个新的 WasmEdge runtime,并在其中运行 Wasm 代码。

Kuasar改变当前的Shim V2 的管理模型,带来以下收益:

  1. sandbox 管理逻辑清晰:sandbox 管理逻辑和 container 管理逻辑完全分开,开发友好,语义清晰
  2. 简化 container 调用链:取消 Task API 到 Shim v2 API 的转化,直接调用,链路简化
  3. 高效的sandboxer进程: Sandboxer 进程常驻减掉了冷启动 Shim 进程的耗时, 1:N 管理模型大幅减少了进程数量,Rust 程序内存安全,相比 Golang 开销小
  4. pause 容器消失:创建 Pod 不再创建 pause 容器,不再需要准备 pause 容器镜像快照

为了更好地展现Kuasar 性能优势,张天阳选择 “端到端容器启动时间”和“管理面组件内存消耗”作为衡量 Kuasar 性能的两个指标,在保持环境变量一致的前提下和同类竞品进行对比测试。

启动时间测试分为两组,一组统计单个 Pod 的启动时间,另一组统计并行启动50个 Pod 的时间:

Kuasar 100% 的启动速度提升主要得益于两方面,一方面是 Sandbox API 的实现,使得创建容器不再单独创建 pause 容器,节省了准备pause容器镜像快照的时间;另一方面得益于1:N 的管理模型,Sandboxer 进程常驻,从而节省了冷启动 Shim 进程的时间,这使得容器的启动速度大大提升。

内存消耗测试共分三轮,每轮分别启动了1、5、10、20、30和50个Pod,查询Sandboxer 进程和所有 Shim 进程的 PSS 数值。

Kuasar 节省近99%的内存,原因也可分为两点:主要是 1:N 的管理模型使得 N 个进程减少为1个进程,带来的内存收益与 Pod 数成正比;其次,Kuasar 采用了 Rust 编程语言,相比于 Kata Shim 进程使用的 Golang 语言,语言本身也会带来一些内存收益。

五分钟教你操作Kuasar

了解了Kuasar相关技能和特性,相信大家对产品有了一个大致的了解。接下来,就花几分钟带大家从安装上手,实际操作了解和认识Kuasar。

为了让大家更好地体验,在Kuasar安装配置操作上,为大家准备了一指禅,如下:

  • 方式一:Ubuntu 22.04 操作系统,可按照 Github Release 发布说明直接下载安装: http://github.com/kuasar-io/kuasar/releases/tag/v0.0.1-alpha1
  • 方式二:如果是源码编译,需要按照 README 里的说明进行:http://github.com/kuasar-io/kuasar#quick-start

温馨小提醒,在安装配置前需要大家预准备一下内容:

面向未来,作为一个开放和可扩展的 多沙箱容器运行时,Kuasar 将发挥沙箱接口的优势,拥抱业界最新的 DRA(Dynamic Resource Allocation)、CDI(Container Device Interface) 等管理接口,为云原生场景带来更安全、高效、便捷的容器解决方案,为云原生应用提供更安全的保障。

 

点击关注,第一时间了解华为云新鲜技术~

本文转载于网络 如有侵权请联系删除

相关文章

  • 一篇文章搞懂数据仓库:数据应用--OLAP

    目录1、OLAP和OLTP的区别2、OLAP分类3、OLAP基本操作4、OLAP选型1、olap和oltp的区别OLTPOLAP对象业务开发人员分析决策人员功能日常事务处理面向分析决策模型关系模型多维模型数据量几条或几十条记录>百万于万条记录操作类型增、删、查、改(CRUD)查询为主总体概括联机事务处理在线分析处理2、OLAP分类MOLAP,基于多维数组的存储模型,也是OLAP最初的形态,特点是对数据进行预计算,以空间换效率,明细和聚合数据都保存在cube中。但生成cube需要大量时间和空间。ROLAP,基于关系模型进行存储数据,不需要预计算,按需即时查询。明细和汇总数据都保存在关系型数据库事实表中。其特点是与事务实体对应,关系清晰;但一般需要较为复杂的数据准备。在响应前端需求时,一般较快,但取决于计算引擎能力。HOLAP,混合模型,细节数据以ROLAP存放,聚合数据以MOLAP存放。这种方式相对灵活,且更加高效。可按企业业务场景和数据粒度进行取舍,没有最好,只有最适合。3、OLAP基本操作★钻取:维的层次变化,从粗粒度到细粒度,汇总数据下钻到明细数据。如通过季度销售数据钻取每个月的销

  • 使用springCloud构建微服务实战

    Eureka是开源的服务发现组件,本身是一个基于REST的服务。包含两个组件:EurekaServer和EurekaClient。(1)EurekaServer提供服务发现的能力,各个微服务启动时,会向EurekaServer注册自己的信息,它会存储这些信息。(2)EurekaClient是一个java客户端,用于简化与EurekaServer的交互。一、创建服务发现组件(EurekaServer)1、使用idea中的SpringInitializr快速创建springboot项目,并为项目添加以下依赖。<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> 复制2、在启动类上添加如下注解。(1)@SpringBootApplication该注解告诉springboot框架,这是项目的引导类 (

  • Julia文章汇总+Win系统解释器解读

    在去年的差不多这个时间段,我写了Julia语言的一些文章,不过很不幸,后来写的断更了:接着这段时间就继续写~,这篇预热: Jupyter配置Julia内核+若干杂项配置Julia机器核心编程.多重分配Julia机器核心编程.函数(完)Julia机器核心编程.作用域Julia机器核心编程.高阶函数Julia机器核心编程.函数Julia机器核心编程.7Julia机器学习核心编程.6Julia机器核心编程.5Julia机器学习核心编程.4Julia机器学习核心编程.2(LLVM和JIT)Julia机器学习核心编程.1Julia(建设者)Julia(转换和推广)Julia(类型系统)Julia(面向对象)Julia(字符串)Julia(函数)Julia(控制流)Julia(数字原语)Julia(数学运算和基本函数)Julia(复数和有理数)emmmmmmmm,我写过这么多了吗?其实最主要的解释器,和Python的解释器一样在这里安装着标准的一个win目录里面有一些头文件,老实讲不知道用处但是这个吧,就是有点宏定义的味道在share的文件夹有doc文件夹可以在浏览器里面打开文档查看

  • Proof of Authority--PoA共识机制

    近些年以来,区块链行业一直在持续发展。共识机制是去中心化生态系统的核心,可以帮助它在网络中达成共识。到目前为止,已经发明和实施了许多共识方法来在区块链系统内达成共识。比特币使用的PoW共识算法被认为是可靠且安全的共识机制,但不支持可扩展性。结果,它限制了比特币网络的性能及其交易速度。该方法的主要缺点在于,它需要高能耗和系统资源,这是解决复杂的数学难题所必需的。有了更多功能,权益证明(PoS,ProofOfStake)就被发明出来,它提供了比PoW更好的性能。有几个PoS项目仍在开发中,因此它可以提供什么新功能以及如何解决现有共识机制的缺点取决于未来项目的成功率。然后是另一个称为授权证明(ProofofAuthority)的共识机制,它是PoS的增强版本。它通过允许每秒更多的事务来支持更好的性能。现在让我们详细讨论。什么是ProofofAuthority?授权证明(PoA)是一种共识方法,其中已经选择了一组验证者作为授权者。他们的任务是检查和验证所有新添加的身份,验证事务以及阻止添加到网络中的块。为了确保网络中的效率和安全性,验证器组(validatorgroup)通常保持较小(〜25或

  • Spring Security 入门之基本概念

    一、Authentication简介1.1定义认证(Authentication)是证明用户身份的过程,是为了解决“Whoareyou?”的问题,即在应用中谁能证明他就是他本人。使用特定系统时,身份验证是必不可少的机制。没有正确的身份验证就很难识别用户。在认证过程中,一般需要认证者提供与他们身份信息相关的一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。(图片来源——https://www.ilantus.com/blog/authentication-vs-authorization-whats-the-difference/)1.2示例例如,有一个发送方A通过互联网向接收方B发送电子文档。系统将如何识别发送方A已发送给接收方B的专用消息。入侵者C可能会拦截,修改和重播文档以欺骗或窃取此类攻击,这些信息被称为伪造。在给定情况下,身份验证机制可确保两件事:首先,它确保发送者和接收者都是合法的人,这就是所谓的数据来源身份验证。其次,它借助私密会话密钥确保了发送者和接收者之间已建立的连接的安全性,从而无法推断出该连接,这被称为对等实体身份验证。二、Authorization

  • 原创:善用GA的高级细分,买到更“值”的社交流量

    作者:互联网数据官原创作者孙维最近运营的同事来找我,分析一个和分享行为有关的数据。事情是这样的,为了鼓励用户分享内容到微信等社交平台,运营制定了奖励机制:每分享出去一篇内容,奖励给用户1积分,每天最多奖励6积分。积分在商城中可以兑换商品,所以其价值(成本)还是比较高的。分享奖励机制上线后并没有过多宣传,但越来越多的用户发现了这一奖励,每天的分享次数逐渐攀升,在微信中产生的PV和UV也稳步提升。但与此同时,运营发现送出的奖励积分增长的更快,也就是说成本上升的速度远高于回报,于是他们直接把每天的奖励积分上限从6降到了1,并准备好被愤怒的用户们“喷”。出人意料的是,大多数用户的反应竟然是举手赞成,他们说这样杜绝了那些“刷分的”,保证了“公平”(这让我想起来一句老话“不患贫,患不均”)。但同时,微信中产生的PV和UV骤减,运营同事陷入了两难,于是来求助我,看能否在数据中找到下一步行动的建议。初步分析考虑到这是前后两种规则的变化,我先找了奖励为6分和1分的两个日期进行对比,发现分享次数下降了41%之多。然后我对比了有分享行为的UV,发现仅仅下降了4%而已。到此我们可以看出,确实是那4%“刷分的”

  • kvm虚拟机日常操作命令梳理

    KVM虚拟机的管理主要是通过virsh命令对虚拟机进行管理。废话不多说,下面列出kvm日常管理中的命令1)查看KVM虚拟机配置文件及运行状态 KVM虚拟机默认配置文件位置:/etc/libvirt/qemu/ autostart目录是配置kvm虚拟机开机自启动目录。 virsh命令帮助 #virsh-help 或直接virsh命令和,再执行子命令。如下所示。 #virsh 欢迎使用virsh,虚拟化的交互式终端。 输入:'help'来获得命令的帮助信息 'quit'退出 virsh#help ....... 查看kvm虚拟机状态 #virshlist--all 2)KVM虚拟机开机 #virshstartoeltest01 3)KVM虚拟机关机或断电 关机 默认情况下virsh工具不能对linux虚拟机进行关机操作,linux操作系统需要开启与启动acpid服务。在安装KVMlinux虚拟机必须配置此服务。 #chkconfigacpidon #serviceacpidrestart virsh关机 #virshshutdownoelte

  • MS Windows 下基于Atom的LaTeX编译环境的配置

    一、编辑器搭建安装Atom正如Atom的宣传语,Atomisahackabletexteditorforthe21thcentury.因此我选择了它。下载网址:https://atom.io/安装Perl为保证MiKTeX安装成功,须先安装Perl。在MSWindows下,我选择了草莓Perl。下载网址:http://strawberryperl.com/安装LaTex发行版MiKTeX登录MiKTeX官方网址下载最新版本。推荐使用该发行版。下载网址:https://miktex.org/download在Atom安装必需的packages通过File-->Setting-->Install找到安装packages的界面。(1)安装script。它的作用是:RuncodeinAtom.(2)安装atom-runner。它的作用是:RunsscriptsinsideAtom.(3)安装latex。它的作用是:CompileLaTeXdocumentsfromwithinAtom.(4)安装language-latex。它的作用是:SyntaxhighlightingforLa

  • leetcode最长回文子串_kmp算法题

    大家好,又见面了,我是你们的朋友全栈君。 实现strStr()函数。给定一个haystack字符串和一个needle字符串,在haystack字符串中找出needle字符串出现的第一个位置(从0开始)。如果不存在,则返回-1。示例1: 输入:haystack="hello",needle="ll" 输出:2 示例2: 输入:haystack="aaaaa",needle="bba" 输出:-1 说明:复制当needle是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当needle是空字符串时我们应当返回0。这与C语言的strstr()以及Java的indexOf()定义相符。题解kmp算法classSolution{ public: voidgetNext(stringneedle,vector<int>&next){ next[0]=-1; inti=-1,k=0; while(k<needle.size()-1){ while(i!=-1

  • vci驱动安装_deviceiocontrol函数

    大家好,又见面了,我是你们的朋友全栈君。1.获取所有的驱动器 利用函数 GetLogicalDriveStringsTheGetLogicalDriveStringsfunctionfillsabufferwithstringsthatspecifyvaliddrivesinthesystem.DWORDGetLogicalDriveStrings( DWORDnBufferLength,//sizeofbuffer LPTSTRlpBuffer//drivestringsbuffer );很简单的一个函数,msdn有详细的说明 需要注意的一点是lpBuffer中最后获得的数据是这样c:/<null>d:/<null><null>,每两个路径之间都间隔一个null-terminated, 所以,如果你直接cout<<lpBuffer的话,那么得到的是C:/,很是令人郁闷,于是要想办法把这些路径一个一个取得所以,有了如下代码 TCHARszBuf[100]; memset(szBuf,0,100); DWORDlen=GetLogicalD

  • 腾讯云品牌经营管家产品概述

    什么是品牌经营管家?品牌经营管家(BMA)是腾讯云提供的面向泛企领域的一款产品,可提供全面可靠的品牌经营服务。通过使用品牌经营管家,用户可享受一站式品牌保护和版权监测服务。产品优势全网精确的侵权监测n联合腾讯安全打造全面精准实时的侵权监测系统,7×24小时全方位帮助用户发现全网品牌仿冒和版权侵权信息(网站、App、公众号、音视图文)。侵权监测覆盖面广、准确率高。多样可信的维权方式n针对品牌仿冒侵权线索,为用户提供态势预警、电子证据(固证、出证、司法鉴定)、拦截反制等一站式专业服务,助力用户维护自身权益。专业全面的运营服务n依托强大的全网监测技术、专业的法务背景运营团队,为用户提供实时监测服务响应、维权顾问的全流程一站式顾问服务。

  • C# 共享内存(转)

    以下是一个C#操作内存的一个类,只要将下面的类添加到相应的项目中,该项目就可以对内存进行直接操作! usingSystem.Runtime.InteropServices;   //添加如下命名空间需要是用DllImport publicclassShareMemLib   {    [DllImport("user32.dll",CharSet=CharSet.Auto)]         publicstaticexternIntPtrSendMessage(IntPtrhWnd,intMsg,intwParam,IntPtrlParam);           [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]      &nbs

  • jquery国内cdn

    推荐几个国内的jqueryCDN服务地址吧: 新浪CDN,感觉很快,用的人很多,推荐使用! http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js <scripttype="text/javascript"src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>复制   其它版本可以在这里找地址 http://lib.sinaapp.com/?path=/jquery 百度CDN http://libs.baidu.com/jquery/1.9.1/jquery.min.js <scripttype="text/javascript"src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>复制   其它版本之间修改代码中的版本号就行了 360的CDN http://libs.us

  • scatter/gather IO原理

      https://stackoverflow.com/questions/10520182/linux-when-to-use-scatter-gather-io-readv-writev-vs-a-large-buffer-with-frea   Themainconvenienceofferedby readv, writev is: Itallowsworkingwithnoncontiguousblocksofdata.i.e.buffersneed not bepartofanarray,butseparatelyallocated. TheI/Ois'atomic'.i.e.Ifyoudoa writev,alltheelementsinthevectorwillbewritteninonecontiguousoperation,andwritesdonebyotherprocesseswillnotoccurinbetweenthem. e.g.say,yourdataisnaturallyseg

  • 传统数据仓库架构与Hadoop的区别

    一, 下面一张图为传统架构和Hadoop的区别 主要讲以下横向扩展和扩展横向扩展:(Mpp是hash分布,具有20节点)添加新的设备和现有的设备一起提供负载能力。Hadoop中系统扩容时,系统平台增加新节点之后,系统自动在所有节点之间均衡数据。纵向扩展:(oracle两个节点)向上扩展,指的是替换掉已经不能满足需求的硬件设备、采购更高性能的硬件设备,从而提升系统的负载能力。 二,Hadoop集群是一种专门为存储和分析海量非结构化数据而设计的特定类型的集群。本质上,它是一种计算集群,即将数据分析的工作分配到多个集群节点上,从而并行处理数据。 优点: 1、扩展能力(横向扩展) Hadoop技术平台各组件均基于分布式储存和运算的概念,能可靠储存和处理海量数据(PB级)。在不保证低延时的前提下,可提供高吞吐量支持海量数据的运算。对传统数据仓库扩容成本高的限制,Hadoop平台具有运算性能线性扩展的性能,同时数据自动分布,不影响原有应用运行。 2、低成本 基于分布式储存和计算的特点,Hadoop平台对集群内单个节点的配置要求不高,集群性能主要由节点数和网络吞吐率判定。因此Hadoop可大规模部

  • JavaScript 设计模式-策略模式

    策略模式 策略模式定义一系列的算法,将每一个算法封装起来,并让他们可以相互替换 实现方法定义一组可变的策略类封装具体算法,定义一组不变的环境类将请求委托给某一个策略类 使用场景适用于业务场景中需要判断多种条件,甚至包含复杂条件嵌套的,可以使用策略模式来提升代码的可维护性和可读性。比如支付,博客权限校验 //定义策略类 varPaymentMethodStrategy={ BankAccount:function(money){ returnmoney>50?money*0.7:money }, CreditCard:function(money){ returnmoney*0.8 }, Alipay:function(money){ returnmoney } } //运行函数 constuserPay=function(selectedStrategy,money){ returnPaymentMethodStrategy[selectedStrategy](money) } console.log('银行卡支付价格为:'+userPay('BankAccount',1

  • java高并发秒杀活动的各种简单实现【springBoot+mybatis+redis+mysql】

    最近遇到比较多数据不一致的问题,大多数都是因为并发请求时,没及时处理的原因,故用一个比较有代表性的业务场景【活动秒杀】来模拟一下这个这种高并发所产生的问题。 首先搭建一个springboot项目在这里我做演示了,不会的可以自行百度,搭建过程很简单。 1:搭建好的项目目录结构   2:商品表(记录商品名称,本次可以秒杀的库存量)   加了一条记录(后面每次测试都先手动把库存恢复成100才进行测试)     3:实体类(这里不用实体类也可以,根据自己的需求来)   一、不做任何处理的高并发秒杀实现(错误演示): 1.Controller层,模拟500个并发调用: packagecom.mybatis.controller; importcom.mybatis.domain.BaseResponse;importcom.mybatis.domain.MiaoshaRequest;importcom.mybatis.service.MiaoshaService;importorg.springframework.beans.f

  • Mybatis3——使用学习(二)

    高级结果映射 ​ 一个超级复杂的联表查询语句 <!--VeryComplexStatement--> <selectid="selectBlogDetails"resultMap="detailedBlogResultMap"> select B.idasblog_id, B.titleasblog_title, B.author_idasblog_author_id, A.idasauthor_id, A.usernameasauthor_username, A.passwordasauthor_password, A.emailasauthor_email, A.bioasauthor_bio, A.favourite_sectionasauthor_favourite_section, P.idaspost_id, P.blog_idaspost_blog_id, P.author_idaspost_author_id, P.created_onaspost_created_on, P.sectionaspost_section, P.subjectasp

  • 浅谈Java中的软引用

    个人博客 http://www.milovetingting.cn 浅谈Java中的软引用 前言 Java中有四种引用类型:强引用、软引用、弱引用、虚引用。四种引用类型分别有不同的应用场景,本文主要演示软引用的简单使用、可能遇到的问题以及对应的解决方法。 软引用的简单使用 软引用的特点是:如果一个对象只存在软引用,那么当内存不足时,GC就会回收这个对象。 设置JVM的最大内存 为了模拟内存不足,这里通过-Xmx来设置JVM的最大可分配内存。 -Xmx100m 复制 这里是使用IntelliJIDEA来创建项目的。在Run-EditConfigurations中打开 先输出JVM当前的内存信息 privatestaticvoidshowInitialMemoryInfo(){ MemoryMXBeanmbean=ManagementFactory.getMemoryMXBean(); System.out.println("最大可用内存:"+toMB(mbean.getHeapMemoryUsage().getMax())); for(MemoryPoolMXBeanmxBean:

  • Keepalived+LVS架构

    https://www.xiaowangc.com/archives/keepalivedcentos8-gai-nian--an-zhuang--pei-zhi 某些内容均来源于互联网,分享仅供学习使用,如果有侵权、不妥之处,请第一时间联系我删除

  • Jenkins的Docker容器添加dotnet-sdk和git

    前言   此文章仅仅是自己想弄一套自己构建程序    第一步      当前是自己写Dockerfile了。docker的仓库里面虽然有Jenkins的镜像。但是那镜像里面没有我们.netcore的构建环境。所以了,我需要做一个自己的镜像     在https://hub.docker.com中找Jenkins的基础镜像。好像没几个版本直接用最新的版本。     然后开始编写Dockerfile      #此镜像从jenkin中构建,添加dotnetcorebuild环境和git #VERSION1 #Author:txb # #基础镜像 FROMjenkins #使用root管理员 USERroot #清除了基础镜像设置的源,切换成腾讯云的jessie源 #使用非腾讯云环境的需要将tencentyun改为aliyun RUNecho''>/etc/apt/sources.list.d/jessie-backports.list\ &&echo"debhttp://mirrors.aliyun.c

相关推荐

推荐阅读