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

WebKeepers:$6.95 Virtuozzo VPS

webkeepers

WebKeepers 是 Webk.net 的一个分支,主要做基于 Virtuozzo 的 VPS. whois 域名显示 webkeepers.com 域名是2001年注册的,但是 WebKeeper 的 about us 页面上声称从1997年就开始进入 hosting 行业。VPSee 今天下午偶尔发现 webkeepers.com 不能访问,一个连自己网站都不稳定的 VPS 服务商,很让人怀疑其技术和服务质量。VPS 配置如下:

服务器在 San Jose CA
自制控制面板
10GB 硬盘
256MB Guaranteed RAM,256MB Burstable RAM
500GB 带宽
附带1个 Plesk License
6.95美元

在 Ubuntu 上安装和配置 Xen

服务器硬盘已经升级了,还在等内存,内存是和硬盘一起订的货不知道怎么还没到,终于发现前天 RAID 0 的测试结果为什么不正常,因为有个硬盘有问题,昏~新买的刚拆包装的硬盘居然就有问题。现在大多数 SUN 服务器上只有 2GB-8GB 的内存,升级后应该达到 8GB-32GB,这样就可以给每个 Xen 虚拟机更多的内存了。我们有一些操作系统还是32位的,现在也必须升级到64位以应付大内存的到来。今天在一台 Sun Fire X2200 M2 上最小化安装64位的 Ubuntu,升级更新后开始安装和配置 Xen. 下面的安装步骤和配置过程基于 Ubuntu 9.04 Server 版本,CentOS 版本可以参看:在 CentOS 上安装和配置 Xen,Debian 版本可以参看:在 Debian 上安装和配置 Xen,OpenSolaris 版本参看:在 OpenSolaris 上安装和配置 Xen,NetBSD 版本参看:在 NetBSD 上安装和配置 Xen.

安装 Xen

安装支持 Xen 的相关工具:

$ sudo apt-get install ubuntu-xen-server

下载和安装支持 Xen 的 Linux 内核:

http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-modules-2.6.26-2-xen-amd64_2.6.26-17lenny2_amd64.deb
http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-image-2.6.26-2-xen-amd64_2.6.26-17lenny2_amd64.deb

$ sudo dpkg -i linux-modules-2.6.26-2-xen-amd64_2.6.26-17lenny2_amd64.deb 
$ sudo dpkg -i linux-image-2.6.26-2-xen-amd64_2.6.26-17lenny2_amd64.deb

安装成功后,检查 Xen 内核是否已经装好:

$ sudo vi /boot/grub/menu.lst

...
title       Xen 3.3 / Ubuntu 9.04, kernel 2.6.26-2-xen-amd64
root        (hd0,0)
kernel      /xen-3.3.gz
module      /vmlinuz-2.6.26-2-xen-amd64 root=/dev/mapper/nvidia_igcjceec3 ro console=tty0
module      /initrd.img-2.6.26-2-xen-amd64
...

重启系统后检查一下是否是 Xen 的内核以及 Xen 是否启动:

$ uname -r
2.6.26-2-xen-amd64

$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1879     2     r-----      6.6

创建和安装 guest

如果把正在运行的 Xen 内核的操作系统看成 host 的话,那么运行在 host 上面的操作系统就可以看成 guest。先建一个目录用来存放所有的 guest 操作系统的 image,vm01.img,vm02.img,等等,1个 guest 对应1个 image. 使用 xen-create-image 后会在 /vm 下生成以 hostname 命名的目录,这个目录下会有 vm01.vpsee.com/disk.img,vm01.vpsee.com/swap.img 两个镜像文件。

$ sudo mkdir /vm

$ sudo xen-create-image --hostname=vm01.vpsee.com \
--ip=172.16.39.101 --gateway=172.16.38.1 --netmask=255.255.254.0  \
--dist=feisty --mirror=http://archive.ubuntu.com/ubuntu --size=10gb \
--memory=512mb --swap=512mb --arch=amd64 --dir=/vm \
--boot --passwd --role udev --dir=/etc/xen --force

可以根据需要调整 /etc/xen-tools/xen-tools.conf

进入 guest

安装成功后就可以登录 guest 了,

$ sudo xm console vm01

如果要退出 guest 的话,用 Ctrl + ],就会回到 host。

如果想每次启动 host 时自动启动 guest 的话:

$ sudo ln -s /etc/xen/vm01 /etc/xen/auto

更懒的办法

如果觉得安装 guest 操作系统太麻烦,可以到 http://stacklet.com/ 下载一个已经装好的镜像文件,调整 Xen guest 的配置文件,然后在 host 下启动 guest 镜像就可以了。

$ wget http://stacklet.com/sites/default/files/ubuntu/
ubuntu.9-04.x86-64.20090514.img.tar.bz2

$ tar jxvf ubuntu.9-04.x86-64.20090514.img.tar.bz2
$ sudo mv ubuntu.9-04.x86-64.xen3.pygrub.cfg /etc/xen/ubuntu.9-04.cfg
$ sudo vi /etc/xen/ubuntu.9-04.cfg
$ sudo mv ubuntu.9-04.x86-64.img /vm/ubuntu.9-04.img

$ sudo xm create -f ubuntu.9-04.cfg
Using config file "/etc/xen/ubuntu.9-04.cfg".
Error: Device 2049 (vbd) could not be connected. Failed to find an unused loop device

$ sudo vi /etc/modules
loop max_loop=64

$ sudo xm list
$ sudo xm console ubuntu.9-04

从 http://stacklet.com/ 下载的镜像文件的初始用户名和密码为:root/password

增加 swap

如何给 guest 系统(domU)增加 swap,这里有介绍。