Linux Container 轻量虚拟机

概述

百度应用引擎(BAE)提供多语言、弹性的服务端运行环境,能帮助开发者快速开发并部署应用。

我们在运营BAE2.0的过程中,发现困扰开发者的一个主要问题就是应用的“云端运行环境”与开发者的“本地开发环境”不一致,很多功能受到限制。开发者在本地开发调试好的应用,发布到云端就遇到种种问题无法运行,不得不针对云端环境进行修改。

这个问题的主要原因在于传统PaaS(例如BAE2.0等)采用“沙盒技术”来实现应用之间的资源隔离,“沙盒技术”需要对运行环境和编程语言进行功能限制,(例如禁止创建进程和线程,禁止某些系统调用,禁止对某些文件系统路径的读写,禁止加载C语言模块、禁止某些网络功能等),这就大大增加了开发者的学习成本,也使得应用的开发和迁移难度变大。

base1-1
图1

【如图1所示: 在同一个执行单元内部,采用“沙盒技术”,对每个应用的“运行环境和编程语言功能”进行限制,从而实现了应用的隔离。】

为了解决这个困扰广大开发者的问题,我们推出了BAE3.0!BAE3.0在底层采用“轻量虚拟机技术”完美解决了资源隔离问题,而在运行环境和编程语言层面,则不做任何限制;应用在云端的运行环境与开发者本地的开发环境保持一致,从而使得学习成本、开发和迁移成本降到最低,开发者的生产力得到最大限度的解放。

base1-2
图2

【如图2所示,为每个执行单元创建一个轻量虚拟机,每个执行单元跑一个BAE部署。在轻量虚拟机之间实现资源隔离;在“运行环境和编程语言”层面无任务限制。】

核心概念

应用

在BAE2.0中应用与BAE部署一一对应,不同部署之间若要共享数据或资源必须通过授权管理,复杂且不方便;在BAE3.0中,应用可包含多个BAE部署,同应用下的部署资源互通。

应用引擎(BAE)部署

在BAE3.0中,每一个BAE实例称为一个“BAE部署”。BAE3.0新增了worker类型的部署。传统的WEB类型,主要用来创建WEB应用,它的特点是通过HTTP请求来驱动应用逻辑;但有时候我们需要长期在后台跑一些任务,例如爬虫,不停的去爬取各种网络资源,这种就需要woker类型的部署来实现了。

部署类型

或者叫做“Runtime类型”,每个BAE部署对应一种部署类型,目前包括node.js-web,php-web, php-worker, java-web, python-web, python-worker。后续会支持更多类型,给开发者更多的选择。

执行单元

每个BAE部署由一个或多个“执行单元”组成。执行单元是一个抽象的概念,每个执行单元实际是由一组进程组成;例如一组lighttpd + php-fpm 进程组成了 php-web执行单元。对于一个WEB应用来说,随着访问量的上升,一个基础执行单元很可能扛不住压力。那么可以通过增加执行单元个数进行“水平扩展”,或者增大执行单元配置如内存进行“垂直扩展”,从而轻松应对压力。

轻量虚拟机

执行单元由一组进程组成,而这组进程实际是运行在一个单独的轻量虚拟机里面的;每个执行单元对应一个轻量虚拟机。对开发者来说,不需要关心轻量虚拟机的存在,而是关心为自己应用服务的“执行单元”; 而对BAE的运维人员来说,才需要关心轻量虚拟机的运行情况。

base1-3
图3

【如图3所示:在BAE3.0中,BAE部署与执行单元、轻量虚拟机的关系】

假设有一个“BAE部署”,分配了两个“执行单元”,每个“执行单元”对应一个“轻量虚拟机”, “执行单元”是抽象概念,它启动后,对应着“轻量虚拟机”里面的一组进程,包括 lighttpd 和 php-fpm 进程等。

当“轻量虚拟机”出现故障后,BAE平台会自动为它重新分配一个轻量虚拟机,并将“执行单元”部署到新的轻量虚拟机上,这就是“执行单元”的迁移。这种技术保证了应用的高可靠性。

当应用流量上升,两个“执行单元”不够用的时候,可以再增加新的轻量虚拟机,并部署“执行单元”,这就是“执行单元”的扩容。这种技术保证了应用的可扩展性。

BAE3.0特性

运行环境和与编程语言无任何限制

比如在BAE2.0里面的限制,包括创建进程、创建线程、系统调用、执行C扩展模块、文件系统访问等等,在BAE3.0都不再进行限制。

我们也不再限制每次WEB请求必须在30秒内完成
多种编程语言支持

除了PHP、Python、Java、Node.js以外,我们还会陆续增加对主流开发语言的支持。此外将来开发者还可以自定义运行环境。

编程框架的支持

由于编程语言层面没有任何限制,那么各种编程框架的支持也就水到渠成了。不管你是主流的框架,还是小众的框架,只要能在开发者本地的环境中运行起来,那么在云端也可以跑起来。

自动安装依赖的模块

对于python开发者来说,只要把依赖的模块,例如django, flask等写到 requirements.txt中,BAE会自动帮你把这些模块部署到执行环境中。对于nodejs开发者,可以使用 package.json 达到同样的效果。

丰富的服务支持
BAE2.0里面,我们为开发者提供的很多贴心的服务,在BAE3.0里面继续可以使用,如MySQL、MongoDB、Redis、Cache、Image等等。
此外百度强大的云能力也都支持,如云存储、媒体云、云推送、LBS等等。
自由的网络访问

许多PaaS,对外的网络访问需要通过HTTP Proxy 或者是Socket Proxy 代理出去;而在BAE3.0里面,对外的网络访问不再需要经过代理层的转发。

此外,我们还将在未来开放“端口服务”,允许开发者自定义对外提供服务的TCP/UDP端口,从而实现更复杂的业务逻辑。
新增worker类型

很多PaaS只能提供web类型应用的开发;而BAE3.0新增的worker类型应用,可以满足开发者执行长期任务的需求。例如您可以使用worker类型来实现一个自定义的网络爬虫。Worker类型示例

本地开发环境

我们提供了接近于“云端运行环境”的本地开发环境工具,帮助开发者在本地进行开发和调试;当您在本地完成开发和调试后,再将应用部署到云端,就可以流畅的运行起来了。

执行单元套餐

在创建BAE部署的时候,您可以根据实际情况选择执行单元的“套餐类型”;也可以在应用上线后,根据访问量随时调整“套餐类型”,从而提高资源利用率。

运行环境

BAE3.0 是一种基于Linux Container的资源独享型PaaS:

基本技术: Linux Container

BAE3.0底层采用的是Linux Container这种轻量虚拟机技术,相对于传统的kvm, xen 等虚拟机技术来说,它可以更好的适应云计算的需求。
关于Container技术的详细介绍,可以参考这里 http://linuxcontainers.org/
操作系统

Ubuntu 12.04 Server

轻量虚拟机内部,我们采用的是64位的 Ubuntu 12.04 Server。
资源配额

每个轻量虚拟机都具有一定的资源配额,应用如果使用了超过配额的资源,就可能出现不可预期的错误。例如疯狂分配内存,大量占用磁盘空间等等。

    • 内存: 默认 256M;可通过套餐来调整大小
    • 磁盘: 2G
    • CPU: 与其它轻量虚拟机分享CPU
    • 网络: 流入5Mbytes/秒;流出5Mbytes/秒
部署应用代码

应用代码部署在 /home/bae/app 目录下,其权限为 bae 账号所有

执行应用代码

应用代码以 bae 账号来运行;因此应用代码对于 /home/bae 目录下具有任意的读写和访问权限,同时对 /tmp 目录也具有读写和访问权限

临时性文件系统

应用虽然可以在 /home/bae/ 等目录下任意读写,但是我们说轻量虚拟机里面是一个“临时性文件系统”;也就是说,应用在这些目录下动态创建的文件、目录,是随时可能消失的。这是因为当轻量虚拟机出现故障,或者轻量虚拟机所在物理机器出现故障的情况下,需要将这个轻量虚拟机动态的迁移到别的物理机器上,保证应用的“高可用性”。迁移后,原来轻量虚拟机里面的文件、目录就都丢失了;这也是PaaS通用的处理逻辑。

对应用开发者来说,应该意识到PaaS的这种特性,并尽量将需要持久化的数据或者是需要被多个轻量虚拟机共享的数据放到mysql, redis, mongodb, bcs 等存储服务器上。或者使用NFS服务,也可部分解决共享文件的需求。

执行单元压测

以下是对现有的几种 语言环境 进行压力测试的基础数据,压测基于256M内存的执行单元,开发者可参考如下测试数据,以了解BAE3.0中执行单元的抗压能力。

Nodejs runtime
 由于压测的只是一个最简单的helloworld页面,没有用到任何扩展服务,因此实际情况可能低于此值。
nodejs执行单元压测数据
并发 30 40 50 100 150 300
qps 874 1020 1078 1134 1140 1058
请求数 213794 209581 341982 276669 165076 247589
2xx时延 1ms 1ms 3ms 11ms 29ms 112ms
4xx数量 0 0 0 0 0 0
5xx数量 0 0 0 0 0 2
error数量 73 51 55 57 60 45
宿主机idle 40% 40% 35%’ 50% 30% 30%
宿主机load average 21 24 21 70 30 22
网络带宽 4M 4M 5M 6M 5M 6.5M
Php runtime
 仅仅针对phpinfo() 页面进行相关压测,没有用到任何扩展服务,因此实际情况可能低于此值。
php 执行单元压测数据
php cgi 数: 50        
并发 30 40 50 80 100
qps 1125 1110 1454 1308 425
请求数 117569 161131 153592 197640 68263
2xx时延 1ms 1ms 1ms 1ms 30ms
4xx数量 0 0 0 0 0
5xx数量 0 0 0 0 0
error数量 40 300 176 715 4828
error几率 0.03% 0.18% 0.11% 0.36% 7%
宿主机idle 40% 20% 20% 5% 1%
宿主机load average 17 23 36 47 120
网络带宽 200k 350k 476k 420k 180k
Python runtime
 由于压测的只是一个最简单的helloworld页面,没有用到任何扩展服务,因此实际情况可能低于此值。
python 执行单元压测数据
cgi 数: 50    
并发 40 50 80
qps 859 864 916
请求数 136719 146709 142883
2xx时延 4ms 5ms 6ms
4xx数量 0 0 0
5xx数量 5 3 12
error数量 2 8 72
error几率 0% 0% 0.05%
宿主机idle 33% 25% 30%
宿主机load average 14.89 18.62 19.75
网络带宽 240k 280k 220k
Java runtime
 此次压测只测试了一个最简单的index.jsp 页面,没有用到任何扩展服务,因此实际情况可能低于此值。
java 执行单元压测数据
并发 30 40 50 100 150
qps 337 482 529 536 872
请求数 45612 65316 70876 74920 108868
2xx时延 4ms 4ms 5ms 37ms 80ms
4xx数量 0 0 0 0 0
5xx数量 0 0 0 0 43318
error数量 12 7 11 12 19
宿主机idle 10% 10% 10%’ 5% 5%
宿主机load average 55 62 63 70 63
网络带宽 1M 2M 5M 6M 5M


来源:http://developer.baidu.com/wiki/index.php?title=docs/cplat/bae

Macbook开发环境选用这个了。

About 智足者富

http://chenpeng.info

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>