Monday, January 26, 2015

C10K 问题引发的技术变革

C10K 问题

服务器同时支持并发 10K 量级的连接,这些连接可能是保持存活状态的。
解决这一问题,思路主要有两个方面,一个是对于每个连接处理分配一个独立的进程/线程;另一个思路是用同一进程/线程来同时处理若干连接。

每个进程/线程处理一个连接

这一思路最为直接。但是由于申请进程/线程会占用相当可观的系统资源,同时对于多进程/线程的管理会对系统造成压力,因此这种方案不具备良好的可扩展性。
因此,这一思路在服务器资源还没有富裕到足够程度的时候,是不可行的;即便资源足够富裕,效率也不够高。
问题:资源占用过多,可扩展性差。

每个进程/线程同时处理多个连接

传统思路

最简单的方法是循环挨个处理各个连接,每个连接对应一个 socket,当所有 socket 都有数据的时候,这种方法是可行的。
但是当应用读取某个 socket 的文件数据不 ready 的时候,整个应用会阻塞在这里等待该文件句柄,即使别的文件句柄 ready,也无法往下处理。
  • 思路:直接循环处理多个连接。
  • 问题:任一文件句柄的不成功会阻塞住整个应用。

select

要解决上面阻塞的问题,思路很简单,如果我在读取文件句柄之前,先查下它的状态,ready 了就进行处理,不 ready 就不进行处理,这不就解决了这个问题了嘛?
于是有了 select 方案。用一个 fd_set 结构体来告诉内核同时监控多个文件句柄,当其中有文件句柄的状态发生指定变化(例如某句柄由不可用变为可用)或超时,则调用返回。之后应用可以使用 FD_ISSET 来逐个查看是哪个文件句柄的状态发生了变化。
这样做,小规模的连接问题不大,但当连接数很多(文件句柄个数很多)的时候,逐个检查状态就很慢了。因此,select 往往存在管理的句柄上限(FD_SETSIZE)。同时,在使用上,因为只有一个字段记录关注和发生事件,每次调用之前要重新初始化 fd_set 结构体。
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
  • 思路:有连接请求抵达了再检查处理。
  • 问题:句柄上限+重复初始化+逐个排查所有文件句柄状态效率不高。

poll

poll 主要解决 select 的前两个问题:通过一个 pollfd 数组向内核传递需要关注的事件消除文件句柄上限,同时使用不同字段分别标注关注事件和发生事件,来避免重复初始化。
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
  • 思路:设计新的数据结构提供使用效率。
  • 问题:逐个排查所有文件句柄状态效率不高。

epoll

既然逐个排查所有文件句柄状态效率不高,很自然的,如果调用返回的时候只给应用提供发生了状态变化(很可能是数据 ready)的文件句柄,进行排查的效率不就高多了么。
epoll 采用了这种设计,适用于大规模的应用场景。
实验表明,当文件句柄数目超过 10 之后,epoll 性能将优于 select 和 poll;当文件句柄数目达到 10K 的时候,epoll 已经超过 select 和 poll 两个数量级。
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
  • 思路:只返回状态变化的文件句柄。
  • 问题:依赖特定平台(Linux)。

libevent

跨平台,封装底层平台的调用,提供统一的 API,但底层在不同平台上自动选择合适的调用。

C10K 到 C10M

随着技术的演进,epoll 已经可以较好的处理 C10K 问题,但是如果要进一步的扩展,例如支持 10M 规模的并发连接,原有的技术就无能为力了。
那么,新的瓶颈在哪里呢?
从前面的演化过程中,我们可以看到,根本的思路是要高效的去阻塞,让 CPU 可以干核心的任务。
当连接很多时,首先需要大量的进程/线程来做事。同时系统中的应用进程/线程们可能大量的都处于 ready 状态,需要系统去不断的进行快速切换,而我们知道系统上下文的切换是有代价的。虽然现在 Linux 系统的调度算法已经设计的很高效了,但对于 10M 这样大规模的场景仍然力有不足。
所以我们面临的瓶颈有两个,一个是进程/线程作为处理单元还是太厚重了;另一个是系统调度的代价太高了。
很自然地,我们会想到,如果有一种更轻量级的进程/线程作为处理单元,而且它们的调度可以做到很快(最好不需要锁),那就完美了。
这样的技术现在在某些语言中已经有了一些实现,它们就是 coroutine(协程),或协作式例程。具体的,Python、Lua 语言中的 coroutine(协程)模型,Go 语言中的 goroutine(Go 程)模型,都是类似的一个概念。实际上,多种语言(甚至 C 语言)都可以实现类似的模型。
它们在实现上都是试图用一组少量的线程来实现多个任务,一旦某个任务阻塞,则可能用同一线程继续运行其他任务,避免大量上下文的切换。每个协程所独占的系统资源往往只有栈部分。而且,各个协程之间的切换,往往是用户通过代码来显式指定的(跟各种 callback 类似),不需要内核参与,可以很方便的实现异步。

参考文献

  • http://www.ulduzsoft.com/2014/01/select-poll-epoll-practical-difference-for-system-architects/

Sunday, January 25, 2015

网络流量监控技术概述

监控指标

  • 延迟(Latency)
  • 丢包率(Packet Loss)
  • 吞吐量(Throughput)
  • 链路使用率(Link Utilization)
  • 可用性(Availability)

测量手段

  • 主动 vs 被动
  • 单点 vs 多点
  • 网络层 vs 应用层
  • 镜像 vs 采样
  • 主机端 vs 交换节点

流量抓取协议

镜像/SPAN

把被监控端口的流量复制一份,发送到特定目的端口。某些硬件交换机支持,OpenvSwitch 支持类似的 Mirror 功能。
分为两类:
  • 本地 SPAN:被监控端口和目的端口在同一交换机。
  • 远端 SPAN:被监控端口和目的端口在不同交换机。
被监控的流量从方向上可以为:
  • 进入流量:支持多个端口或指定 VLAN。
  • 出去流量:一个端口。

流量统计协议

SNMP

Simple Network Management Protocol,IETF 标准,从路由器内存(MIB 库,管理信息数据库)中定期获取简单 IP 层统计信息,同时支持对设备进行管理。对设备有负担。

RMON

Remote Network MONitoring,IETF 标准,查询网络设备的 MIB 库。对设备有负担。

NetStream

基于网络流的信息统计。网络设备自身统计网络流信息并放在本地缓冲区,缓冲区满或超时后输出统计信息。 3Com、HP、华为支持。

sFlow

sampled flow。sFlow 是基于采样(sampling)的流量抓取工具,由 inMon 公司推出,交换机上使用较多。大部分硬件交换机中内置专用芯片支持,OpenvSwitch 支持。
sFlow 支持获取采样数据包的任何数量的字节,由内置 agent 封装为 UDP 包后发给采集器,默认端口为 6343。采集器(或分析器)可以根据这些数据包进行进一步的汇总和统计。sFlow 最大的优点是降低对设备的资源压力,扩展性好。
采样方法包括基于流的和基于时间的。
支持 sFlow 的设备列表可以参考:http://www.sflow.org/products/network.php。

NetFlow

Cisco 推出的基于采样的流统计标准,目的是统计每条流的信息,路由器上使用较多。在 NetFlow 技术的演进过程中,Cisco 一共开发出了 V1、V5、V7、V8 和 V9 等 5 个主要的实用版本。
NetFlow 支持采样或全部流量(CPU 占用高)的统计,本地采集到 cache 中进行统计,当流结束时(或超时,或指定时间间隔)以相应格式封装为 UDP 包上报记录并清除本地 cache,采集器典型端口为 2055。大部分设备支持的最低刷新 cache 超时为 60 秒。
定义一条流经典的考虑如下 7 个域:
  • 源 IP 地址;
  • 目标 IP 地址;
  • 源端口号;
  • 目标端口号;
  • 三层协议类型;
  • 服务类型(TOS)字节;
  • 网络设备输入或输出的逻辑网络端口(iflndex)。
Cisco Flexible NetFlow 协议号称支持用户选择自定义的域来定义流。
对于每条流可以记录其传送方向和目的地等流向特性,统计其起始和结束时间、服务类型、包含的数据包数量和字节数量等流量信息。
典型的一条流记录的格式,例如
源地址 | 目的地址 | 源自治域 | 目的自治域 | 流入接口号 | 流出接口号 | 协议源端口 | 协议目的端口 | 协议类型 | 包数量 | 字节数 | 流数量
例如(经 nfdump 转化):
Date flow start          Duration Proto   Src IP Addr:Port      Dst IP Addr:Port     Packets    Bytes Flows
 2010-09-01 00:00:00.459     0.000 UDP     127.0.0.1:24920   ->  192.168.0.1:22126        1       46     1
 2010-09-01 00:00:00.363     0.000 UDP     192.168.0.1:22126 ->  127.0.0.1:24920          1       80     1

IPFIX

IP Flow Information Export,IETF 推出的基于采样的流统计标准,源自 Cisco 的 NetFlow v9 标准。
定义一个流也考虑 NetFlow 类似的 7 个域。
每条流记录特征信息,包括:
  • 时间戳
  • 网包数
  • 网包平均大小
  • 总字节数
  • 流开始时间
  • 流结束时间

OpenFlow flow statistics

统计流量信息。

其他协议

类似协议还包括 Juniper 的 J-Flow/cflowd(类似 sFlow)、HP 的 Extended RMON 等、Ericsson 的 Rflow、Citrix 的 AppFlow。

流量采集和分析工具

inMon 自家的侧重 sFlow 的

  • Traffic Sentinel:提供大而全的流量性能分析和管控,包括网络、存储、计算热点等。支持主流的网络监控协议。
  • sFlowTrend:免费的 sFlow 流量采集,提供端口统计功能。
  • sFlowTrend Pro:增加存储功能,可以查看历史数据。
  • sFlow-RT:支持 sflow 和 SDN 控制器功能,实时 sflow 分析,提供负载均衡和 DDoS 检测等。
更多工具可以参考 http://www.sflow.org/products/collectors.php

ntopng

开源产品,原先的版本叫 ntop,定位于流量分析和问题定位。
ntopng 以网页形式显示流量统计信息,支持流量实时汇总和监控。

NetFlow Analyzer

闭源产品。支持 NetFlow, sFlow, JFLow 等格式 flow 的收集器和分析引擎整合。

Solarwinds NetFlow Traffic Analyzer

solarwinds 的产品,基于 Windows .Net+SQL Server,支持 NetFlow, sFlow, JFLow 等格式,图形界面,支持带宽统计、应用类型统计、

flowviewer

对 NetFlow/IPFix 的数据分析工具,提供 Web 界面。http://sourceforge.net/projects/flowviewer

nfdump

支持 NetFlow,提供一系列命令行工具,提供基于地址、端口等的流量信息统计。
开源产品,项目地址为 http://nfdump.sourceforge.net/。

nfsen

为 nfdump 提供的 Web 前端。
开源产品,项目地址为 http://nfsen.sourceforge.net/。

Monday, January 19, 2015

OpenvSwitch 的 Open Virtual Network(OVN)项目

几天前(1 月 13 日),OpenvSwitch 团队正式宣布了 OVN(Open Virtual Network )项目。正文参考 Open Virtual Network Annoucement
这个项目挺有意思,简单谈下我的看法。
众所周知,OpenvSwitch 已经是现在数据中心里软件交换机的事实标准。由于硬件交换设备的成本一直降不下来,而且用硬件交换设备去延伸管控服务器上的虚拟机的相关标准和协议仍不成熟,OpenvSwitch 在相当长的一段时间里,以其成本和灵活性的优势,占据很大一部分低端市场。
传统情况下,大家使用 OpenvSwitch 主要有两个目的,一个是支持 OpenFlow、OVSDB 这样的 SDN 管控协议;另外一个是作为数据中心中的接入层交换机。
而 OVN 项目的提出,其实是针对后一种应用场景,大大增强和简化了 OpenvSwitch 作为接入层交换机的使用。
OVN 要做的事情,看起来其实蛮简单,就是直接提供对虚拟网络(各种 overlay、安全组等)的支持。这件事很简单,但是将产生的影响实际上很大。
现在数据中心里,由于大二层的需求和硬件交换机的不给力,虚拟网络实际上已经成为了一种基础设施。谁不上虚拟网络,那他的数据中心规模一定大不了。正是看到了这点,OVN 希望将如何提供虚拟网络这件事情 take over 过来,让上层的用户直接使用它,而无需自己费心思去采用各种 overlay 技术往 OpenvSwitch 中塞各种规则。
在实现上也不难理解,底下还是 OpenvSwitch,上面多了一层 Hypervisor 层,如下图(基于官方的图修改)所示,新的组件主要包括一个 OVN DB 和 一个 OVN-Controller,以及它们之间的通讯协议。

虽然官方一直坚持 OVN-Controller 并非一个 SDN 的完整控制器,但是由于目前虚拟网络管理往往是在 SDN 控制器中做的,其实可以理解为把传统 SDN 控制器中这一层要做的事情给接管了过来。往后控制器实际上可以直接操作现成的虚拟网络了。
从架构设计上,理念跟 OpenvSwitch 类似,核心还是数据库,组件之间通过协议进行松耦合的调用。
如果说最初大家讨论 SDN 是希望将控制平面跟数据平面拿开,那么,在这里其实是希望将控制层的部分功能再往回放放。这个思想跟我们 12 年提出的设计很相似。
不从对错的角度,从实用的角度看,数据平面特点是“傻快”,控制平面是“灵慢”。这意味大量重复性的简单操作应该是跟数据平面靠的近一些,反过来发生频率低的,需要复杂处理的则应该争取放到控制平面去。OVN 无疑也是看到了在数据中心网络这个特殊场景中,各种虚拟网络所依靠的封装、映射等操作已经成为了常见的基本需求。这些基本需求都放到远端的控制器,已经有点“杀鸡用牛刀”的感觉了。
当然,思路是这个思路,具体怎么做,现在这个样子是否是最合理的,还得看实践的检验。但这确实是一个从底下往上走的很好的尝试。

Tuesday, January 13, 2015

网络技术正当革命时

计算机网络自诞生之后,面向的应用场景主要包括局域网、广域网两大类。在各种环境中,通过层级结构将局域网连接起来,形成一个网络的网络,即所谓的互联网。无论什么网络,唯一的事实标准就是 TCP/IP 协议栈以及围绕这个协议栈的各种管理和应用技术,即便后来推出的 IPv6、CCN、SDN 等网络技术,都没有完全超出这个范畴。所以,看起来基于 TCP/IP 的修修补补在相当长的一段时间里满足了各种场景下对于网络的需求
然而,到了现在云计算的时代,数据中心场景对于网络的需求,让这些传统的网络架构开始碰到了真正的难题。
在数据中心里有着其截然不同的网络需求和运营特点:
  • 资源都为某一方统一管理(或者说是存在统一查询的逻辑层)
  • 网络本身的动态性极高(各种迁移调度)
  • 网络的规模极大(几十万台主机,甚至几百万台主机)
  • 策略配置十分复杂(一个 vm 可能就要跟着十几条规则)
  • 性能需求十分苛刻(不光是正常传输性能,还有收敛性能)
这些特点对网络技术提出了很严峻的挑战,甚至可以说,其中某些问题在现有的网络架构下,是无解的。
就比如说可扩展性的问题,传统的二层汇聚,然后三层隔离广播域的做法,让网络对于核心层的压力骤增。而即便是昂贵的商用核心解决方案,也存在种种局限。
再比如说迁移的问题,这就从根本上对 TCP/IP 的模型的设计提出了挑战,虽然有种种 overlay 的技术来试图弥补这个缺陷,但又带来了传输的代价和额外的管理成本。
这些挑战使得网络虚拟化看起来很美,但到了落地阶段就会发现十分困难。
那么,为什么不重新考虑整个问题,看看数据中心中的网络需求到底是什么?
在当前的数据中心里,实际上运行的无论是否是虚拟机,提供给用户的都是各种通过互联网接入的服务(直接以虚机方式提供给用户的形式将越来越少)。用户访问这些服务,是基于 TCP/IP 服务进行的。这些服务之间,以及内部如何实现,其实并不一定是 TCP/IP。
一旦脱离开 TCP/IP 技术的限制,其实可以设计一套面向数据中心内部种种场景的特定协议。比如,在数据中心中,虚机(或主机)的发现,其实完全不需要依赖传统的二层广播形式。在启动虚机的同时(或在虚机启动后),控制层就已经明确知道这个虚机在哪里,它需要跟谁进行通信,那么很自然,相应的位置信息和通信信息其实可以进行提前的配置和优化,而无需非要先广播询问接口,通过一层甚至多层的响应,造成大量的无用数据包。
当广播域根本不需要隔离,甚至消灭了广播域的时候,对交换设备的压力就会减少很多。那个时候,设计成本可以接受、性能满足要求的交换层将成为可能。
当然,并不是要完全抛弃传统网络领域中种种优秀的技术和方法,不少精巧的思想都可以应用到数据中心场景,所谓万变不离其宗。但毫无疑问,非要绑定到 TCP/IP 的协议框架下,并不是一个合理的方案(或许也是个没办法下的方案),这必将带来更多的难题。
TCP/IP 在其发展过程中,已经经历过太多的风浪,不知道这次的挑战,它是否能再次安然度过。

Friday, January 09, 2015

Docker 使用 OpenvSwitch 网桥

Docker 默认使用的是 Linux 自带的网桥实现,实际上,OpenvSwitch 项目作为一个成熟的虚拟交换机实现,具备更丰富的功能。个人认为,将来 Docker 必然会支持 OpenvSwitch 作为其默认网桥实现。有兴趣的同学欢迎通过如下的步骤来尝鲜。

环境

在 Ubuntu 14.04 系统中进行测试。操作流程也适用于 RedHat/CentOS 系列系统,但少数命令和配置文件可能略有差异。

安装 Docker

安装最近版本的 Docker 并 启动服务。
$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker
$ sudo service docker start
此时,Docker 服务会创建一个默认的 docker0 网桥,作为连接容器的本地网桥,可以通过如下命令查看:
$ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.000000000000       no
网桥 docker0 内部接口的默认地址为 172.17.42.1。
$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

安装 OpenvSwitch

通过如下命令安装 OpenvSwitch。
$ sudo aptitude install openvswitch-switch
测试添加一个网桥 br0 并查看。
$ sudo ovs-vsctl add-br br0
$ sudo ovs-vsctl show
20d0b972-e323-4e3c-9e66-1d8bb57c7ff5
    Bridge ovs-br
        Port ovs-br
            Interface br0
                type: internal
    ovs_version: "2.0.2"

配置容器连接到 OpenvSwitch 网桥

目前 OpenvSwitch 网桥还不能直接支持挂载容器,需要手动在 OpenvSwitch 网桥上创建虚拟网口并挂载到容器中。

创建无网口容器

启动一个 ubuntu 容器,并指定不创建网络,后面我们手动添加网络。较新版本的 Docker 默认不允许在容器内修改网络配置,需要在 run 的时候指定参数 --privileged=true。
$ sudo docker run --net=none --privileged=true -it ubuntu:14.04 bash
root@298bbb17c244:/#
记住这里容器的 id 为 298bbb17c244。
此时在容器内查看网络信息,只能看到一个本地网卡 lo。
root@298bbb17c244:/# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

手动为容器添加网络

下载 OpenvSwitch 项目提供的支持 Docker 容器的辅助脚本 ovs-docker。
$ wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker
$ sudo chmod a+x ovs-docker
为容器添加网卡,并挂载到 br0 上,命令为
$ sudo ./ovs-docker add-port br0 eth0 298bbb17c244
添加成功后,在容器内查看网络信息,多了一个新添加的网卡 eth0,但是默认并没有 IP 地址。
root@298bbb17c244:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 7e:df:97:ac:1a:6a  
          inet6 addr: fe80::7cdf:97ff:feac:1a6a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3197 (3.1 KB)  TX bytes:508 (508.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
手动给它添加一个,例如 172.17.0.2/16,并查看。
root@298bbb17c244:/# ifconfig eth0 172.17.0.2/16
root@298bbb17c244:/# ifconfig 
eth0      Link encap:Ethernet  HWaddr ae:3d:75:2c:18:ba  
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::ac3d:75ff:fe2c:18ba/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:187 errors:0 dropped:2 overruns:0 frame:0
          TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:33840 (33.8 KB)  TX bytes:1170 (1.1 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
在容器外,配置 OpenvSwitch 的网桥 br0 内部接口地址为 172.17.42.2/16(只要与所挂载容器 IP 在同一个子网内即可)。
$ sudo ifconfig br0 172.17.42.2/16

测试连通

经过上面步骤,容器已经连接到了网桥 br0 上了,拓扑如下所示。
容器(172.17.0.2/16)<--> br0 网桥 <--> br0 内部端口(172.17.42.2/16)
此时,在容器内就可以测试是否连通到网桥 br0 上了。
root@298bbb17c244:/# ping 172.17.42.2
PING 172.17.42.2 (172.17.42.2) 56(84) bytes of data.
64 bytes from 172.17.42.2: icmp_seq=1 ttl=64 time=0.874 ms
64 bytes from 172.17.42.2: icmp_seq=2 ttl=64 time=0.079 ms
^C
--- 172.17.42.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.079/0.476/0.874/0.398 ms
在容器内也可以配置默认网关为 br0 接口地址。
root@298bbb17c244:/# route add default gw 172.17.42.2
另外,删除该接口的命令为
$ sudo. /ovs-docker del-port br0 eth0 <CONTAINER_ID>
实际上,Docker 社区也已经有讨论对 OpenvSwitch 的支持了。 在 Docker 原生支持 OpenvSwitch 之前,用户可以通过编写脚本或更高级的工具来让这一过程自动化。

参考:

  • OpenvSwitch https://github.com/openvswitch/ovs

Thursday, January 08, 2015

产品经理 vs PhD

优秀的产品经理,跟优秀的 PhD 一样稀少。
产品经理带团队做产品的过程,跟博士生带课题写论文的过程其实很像。
  • 产品经理是企业业务的最核心,PhD 是实验室科研项目的最中坚。
  • 产品调研市场状况和用户需求,写 PRD、BRD、MRD;科研课题要有分析应用前景和技术趋势,写立项申请。
  • 产品要有同类产品分析,写好研究报告;论文要做相关工作综述,写好背景知识。
  • 做产品前要定好 feature,根据资源定好范围;写论文前要设计创新点,根据篇幅安排内容。
  • 产品正式上线前要先做个预研 demo,最好能小规模用户试用下;课题成果发表前要设计实验原型验证,最好找个实际场景。
  • 做出产品是要想方设法卖出去,赢得市场;写好论文是要千方百计发表出去,最好是顶级的刊物。
  • 产品经理做产品不是一个人,要懂得带团队;博士生做课题也不能是一个人,也要带硕士生、本科生。
  • 产品经理要有大局观,不能局限在细枝末节;博士生要有技术广度,不能只懂一个很窄的领域。
  • 做产品经理要有成本和时间风险意识,越快速地迭代往往越有竞争力;博士生都知道会议是有 deadline 的,越早推出成果越有影响力。
当然,不是说优秀的博士就一定能成为优秀的产品经理,但只要你熬过数年的课题训练后还没变成书呆子,就拥有了很好的潜质。
当然,也不是说成功的产品经理去拿个博士学位就轻而易举。学术上的事,不光要努力,还要有足够的智慧和运气。