为什么要用SmartOS?

在与Fengqi.Asia风起云)的潜在客户接触时,经常被问到如下问题:

  • 为什么我要用从Linux换到SmartOS,一个我不熟悉的系统?
  • 什么是SmartOS?
  • 你们使用的是Joyent的技术,那么Joyent是干嘛的?
  • SmartOS用的是Linux的哪个发行版?
  • ……

我在之前的博客里介绍过SmartOS(这里转载)。这里再说一下。首先SmartOS是基于illumos的。Illumos是从OpenSolaris继承而来的开源产品,而OpenSolaris又是基于Sun的Solaris 10操作系统而来的。所以SmartOS并不是运行于任何一个操作系统之上的应用系统,它本身就是操作系统。在Fengqi.Asia风起云)和Joyent,我们把它当成是一个hypervisor,在上面运行Linux、Windows、FreeBSD和在KVM上的虚拟机。KVM是Joyent从Linux里剥离出来移植到SmartOS上的(参考链接)。

此外,SmartOS支持操作系统虚拟化,虚拟出SmartMachine。和KVM类似,一个SmartMachine看上去就是一个完整的机器,有自己的硬件(存储、网络和处理器)和操作系统以及库文件等。和KVM不同的是,没有格外的虚拟化层。这意味着不同的SmartMachine在同一硬件上共用操作系统(SmartOS)。

那为什么要推荐使用SmartMachine或SmartOS,而不是Linux呢?

从high level的角度来看,主要有以下几个原因:

  • 性能
  • 可观测性(Observability)
  • 可靠性

我们来逐个细看。以下不仅适用于虚拟机,也适用于裸机。

性能

一般来说,提到性能,我们在乎的多数是网络和存储的延迟、吞吐量,处理器的利用率等等。Brendan博客有一个关于SmartMachie、KVM、Xen的性能讨论文章Virtualization Performance: Zones, KVM, Xen),我也翻译了一下(链接)。对于一般的计算,SmartOS和Linux区别不大,也许在任务调度方式上有些不同。

在网络方面,SmartOS使用了一个核心机制,叫做crossbow。除了提供虚拟的网络设备,相比Linux虚拟机,crossbow在SmartMachine上提供了更好的吞吐和延迟,也不会有网络抖动,从而有更好的传输效果,比如减少了重传。每个SmartMachine可以设置多达32个VNIC。有兴趣的可以看看这些文章:Solaris Crossbow实践指南(一):VNIC和网卡复用Solaris Crossbow实践指南(二):虚拟网络和etherstub,作者使用VNIC和Zone创建了一个新的HTTP服务器而没有添加新的硬件,采用VNIC技术提高了网络设备的利用率和复用性。而且crossbow还能在一个没有网络连接的系统中,采用etherstub和VNIC创建一个虚拟的网络环境,即能很方便地在一个物理主机上建立一个趋近于真实的并且“与世隔绝”的网络环境。还有这篇文章:如何使用 Oracle Solaris 11 网络虚拟化和资源管理限制应用程序流量,了解了如何用crossbow技术对数据链路和用户定义的流应用带宽限制进行网络流量管理,如何限制通过数据链路的所有流量,应用于流的带宽限制可以基于网络数据包的特征。这些技术可以单独使用,也可以组合使用,从而可以创建灵活的受控环境以满足网络资源管理的所有需要。这些文章都是几年前的,可见那时crossbow已经将网络虚拟化做得很好了。

就虚拟化而言,当运行SmartMachine时,进行网络I/O的代码路径和裸机运行SmartOS本身一样。在SmartOS的KVM里运行Linux和Windows时,使用crossbow做底层,还需要在虚拟机的操作系统网络代码中运行额外的代码,从而增加了额外的开销。同样道理,SmartMachine直接在SmartOS上进行磁盘I/O操作,但Linux和Windows需要在guest OS里运行额外的代码进行磁盘I/O。

就文件系统,SmartOS使用了ZFS,每个SmartMachine运行自己的ZFS数据集,每个Linux/Windows虚拟机有自己的ZFS卷。ZFS使用了Adjustable Replacement Cache (ARC)算法,在缓存文件系统数据或元数据方面做得非常好。这个视频(需要翻墙,by Brendan Gregg)详细地叙述了ZFS的性能。

可观测性(Observability)

这可以算是使用SmartOS的最主要的原因,特别对技术人员而言。可观测性是指工程师能看到程序、库文件及操作系统到底在做什么,即从应用到硬件中的整个软件栈活动都能被看到。这样做可以帮助调试或排错,定位并解决性能的问题。

传统进行debug和性能分析时,工程师会添加一些代码到程序中,比如通过调试器、输出语句或其他方式。有时这种做法并不容易知道问题所在,有时还需要重新编译代码或者重启程序/系统,有时可能添加的代码还会带来更多的潜在问题等等。

在这个方面,SmartOS提供了一个工具叫做DTrace。DTrace可以让你在任意时刻看到整个软件栈的情况,完全不需要添加额外的代码或工具在你的程序中。DTrace在生产环境下都是很安全的,也不需要重新编译或重启任何东西。此外,还有USE方法可以帮你定位你想跟踪的东西,Brendan Gregg写了篇文章专门介绍他的Utilization Saturation and Errors (USE) Method(链接1链接2),有兴趣的朋友可以看看。注意USE方法可以用于任何系统:“It directs the construction of a checklist, which for server analysis can be used for quickly identifying resource bottlenecks or errors.”

DTrace机制可以用于:

  • 调试排错 —— 比如,使用DTrace跟踪函数的入口和返回,输出相应的参数和返回值。还可以用它研究某个函数是如何被调用的(stacktrace),对于某个给定事件,代码运行路径是怎样的等等。
  • 性能分析 —— DTrace允许你拿到纳秒级的信息。你可以用它去采样来看CPU是如何耗时的,也可以用来研究为什么应用程序会被阻止继续执行,会持续多久等。
  • 代码覆盖 —— DTrace可以判断程序是否有被执行,这在测试中很重要。
  • 我也不知道到底发生了什么 —— 你需要理解一个软件是如何运行的,也许是为了排错,也许是为了添加新的性能。把自己放到百万行代码中埋头苦干也许能帮助你了解程序,但如果有个工具能帮你找到你需要读的代码,那自然再好不过。

DTrace肯定会用到Linux中(Github上的DTrace on Linux),不过用到生产环境中还需时日。

可靠性

SmartOS间接地来自于Solaris,而后者一直以来在可靠和安全方面都广受好评。此外,ZFS校验和可保证数据不受损坏,使用写时复制(copy-on-write)机制确保活跃数据不会被被覆盖。ZFS文件系统有良好的一致性,自从2006年就被用于生产环境,易于管理。最近还被用于大数据方面。

其他特点

除了ZFS和DTrace,SmartOS还使用了zones(zone是SmartOS的虚拟化后的实例。A zone is a virtualized instance of SmartOS that behaves like an isolated system even when functioning along side other zones on the same machine)。 Zones被用在SmartMachines和Linux/Windows虚拟机中。每个SmartMachine和Linux/Windows虚拟机都在自己的zone中运行。在一个zone中运行的进程没有权限访问运行在其他zone中的进程。每个zone被赋予了一个ZFS数据集或卷用于存储。运行KVM实例在他们的zone中意味着万一一个虚拟机有问题,它会在zone中解决,不会对其他租户(zone)带来任何的影响。 每个zone通过crossbow都有自己的虚拟网络栈,与其他zone的网络栈完全隔离,即你无法嗅探其他zone中的网络包。在一个zone中的设备不会被其他zone访问到。

资源分配和管理对于每个zone而言也是受控的。资源受控意味着一个zone内可以控制能使用多少内存,多少CPU,多少网络带宽等。此外,还有调整磁盘I/O优先级的机制(disk I/O throttling),也就是说一个zone不会在存在磁盘带宽竞争的情况下用尽网络带宽。SmartOS提供两种方式用于控制CPU消耗:第一种方式是,设置CPU下限。Fair share scheduler调度器允许管理员设置一个最低的必须保证的CPU资源。在系统被多个zone索取资源时,调度器发挥作用,保证每个zone获得公平的资源分配。当系统没那么繁忙时,一个zone可以“爆发”超过资源限制,直到达到为其设定的CPU资源上限。第二种方式是,设置CPU上限(CPU cap),比如有多少CPU时间可以分配给一个付费用户。这个可以用于管理用户对系统性能的期望值,即使在资源和负载都很低的情况下也可以这么做。

SmartOS中有一个用于管理服务的机制叫做Service Management Facility (SMF)。SMF是替代其他系统中的/etc/init.d脚本的。当然你还是可以使用/etc/init.d脚本,只是SMF给了你更细粒度的管理选择。还有一个机制叫Fault management (FMA),具体就不解释了,给一句英文做参考吧: "fine-grained fault isolation and restart where possible of any component — hardware or software — that experiences a problem. The diagnosis system is used to trigger targeted automated responses or guided human intervention that mitigates a specific problem or at least prevents it from getting worse."

还要使用Linux吗?

当然。对于很多人来说,正是因为对Linux熟悉,所以学习SmartOS的陡峭学习曲线会成为一道不小的障碍。但是毕竟SmartOS和Linux都是基于Unix的系统,两者是有区别但也没有到很难上手的级别。你可以看看这篇文章“SmartOS 与 Linux 不同点总结(Cheat Sheet )”(源自The Linux-to-SmartOS Cheat Sheet

还有就是,Linux有很多厂商驱动支持,很多软件可用。其实大多数写给Linux的软件都能用于SmartOS,移植的困难程度取决于软件有多少专属于Linux的代码在其中。就可移植性来说,如果程序员想要做到这点,在Linux、SmartOS以及FreeBSD上都进行测试是最低要求。

为什么要用SmartOS?,布布扣,bubuko.com

时间: 2024-10-03 13:20:23

为什么要用SmartOS?的相关文章

SmartOS之(C++)------串口类SerialPort

SmartOS(C++)的串口驱动,兼容STM32F0/F1/F4/GD32F10x/GD32F1x0 头文件 1 #ifndef __SerialPort_H__ 2 #define __SerialPort_H__ 3 4 #include "Sys.h" 5 #include "Port.h" 6 #include "Net\ITransport.h" 7 8 // 串口类 9 class SerialPort : public ITran

SmartOS之(C++)------硬件定时器类Timer

SmartOS (C++)的硬件定时器驱动,兼容STM32F0/F1/F4/GD32F10x/GD32F1x0 头文件 1 #ifndef __Timer_H__ 2 #define __Timer_H__ 3 4 #include "Sys.h" 5 6 // 定时器 7 class Timer 8 { 9 private: 10 TIM_TypeDef* _port; 11 byte _index; // 第几个定时器,从0开始 12 volatile bool _started;

SmartOS之(C++)------输入输出端口类Port

SmartOS (C++)的GPIO驱动,兼容STM32F0/F1/F4/GD32F10x/GD32F1x0 头文件 1 #ifndef _Port_H_ 2 #define _Port_H_ 3 4 #include "Sys.h" 5 #include "ADC.h" 6 7 #ifdef STM32F4 8 #define GPIO_MAX_SPEED 100 9 #else 10 #define GPIO_MAX_SPEED 50 11 #endif 12

SmartOS资料总汇

源代码持续更新中...... SmartOS系统来源于新生命开发团队. V1.0全部C写.(已经开源.下载地址新生命论坛) V1.1的全部C++编写. 下面是SmartOSV1.1的代码: ①SmartOS之------小鬼点灯 ②SmartOS之------中的输入 ③SmartOS之------串口通信 ④SmartOS之------SPI基础 ⑤SmartOS之------AT45DB(SpiFlash) ⑥SmartOS之------Flash操作 ⑦SmartOS之------CRC校

Managing Images on smartos

SmartOS依赖images.images是包含在创建新zone或虚拟机时使用的磁盘或文件系统映像和元数据的模板. images使用imgadm工具进行管理. 使用此工具,您可以: 查看和下载在公共映像服务器上可用的映像     安装本地images或者import远程images     列出,显示或打印有关images的详细信息     销毁images 这里我们将讨论如何查找可用的images并开始使用它们. 然后我们将看看images是什么,以及如何创建自己的images. 最后,我们

ZFS+Dtrace+Zones+KVM=SMARTOS + dtrace 详细文档

https://smartos.org/ http://dtrace.org/guide/chp-io.html http://blog.csdn.net/babyfacer/article/details/8577333 http://www.beginningwithi.com/2013/01/22/whole-lotta-videos/ http://blog.smartcore.net.au/smartos-command-line-fu/ http://www.openindiana.

SMARTOS 总结

SMARTOS 总结 什么是ZFS文件系统,有什么特点? 动态文件系统(Dynamic File System),是第一个128位文件系统,基于存储池的,与典型的映射物理存储设备的传统文件系ZFS统不同,ZFS所有在存储池中的文件系统都可以使用存储池的资源,ZFS 完全抛弃了“卷管理”,不再创建虚拟的卷,而是把所有设备集中到一个存储池中来进行管理!“存储池”描述了存储的物理特征(设备的布局,数据的冗余等等),并扮演一个能够创建文件系统的专门存储空间. 使用一种写时拷贝事务模型技术.所有文件系统中

SmartOS之------中的输入

作用 接收多个输入脚的中断事件芯片GD32F103VE 代码 1 // 输入口 2 static Pin INS[] = { PE9, PE8, PE4, PE5, PE6, PE7}; 3 4 void OnIORead(Pin pin, bool down, void* param) 5 { 6 debug_printf("Press P%c%d down=%d\r\n", _PIN_NAME(pin), down); 7 } 8 9 int main(void) 10 { 11

【SmartOS】轻量级多任务调度系统

SmartOS是一个完全由新生命团队设计的嵌入式操作系统,主要应用于智能家居.物联网.工业自动化控制等领域. ARM Cortex-M系列微处理器几乎全都做成单核心,对于业务逻辑较复杂的物联网就显得难以使用,因此SmartOS设计了两个多任务调度系统:1,多线程调度,重量级,逼近PC操作系统多线程用法.使用上需要特别小心,要合理分配每一个线程的栈空间大小,任务越多越容易出问题2,大循环,轻量级.每个任务注册一个函数指针,然后由主线程轮询各个任务函数,轮流执行 本文主要讲解第二种,轻量级多任务调度