SunRay/Sun VDI 和 JavaOne

在今年的 JavaOne 大会上,Sun 为7000多个参会者部署了 SunRay 瘦客户端,每个参会者可以通过150台 SunRay 登录 OpenSolaris 2009.06/Ubuntu 8.10/Windows 7 RC 三种不同的操作系统,Sun 通过 Sun VDI 和 VirtualBox 为用户提供了约21000个虚拟桌面。参会者在注册的时候会领到一张 Smart Card,通过这张卡可以在任意一台 SunRay 上登录自己的桌面系统。

sunray users

VDI 架构

这次 JavaOne 提供了150个 SunRay,设计目标是让400-500个桌面同时运行。大会使用了以下一些服务器和架构:

  • 4台 VDI 服务器,每台配置为 Sun Fire X4450/4 CPUs/64GB RAM;
  • 5台 VirtualBox 服务器,每台配置为 Sun Fire X4450/4 CPUs/6 cores per CPU/64 GB RAM,每台服务器可以应付100个虚拟桌面;
  • 3台存储服务器,每台配置为 Sun Storage 7210 Unified Storage System/2 Opteron CPUs/4 cores per CPU/64GB RAM/48X250GB 3.5 SATA HDD,每台服务器其实可以应付1000个虚拟桌面,但是考虑到很多参会用户来了就启动一个虚拟操作系统查查 Email,然后就关闭虚拟系统走人,这种频繁启动/关闭系统的行为会造成大量 IO,所以用了3台存储服务器来分担负载。

sun vdi architecture

只有2个管理员

21000个虚拟桌面系统 + 12台服务器 + 150台 SunRay,只有2个系统管理员!VPSee 深有体会,现在我们部署了60台 SunRay + 2台服务器后实际只有0.1个系统管理员在管理(相当于一个星期只用半天),比起 PC + Windows 的方案要省钱省力绿色得多。

only 2 system administrators

BurstNET:$5.95 512MB OpenVZ VPS

burstnet

BurstNET 目前托管着3000多台服务器和200000多个域名,从96年开始 Internet 相关业务,算是一家老牌的 Internet 服务提供商,拥有自己的服务器、网络等设备和1000多平米的数据中心,很多小的 VPS 服务商都是他家的 reseller,比如:InternetVPSHost Lambda 等。连这种重量级 hosting 服务商都推出廉价 VPS 产品线与中小 VPS 服务商抢生意,看来现在经济不景气啊。VPSee 推荐 BurstNET 的产品。他们家还有一款 1GB RAM 的 VPS 也在10美元以下,VPS 配置如下:

服务器在 Scranton, PA
vePortal 控制面板
20GB 硬盘/50GB
512MB Guaranteed RAM/1GB
1000GB 带宽
2个 IP
DDOS 保护,CISCO™ GUARD
5.95美元/9.95美元

CpanelHost:$10 512MB OpenVZ VPS

cpanelhost

CpanelHost 网站上没有给太多有用的信息,估计是刚建不久,whois 查询显示域名是在今年8月份注册的。根据 WHT 的广告信息,目前这款 VPS 正在优惠中,每个月只要5美刀。他们家 VPS 还提供 FreeBSD 系统,可是他们也提到他们用的是 OpenVZ,不知道 FreeBSD 是不是运行在 VMware 上的。VPS 配置如下:

服务器在 Scranton, PA
vePortal 控制面板
20GB 硬盘
512MB Guaranteed RAM
1000GB 带宽
2个 IP
10美元

GitHub 的 Rails/Git 架构

GitHub 上个月宣布把所有服务器转移到 Rackspace,他们原先在 Engine Yard 使用的是云计算和虚拟机 10 VMs/39 VCPUs/54GB RAM,移到 Rackspace 后使用的物理服务器配置为 16 Servers/128 Cores/288GB RAM. GitHub 在最近的一篇博客:How We Made GitHub Fast 中分享了他们的架构和经验。

Load Balancer

GitHub 使用了一对 Xen 虚拟机(lb1a 和 lb1b)做 load balancer,运行的是 ldirectord.

前端服务器

Load balancer 把请求发给4台前端服务器中的1台,每台服务器配置为 8 cores/16GB RAM,运行 Nginx,前端(frontend)服务器分别命名 fe1, …, fe4. 在 Nginx 接受到连接请求后转发给 Unix domain socket,并由 16个 Unicorn worker 进程进行处理,其中的某个 worker 会取得请求后开始运行 rails 代码。每个前端服务器还运行4个 ProxyMachine instances,由 HAProxy 来路由。

数据库服务器

MySQL 数据库运行在2台 8 cores/32GB RAM/15000 RPM SAS drivers 的服务器上,命名为 db1a 和 db1b. 其中一台做 Master,另一台做 slave,MySQL 由 DRBD 来做 replication. GitHub 还在数据库服务器上运行 Redis 来保存一些信息。

文件服务器

目前有4对文件服务器,每台配置为 8 core/16GB RAM /6× 300GB 15000 RPM SAS drives/RAID 10,命名为 fs1a, fs1b, …, fs4a, fs4b. 任何时候每对服务器里面都有一台是 active 的,另一台在一旁等候,随时准备接手。每对服务器的数据同步也是通过 DRBD 来实现的。每个文件服务器还运行2个 Ernie RPC 服务,由 HAProxy 来路由,每个 Ernie 运行 15个 ruby works 来响应 RPC 调用。

Memcache 服务器

上面每对文件服务器里面都有1个 master (active) 和1个 slave,多数时候 slave 都很空闲,所以 GitHub 巧妙的利用了这些空闲资源,在每台 slave 文件服务器上拿出 12GB RAM 做分布式 memcache 服务器,服务器别名为 memcache1, …, memcache4.

Connextnet:$5.95 256MB OpenVZ VPS

connextnet

Connextnet 网站上宣称 “we aim to provide a high quality American hosting service.”,但是 whois 显示域名注册人在澳大利亚,今年3月才注册,不知道他说的 ”American hosting service“ 是什么意思,域名注册的是个人,典型的 one man 业务。Connextnet 的 VPS 能提供 99.9% uptime 的保证,如果达不到的话下一个月免费使用。VPS 配置如下:

服务器在 San Jose, California
SolusVM 控制面板
20GB 硬盘
256MB Guaranteed RAM,512MB Burstable RAM
100GB 带宽
5.95美元

服务器配置和数据中心信息:

They’re all based on Dual Intel Quad Core Xeons (8 cores) with a minimum of 16GB RAM in the San Jose, California in Silicon Valley Telecom & Internet Exchange.

Google 数据中心和服务器的一些信息

Google 工程师 Jeff Dean 在刚过去的 LADIS 2009 Workshop 上做了一个 keynote talk:Designs, Lessons and Advice from Building Large Distributed Systems,并且透露了 Google 正在进行一个叫做 “Spanner” 的计划,设计目标是能扩展到1000万台服务器。Google 按照 Servers -> Racks -> Clusters -> Data centers 这样的顺序把服务器从机柜扩展到多个数据中心。VPSee 最近在部署 SunRay 和虚拟化,需要采购更多的服务器,基本选定就 SUN 了,因为有买一台送一台的优惠,剩下的问题就是每台服务器配置多大的处理器、内存和硬盘能充分发挥服务器的能力,达到最佳性价比,这篇 pdf 提到了每台 Google 服务器的配置,CNET 的这篇报道还提供了 Google 服务器的照片。

Google 服务器:

The Google server was 3.5 inches thick–2U, or 2 rack units, in data center parlance. It had two processors, two hard drives, and eight memory slots mounted on a motherboard built by Gigabyte. Google uses x86 processors from both AMD and Intel.

google server

有意思的是 Google 服务器用到了电池,原因是比 UPS 要便宜的多:

“This is much cheaper than huge centralized UPS,” he said. “Therefore no wasted capacity.”

google server

Server: DRAM: 16GB, 100ns, 20GB/s, Disk: 2TB, 10ms, 200MB/s
Rack (80 servers): DRAM: 1TB, 300us, 100MB/s, Disk: 160TB, 11ms, 100MB/s
Clusters (30+ racks): DRAM: 30TB, 500us, 10MB/s, Disk: 4.80PB, 12ms, 10MB/s

一些经验和数据:

1-5% of your disk drives will die
Servers will crash at least twice (2-4% failure rate)

一些每个人都应该知道的数据:

L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns
Mutex lock/unlock 25 ns
Main memory reference 100 ns
Compress 1K bytes with Zippy 3,000 ns
Send 2K bytes over 1 Gbps network 20,000 ns
Read 1 MB sequentially from memory 250,000 ns
Round trip within same datacenter 500,000 ns
Disk seek 10,000,000 ns
Read 1 MB sequentially from disk 20,000,000 ns
Send packet CA->Netherlands->CA 150,000,000 ns

一个新 cluster 通常第一年会发生的事情:

~0.5 overheating (power down most machines in <5 mins, ~1-2 days to recover) ~1 PDU failure (~500-1000 machines suddenly disappear, ~6 hours to come back) ~1 rack-move (plenty of warning, ~500-1000 machines powered down, ~6 hours) ~1 network rewiring (rolling ~5% of machines down over 2-day span) ~20 rack failures (40-80 machines instantly disappear, 1-6 hours to get back) ~5 racks go wonky (40-80 machines see 50% packetloss) ~8 network maintenances (4 might cause ~30-minute random connectivity losses) ~12 router reloads (takes out DNS and external vips for a couple minutes) ~3 router failures (have to immediately pull traffic for an hour) ~dozens of minor 30-second blips for dns ~1000 individual machine failures ~thousands of hard drive failures slow disks, bad memory, misconfigured machines, flaky machines, etc.

Dynaceron:$10 128MB OpenVZ VPS

dynaceron

Dynaceron 是一家加拿大公司,在美国和加拿大都有注册,公司 CTO 去年才开始上大学二年级,但是 Dynaceron 声称自己有5年的 hosting 从业经验,难道 CTO 高中时代就开始玩 hosting 了,不过也有可能,谁叫他们没有 “高考”。Dynaceron LLC 今年1月份创立,whois 显示 dynaceron 域名是2007年注册的。公司网站刚刚改版,还有一些页面没有内容,甚至连 order 按钮点上去都没有反应。他们家的 VPS 还有一款是 64MB/5美元,价格一般,不过送3个 IP。VPS 配置如下:

SolusVM 控制面板
15GB 硬盘/7.5GB
128MB Memory/64MB
125GB 带宽/75GB
2个 IP/3个 IP
10美元/5美元

服务器配置:

Intel Quad Core CPU

给 Minix 内核的进程消息计数

the minix book

Minix 是个有别于 Linux 单内核的微内核操作系统,系统各个模块之间采用发消息的方式互相通信。在这本经典操作系统书:Operating Systems Design and Implementation, 3/E 的第219页有个练习题:

44. Add code to the MINIX 3 kernel to keep track of the number of messages sent from process (or task) i to process (or task) j. Print this matrix when the F4 key is hit.

这个练习题要比修改 Minix 内核的进程调度简单多了,只需要:

  1. 为每个进程初始化一个计数器;
  2. 在每次进程发消息的时候计数;
  3. 找到 Minix 在什么地方触发 F4 键,并把每个进程的计数器打印出来就可以了。

代码

在 proc.h 的 proc 进程数据结构里定义一个计数器 p_mess[NR_TASKS + NR_PROCS]:

struct proc {
...
  unsigned long p_mess[NR_TASKS + NR_PROCS];
};

在 main.c 的 main 里初始化计数器:

for (j = 0; j < NR_TASKS + NR_PROCS; j++) rp->p_mess[j] = 0;

在 proc.c 的 sys_call 里计数:

switch(function) {
  case SENDREC:
      /* A flag is set so that notifications cannot interrupt SENDREC. */
      priv(caller_ptr)->s_flags |= SENDREC_BUSY;
      /* fall through */
  case SEND:
      result = mini_send(caller_ptr, src_dst, m_ptr, flags);
      if (function == SEND || result != OK) {
          break;                                /* done, or SEND failed */
      }                                         /* fall through for SENDREC */
      if (result == OK)
          rp->p_mess[NR_TASKS+src_dst]++;
  case RECEIVE:
      if (function == RECEIVE)
          priv(caller_ptr)->s_flags &= ~SENDREC_BUSY;
      result = mini_receive(caller_ptr, src_dst, m_ptr, flags);
      break;
  case NOTIFY:
      result = mini_notify(caller_ptr, src_dst);
      break;
  case ECHO:
      CopyMess(caller_ptr->p_nr, caller_ptr, m_ptr, caller_ptr, m_ptr);
      result = OK;
      break;
  default:
      result = EBADCALL;                        /* illegal system call */
}

最后按 F4 打印出来,修改 dmp_kernel.c 的 privileges_dmp:

  printf("\n---- message track table dump ----\n\n");
  printf("-nr-             ", proc_nr(rp));
  for (rp = oldrp; rp < oldrp+10; rp++) {
        printf("[%2d]  ", proc_nr(rp));
  }
  printf("\n");
  /*for (rp = oldrp; rp < END_PROC_ADDR; rp++) {*/
  for (rp = oldrp; rp < oldrp+10; rp++) {
      if (isemptyp(rp)) continue;
          printf("\n[%2d]  %-7.7s  ", proc_nr(rp), rp->p_name);
          for (i = 0; i < 10; i++) {
              printf(" %4lu ", rp->p_mess[i]);
              rp->p_mess[i] = 0;
        }
  }

编译内核和服务,并重新用新内核启动:

# cd /usr/src/tools
# make clean
# make hdboot; make services
# reboot

注意:如果修改了 proc.h 文件,一定要 make clean 以后再 make hdboot; make services 编译内核和服务以后才能正常启动,如果没有修改 proc.h 只修改了 .c 文件可以只 make hdboot.

SunRay 在 GDM 里直接启动 VirtualBox

virtualbox

最近一直在折腾的 SunRay 已经测试和部署完毕,第一批40台 SunRay 客户端已经从 Solaris 服务器切换到 Linux,用户运行正常,服务器负载也较低,性能还不错,按照部署 Sun Ray 服务器的硬件配置要求,只用了一台 SunFire X2200 M2 就搞定了,配置是 AMD Opteron Quad Core 2.7GHz,8GB RAM,等前段时间订购的内存到了以后就升到 16GB.

如果 SunRay 用户想用 Windows 怎么办?有两种方法,一种是进入 Linux 桌面后用 RDP 远程访问 Windows Terminal Server 服务器;还有一种就是做个 Windows 虚拟机,SunRay 用户登录后进入自己的 Windows 虚拟机,这就是接下来要做的 VDI(Virtual Desktop Infrastructure)服务,只要 SunRay 用户打开 SunRay 瘦客户端后,就出现一个操作系统选择界面,选定一个操作系统后就可以登录进自己的想要的虚拟机。现在的问题是 Sun VDI 只支持 Solaris,而且不是免费的,其他支持 SunRay 的 VDI 产品还有 VMware VDI,VMware 虽然开源了客户端 VMware View Client,但是 VMware View(include VMware VDI)不免费。既然没有免费可用的 VDI,VPSee 就决定用其他的方法来模拟 VDI 的效果,无非就是登录 GDM 的时候提供一个可选的操作系统菜单、选择相应的虚拟系统登录嘛。

1、在 GDM 的 Select Session 上增加一个登录选项,注意 /usr/bin/startxp 脚本现在还没有,需要在后面创建。

# vi /usr/share/xsessions/xp.desktop

[Desktop Entry]
Encoding=UTF-8
Name=Windows XP
Comment=My Virtual Windows XP
Exec=/usr/bin/startxp
Icon=
Type=Application

2、下载和安装 VirtualBox,并设置哪个用户可以运行 VirtualBox.

# yum groupinstall "Development Tools"
# yum install kernel-devel

# rpm -ivh VirtualBox-3.0.8_53138_rhel5-1.x86_64.rpm
# /usr/sbin/usermod -a -G vboxusers yourusername

3、在 VirtualBox 上创建一个叫做 myxp 的虚拟机并安装 Windows XP.

4、创建 /usr/bin/startxp 脚本

# vi /usr/bin/startxp

#!/bin/bash
VirtualBox -startvm myxp

$ chmod 755 startxp

5、在 SunRay 上 Log out 后重新登录,在 Select Session 选项里选择 Windows XP 后就登录到虚拟机上了,shutdown 虚拟机后就又回到 GDM 登录界面。按照同样的方法,可以创建 Ubuntu/OpenSolaris 等多个其他操作系统,只要 VirtualBox 支持就行。

select windows xp session

也可以用这种方法在启动 GDM 的时候用 RDP/VNC/NX 等工具连接到远程虚拟机或者远程桌面,比如:

# vi /usr/bin/startrdp

#!/bin/bash
rdesktop 172.16.39.1

$ chmod 755 startrdp

如果想用 VMware 的话,也可以把 VirtualBox 换成 VMware Player,当然 Windows XP 要重新安装在 VMware 上。

vmplayer -X "/home/vpsee/.vmware/Windows XP/Windows XP.vmx"

Xen 调整 NTFS 虚拟硬盘大小

前几天 VPSee 升级了服务器的硬盘,现在有了更多的空间可以分给虚拟机用户,就算给每个人分 100GB 都不是问题,问题是每个人 100GB 会给服务器备份工作带来很大压力,所以决定在原来每个人 20GB Windows 虚拟机的基础上扩展到 40GB. 以前介绍了如何调整 Xen 虚拟硬盘大小,不过只针对 guest 操作系统是 Linux、文件系统使用 ext2/ext3 的情况,如果 guest 操作系统运行的是 Windows、文件系统是 NTFS 该怎么办呢?

关闭 Windows 虚拟机:

#/usr/sbin/xm shutdown vm01

给虚拟机镜像文件(.img)追加 20GB 空间:

# dd if=/dev/zero bs=1G count=20 >> /vm/vm01.img

现在新的虚拟机 image 多了 20GB 额外空间,不过分区表没有变,所以这个时候需要一个分区软件修改分区表,把新增加的空间加到分区表。不过在使用分区工具前需要把 image 挂到一个 loop 设备上:

# /sbin/losetup -f
/dev/loop2
# /sbin/losetup /dev/loop2 /vm/vm01.img

安装 gparted 分区软件,然后修改分区表:

# yum install gparted
# gparted /dev/loop2

这个时候会看到如下图所示的分区结构,注意这个时候直接修改 /dev/loop2p1 分区大小会报错,所以这个时候可以直接在 unallocated 上面新建一个 unformatted 分区。

gparted

分区完后卸载 loop 设备:

# losetup -d /dev/loop2

启动 Windows 虚拟机:

# /usr/sbin/xm create vm01

进入 Windows 后在磁盘管理里面可以看到未格式化的分区,接下来就可以格式化并使用这个分区了,也可以使用其他的分区工具把新建的分区和老分区合成一个区或者分成多个区。