Hosting Scene:$9.95 256MB Xen VPS

hostingscene

Hosting Scene 2003年12月创立,提供域名注册、图片设计、网页设计、网站托管、VPS 等一系列服务,24×7 技术支持,30天 Money Back 保障。Hosting Scene 的前身是 ProNetSpace.com,不确定什么理由换了名字。VPS 配置和价格如下:

20GB 硬盘
256MB Guaranteed RAM,256MB Swap
200GB 带宽
2 IPs
9.95美元

服务器和网络信息:

All our servers feature powerful Intel Quad Core processors and a minimum of 4GB high-performance memory. Hosting Scene operates out of two centrally located datacenters in the United States which provide Tier-1 connectivity and subscribes to all major telecom providers. Our servers are configured with complete redundancy for additional security, reliability, and worry free web hosting.

几种开源虚拟产品的性能比较

周末看了一篇 Virtualization of Linux servers,这篇论文测试了当前几个主要开源虚拟产品的性能,刚好配合前段时间看的几种不同虚拟技术的隔离性能。虚拟机的性能和隔离性都是虚拟技术非常重要的性能指标,大面积测试和比较不同的产品需要消耗大量的时间和精力,这篇文章在前人的基础上较全面测试了 Linux 下不同虚拟产品的性能,涉及到的有 KQEMU、KVM、Linux-VServer、OpenVZ、VirtualBox、Xen.

测试方法

整个测试在一台 IBM/Lenovo Desktop PC 上进行,这台 PC 配有 Intel Core 2 Duo 6300 处理器,4GB 内存和 80GB SATA 硬盘。服务器(host)操作系统是 Ubuntu 7.10,内核是 2.6.22-14,虚拟机(guest)操作系统是 Ubuntu 6.10. 网络部分的测试则通过另外一台 PC 来进行。使用的测试软件和参数如下:

Kernel Build
$ make defconfig
$ date +%s.%N && make && date +%s.%N
$ make clean

Dbench
$ /usr/local/bin/dbench -t 300 -D /var/tmp 100

Netperf
$ netserver # server side
$ netperf -H # client side

Rsync
Experiment 1:
$ date +%s.%N && rsync -av ::kernel /var/tmp && date +%s.%N # client side
# where ’kernel’ is the linux-2.6.22.14 file tree (294M)
$ rm -fr /var/tmp/*
Experiment 2:
$ date +%s.%N && rsync -av ::iso /var/tmp && date +%s.%N # client side
# where ’iso’ is ubuntu-6.06.1-server-i386.iso (433M)
$ rm -fr /var/tmp/*

Dd
Experiment 1:
$ dd if=/opt/iso/ubuntu-6.06.1-server-i386.iso of=/var/tmp/out.iso
$ rm -fr /var/tmp/*
Experiment 2:
$ dd if=/dev/zero of=/dev/null count=117187560 # 117187560 = 60G

Bzip2
$ cp /opt/ubuntu-6.06.1-server-i386.iso .
$ date +%s.%N && bzip2 -9 ubuntu-6.06.1-server-i386.iso && date +%s.%N
$ rm ubuntu-6.06.1-server-i386.iso.bz2

SysBench
$ mysql> create database sbtest;
$ sysbench –test=oltp –mysql-user=root –mysql-host=localhost –debug=off prepare
$ sysbench –test=oltp –mysql-user=root –mysql-host=localhost –debug=off run

测试结果

  • kernel build:内核编译是个长时间重负荷的 CPU 处理过程,期间还会涉及到多线程处理和小文件的读写操作。使用 OS-level 和 para-virtualization 技术的虚拟产品性能较好,接近 Linux.
  • dbench:是个文件系统测试工具,用来测试文件服务器的负载,Linux-VServer 在这项测试中大比分胜出,VirtualBox 则在这项测试中不明原因的 crash,其余产品的测试结果均比 Linux 低约30%.
  • netperf:是用来测试网络性能的工具,使用 TCP 包流来测试网络数据交换的性能。这项测试中基于 QEMU 的虚拟产品性能较差,VirtualBox 在这项测试中表现较好,可能和 VirtualBox 使用一个特别的网络驱动有关。
  • rsync:也是用来测试网络。OpenVZ 最好,KVM 最差,其余几个差不多。
  • dd:用来测试磁盘 I/O 的性能,不用涉及太多的 CPU. Xen 和 KVM 性能较好,OpenVZ 明显很慢。
  • bzip2:压缩也是个重负荷 CPU 的工作,但是不用磁盘频繁 IO 操作。除了 KQEMU 和 OpenVZ 外,其余几个虚拟机性能接近 Linux.
  • sysbench:数据库服务器测试。在这个测试中,Linux-VServer 和 Xen 性能接近 Linux,而 KVM 和 OpenVZ 性能只有他们的一半。
  • scale:在最后一项也是最考验虚拟技术的 scale 测试中(sysbench at scale),Xen 表现优异,其他几个虚拟产品在虚拟机数目达到32个的时候,性能大大降低,只有 Xen 能在扩大虚拟机数目的同时保持较好的性能损失。KVM 在8个虚拟机的时候表现最好,VirtualBox 在16个的时候表现最好,其余产品在虚拟机数目达到4个的时候表现最好。

sysbench-at-scale

总的来说,Xen 除了在 dbench 文件系统测试中有点落后外,在其余所有的测试中都表现不俗,尤其是在最后的 scale 测试中表现惊艳。

部署 Sun Ray 服务器的硬件配置要求

上个星期在 Linux 上配置和测试了 Sun Ray Server Software (SRSS 4.2) 的运行情况,这个星期准备开始部署 Sun Ray,周围对 Sun Ray 有经验的人不多,打电话给 SUN 的技术支持,SUN 的回答让 VPSee 考虑是不是要重新购买服务器。VPSee 的理念是最小化资源最大化性能,追求最高的性价比,标准的 performance guru,不能忍受巨型服务器只跑几个简单应用这种杀鸡用牛刀的做法:)VPSee 决定慢慢试,先用一台服务器部署20-40台 Sun Ray 瘦客户端,测试性能和 SRSS 对服务器硬件的要求,再逐步调整服务器硬件和增加服务器数量,慢慢扩大到能支撑100台左右 Sun Ray 瘦客户端同时访问。

在 sun-ray.org 的 wiki 上有一篇 Sizing,介绍了3个 Sun Ray 服务器部署的实际例子,其中有个使用的是 AMD Opteron/SUN X4100,和 VPSee 现在手头上的硬件类似,可以参考一下:

Number of Sun Rays: 150 (3 sites and 1 remote office)
Number of Sun Ray Servers: 8
Type of Servers: Dual core Opterons. x4100 (4 core)
Average Concurrency: 16 users per server
Average live sessions per CPU: 4 per core
Average memory per CPU core: 4GB
Applications: JDS, Mozilla, Firefox, Evolution, OpenOffice, Gaim, Gimp, Sun Ray Connector, Java based applications, browser based apps.

Rob’s Memory Based Sizing Guide 介绍了一种根据内存来确定服务器硬件配置的方法,在一个典型的桌面环境里,每个用户大约需要 256MB 内存,每 3GB 内存需要1颗 CPU Core. 所以,1个拥有 2 Dual Core (4 cores) 和 12GB 内存的 Sun X4100 可以应付约48个用户;1个 Dual CPU Quad Core (8 cores) 和 24GB 内存的服务器可以应付约96个用户。

根据 SUN 发布的 Sun Ray Technology Server Sizing Recommendations,对付 75-100 Unix Desktop 用户的服务器推荐配置如下:

Users CPU CPU Quantity CPU Cores CPU Frequency Memory
75-100 x86/x64 4-8 2 2.6-2.8GHz 16-32GB

将要部署的 Sun Ray 服务器主要为100个用户提供完整的桌面服务,用户登录后将能使用 GNOME 桌面环境、Firefox、运行 Java 程序、编译小程序、Email、OpenOffice、和其他桌面程序等,有了这个目标后再来看看对服务器设备的要求。综合上面的参考建议,每 4GB 内存分享1颗 CPU Core,每 256MB 内存分配给1个用户,操作系统本身和 Sun Ray Server/JDK 还需要至少 1GB 内存(相当于4个用户),所以首期部署的服务器配置有如下几个选择:

Users CPU CPU Quantity CPU Cores CPU Frequency Memory
12 x86/x64 1 1 2.6-2.8GHz 4GB
28 x86/x64 1 2 2.6-2.8GHz 8GB
60 x86/x64 1 4 2.6-2.8GHz 16GB

10TBvps:$10 128MB VPS

10tbvps

10TBvps,一家英国 VPS 提供商,是 Duplex Group 的一部分,域名查询显示 10tbvps.com 2008年9月才注册。不确定是 OpenVZ 还是 Xen,VPSee 猜测是 Xen,服务器硬件信息不详。现在正在 special 中,256MB 内存、35G 硬盘、250GB 流量的 VPS 只要10美元。平时不优惠的 VPS 配置和价格如下:

HyperVM 控制面板
10GB 硬盘
128MB Guaranteed RAM
250GB 带宽
10美元

网络信息:

10TBVPS operates a high quality network with Transit providers such as Level 3, XO Communications, Tiscali and many more along with private peering.

ServerDeals:$9.99 128MB OpenVZ VPS

serverdeals

ServerDeals 网站上找不到任何资料,whois 也被屏蔽了(尽管是一个 org 域名),做 hosting 又不是做 007,用不着这么神秘吧。ServerDeals 主要做的是 dedicated server 业务。对于这家 “神秘” 公司,不清楚数据中心在哪,不知道电话和 Email 地址,提交 ticket 估计是唯一的联系方式。现在 WHT 上正在打折,以下9.99美元只要3.99美元。VPS 配置如下:

自制控制面板
10GB 硬盘
128MB Guaranteed RAM,256MB Burst RAM
100GB 带宽
9.99美元

服务器信息:

Intel Core i5/i7 or dual Xeon based servers with 100mbps.

禁止 iPhone 连接 Wi-Fi 时弹出 Log In

iphone

今天升级 iPhone 出了一些问题,都说 iPhone 3.0 问题多多,所以 VPSee 耐心等到了 3.1 出来,没想到还是碰到了问题,而且问题很严重:不能正常用 Wi-Fi 上网。每次连接 Wi-Fi 或者打开 Safari 的时候都会自动打开一个 Log In 页面,然后这个 Log In 页面自动把网页导向 www.apple.com,如果这个时候 cancel,就会断了 Wi-Fi 的连接,导致上不了网;如果不 cancel,就一直停留在 apple 主页,不能切换网址,没有地址栏可以输入。上网查了一下,很多人都遇到这个问题,原因是 iPhone 3.0/3.1 引入了一个 log in overlay,本来 iPhone 做这个 log in overlay 是为了更方便的连接 Wi-Fi,现在居然成了一个麻烦,导致连接不上某些使用了 captive portal 的 WiFi 路由器,总是先自动启动一个页面连接 captive portal,这个 captive portal 老是连接 apple.com.

根据 Disable iPhone 3.0 Hotspot login on jailbroken iPhones 这篇文章介绍的方法,只要进入 iPhone 后修改 /etc/hosts 文件就可以了。所以只需要下载 PwnageTool_3.1 工具破解(jailbreak)手机,安装上 OpenSSH 服务器,用 ssh 登录到 iPhone 修改文件就可以了。

又遇到一个问题,iPhone 不能用 Wi-Fi 上网,又没有 ftp/ssh/telnet 服务器,如何安装 OpenSSH 服务器呢? VPSee 偶然发现在 iPhone 从 sleep 状态 wake up 后会弹出选择 WiFi 网络的对话框,选择一个网络后会启动 Safari, 然后大概过5秒钟左右的会启动那个烦人的 Log In 页面,所以趁着那难得的5秒抓紧时间在启动 Log In 页面前找到并下载 OpenSSH 就可以了,幸好页面有保存,5秒做不完的事下次 wakup 的时候可以再做5秒,就这样一点点下载安装 OpenSSH Server,那个累啊~~,后来才发现其实可以使用 3G 下载,用不着这么累:(

OpenSSH 装好后就好办了,Mac 直接 ssh 到 iPhone,root 默认密码为 alpine,iPhone 上还没装 vi,连 nano 都没有怎么编辑 /etc/hosts 呢?幸好要修改的东西不复杂,用 echo 在文件末尾增加一行就可以了:

# ssh root@iphone-ip-address

# echo "0.0.0.0 www.apple.com" >> /etc/hosts

修改 Minix 内核的进程调度

the minix book

国外很多大学把这本经典 Minix 书:Operating Systems Design and Implementation, 3/E 作为操作系统课程的教科书或者参考教材。这本书写的非常易懂,除了操作系统的理论基础而且还搭上 Minix 的源代码讲解,是学习操作系统和系统编程的绝好材料。Linus Torvalds 就是看了这本书写出了 Linux,并和这本书的作者、操作系统大牛 Andrew S. Tanenbaum 教授有段关于操作系统设计(微内核还是单内核)的著名争论:Tanenbaum–Torvalds debate.

软件的基础是操作系统,操作系统的核心是内核,内核的核心是进程调度和内存管理,所以 hack 内核的进程调度会是一件有趣的事情。VPSee 最近在温习那本牛书,收获很大,平时看书都看得明白,真正到了动手做的时候又是另外一回事,所以读万卷书、行万里路是有道理的。那本牛书的第107页讲到了 lottery scheduling,VPSee 决定把原来的 Minix 进程调度改成 lottery 算法调度 (lottery scheduling),当作是看书后的练习,有很多大学也把这个练习作为操作系统的课程设计,比如:UCSB 的 Project 1: User Shell and Lottery Scheduling. 关于 lottery 算法这里不做介绍了,网上一大把,这里只谈代码实现,修改代码分成下面几个部分,分别涉及到:proc.h, proc.c, do_fork.c, main.c 这几个文件,这里的代码是在2007年写的,基于Minix 3.1.1,其他版本的 Minix 可能不能运行。

代码

首先在进程数据结构里定义一个 tickets 变量:

struct proc {
  struct stackframe_s p_reg;	/* process' registers saved in stack frame */

  struct proc *p_nextready;	/* pointer to next ready process */
  struct proc *p_caller_q;	/* head of list of procs wishing to send */
  struct proc *p_q_link;		/* link to next proc wishing to send */
  message *p_messbuf; 	/* pointer to passed message buffer */
  proc_nr_t p_getfrom; 		/* from whom does process want to receive? */
  proc_nr_t p_sendto;		/* to whom does process want to send? */

  sigset_t p_pending; 		/* bit map for pending kernel signals */

  char p_name[P_NAME_LEN]; 	/* name of the process, including \0 */

  int p_tickets; 		/* tickets of the process */

#if DEBUG_SCHED_CHECK
  int p_ready, p_found;
#endif
};

在系统进程表里给系统进程初始化 tickets,tickets 大小范围在1到100之间:

PUBLIC void main()
{
...
for (rp = BEG_PROC_ADDR, i = -NR_TASKS; rp < END_PROC_ADDR; ++rp, ++i) {
        rp->p_rts_flags = SLOT_FREE;		/* initialize free slot */
        rp->p_nr = i;				/* proc number from ptr */
        (pproc_addr + NR_TASKS)[i] = rp;	/* proc ptr from number */

        if (i == -4)
                rp->p_tickets = 1;
        else
                rp->p_tickets = 100 + rand()%11;
 }

除了上面的系统进程外,给每个 fork 出来的用户进程初始化 tickets,tickets 大小范围在100到105之间,这样重新调度的机会比系统进程要小一些,系统进程是100到110之间:

PUBLIC int do_fork(m_ptr)
register message *m_ptr;        /* pointer to request message */
{
  /* Parent and child have to share the quantum that the forked process had,
   * so that queued processes do not have to wait longer because of the fork.
   * If the time left is odd, the child gets an extra tick.
   */
  rpc->p_ticks_left = (rpc->p_ticks_left + 1) / 2;
  rpp->p_ticks_left =  rpp->p_ticks_left / 2;

  rpc->p_ticket = 1 + rand()% 5;

  /* If the parent is a privileged process, take away the privileges from the
   * child process and inhibit it from running by setting the NO_PRIV flag.
}

接下来就是 lottery 核心算法和进程调度部分,用 lottery 算法选一个进程出来运行:

PRIVATE void pick_lot_proc()
{
  register struct proc *rp;                     /* process to run */
  register struct proc *prev_rp = NIL_PROC;
  int q;                                        /* iterate over queues */
  int sum = 0, lottery = 0;

  for (q = 0; q < NR_SCHED_QUEUES; q++) {
      rp = rdy_head[q];
      while (rp != NIL_PROC) {
          sum += rp->p_ticket;
          rp = rp->p_nextready;
      }
  }
  lottery = 1 + rand() % sum;
  sum = 0;
  for (q = 0; q < NR_SCHED_QUEUES; q++) {
      rp = rdy_head[q];
      while (rp != NIL_PROC) {
          sum += rp->p_ticket;
          if (sum >= lottery)
              goto next;
          prev_rp = rp;
          rp = rp->p_nextready;
      }
  }

  next:
  next_ptr = rp;		/* pick up rp as the next running process */
  if (priv(rp)->s_flags & BILLABLE)
      bill_ptr = rp; 
  return;
}

编译 Minix 内核:

# cd /usr/src/tools
# make hdboot
# make services

重启 Minix,如果正常运行的话,启动速度应该比以前要慢。如果系统启动不了,或者报错、kernel panic 等,可以在启动时候选择 “2 Start small Minix 3″,使用另外一个没有被破坏的 kernel image 启动系统进行 debug.

VPSSquad:$7.5 128MB OpenVZ VPS

vpssquad

VPS Squad 一家德国的 VPS,whois 显示2009年8月底才注册,是一家很新很新的 VPS 服务商。(很新很新通常意味着 “不推荐”),好像和一家澳大利亚的 VPS,AMH Network 有联系,不知道是不是一个人办的,在德国和澳大利亚租用服务器提供服务,没有自己的硬件设备。VPS 配置如下:

服务器在 Netdirekt Frankfurt, Lambdanet Munich, Germany
自制控制面板
10GB 硬盘
128MB Guaranteed RAM,256MB Burst RAM
100GB 带宽
7.5美元

服务器信息:

Intel Core2Quad Servers.

UBHosting:$9.99 128MB OpenVZ VPS

ubhosting

UB Hosting 是一家加拿大公司,2004年成立,拥有自己的硬件设备,租用Teleglobe 的数据中心。技术支持服务还不错,邮件都能及时回复,WHT 上也有人抱怨 ubhosting 服务不好、downtime 太多、邮件服务太慢,实际得到的与广告不符等。个别客户在网上的抱怨和评价可以拿来参考,也不要太当真,除非有大量负面消息。这家公司给的流量不多,可能是加拿大的网络流量要比美国贵一些吧。VPS 配置如下:

服务器在 Toronto, Montreal, CA
HyperVM 控制面板
15GB 硬盘
128MB Guaranteed RAM,256MB Burst RAM
50GB 带宽
9.99美元

服务器信息:

Dual Xeon Quad Core Servers.

几种不同虚拟技术的隔离性能

周末看了一篇 paper:Quantifying the Performance Isolation Properties of Virtualization Systems,这篇论文测试了几种不同虚拟技术的隔离性能,隔离性是虚拟机性能的重要指标,尤其是对商业 hosting,如 VPS、VDS 等来说,虚拟机能否把各个 VPS 合理的隔开并让物理机器上的每个 VPS 能按照事先约好的定义(如 CPU/RAM/DISK 等)公平而且充分的利用物理服务器资源很重要。这篇论文测试了目前市场上使用最普遍的几种虚拟技术以及相关代表产品,有代表 full virtualization 技术的 VMWare Workstation,代表 para virtualization 技术的 Xen,代表 operating system level virtualization 技术的 OpenVZ 和 Solaris Containers,提出的问题就是看看这些不同的虚拟技术和产品能不能、以及能在多大程度上隔离和保护每个物理机器上的虚拟机,比如能否保护好每个 VPS,能有效为不同 VPS 用户分割资源,不让 “不良” 用户超过计算额度、过分抢占其他用户的资源。

测试方法

这篇论文描述的实验方法是,首先确定一些 baseline 数据,然后做 stress 测试。

  1. 把1台物理机器分成4个虚拟机,每个虚拟机上运行1个 apache web server + SPECweb 2005 组合来得到 baseline 数据。
  2. 然后做 stress 测试,同样是上面的1台物理机器和4个虚拟机,也同样在运行1个 apache web server + SPECweb 2005 组合,只不过这个时候在其中1台虚拟机上增加了 stress test,来测试这个 stress 加上去以后是否对原有的虚拟机有影响、有多大影响。这样测试结果就可以和前面4台虚拟机没有 stress 测试的数据做比较。

主要测试了以下一些性能参数,以及测试每种参数用到的方法:

  • CPU Intensive:让虚拟机不停的做整数计算操作;
  • Fork Bomb:不停的 fork 进程;
  • Memory Intensive:不停的分配、使用内存,而不 free 掉内存空间;
  • Disk Intensive:用 IOzone 工具,开10个线程,每个线程不停的进行交替读写操作(iozone -i0 -i1 -r 4 -s 100M -t 10 -Rb);
  • Network Intensive (Transmit):开4个线程,每个线程不停的发送 60K 大小的 UDP 包;
  • Network Intensive (Receive):开4个线程,每个线程不停的接受 60K 大小的 UDP 包。

测试结果

测试结果如下图所示,0代表结果最好,DNR(Do Not Response) 代表最差。测试结果和理论上预料的一致,Full virtualization 技术能完全模拟一台计算机,不需要修改 guest 操作系统就可以直接在其上运行,由于其技术的优越性隔离性能最好;para virtualization 需要修改 guest 才能运行,隔离效果其次;最后是 operating system level virtualization,在操作系统层面虚拟,不能运行不同的操作系统,隔离不彻底,其隔离性能也最差。同一虚拟技术的不同产品,如 OpenVZ 和 Solaris Containers 也表现出了差异。

the performance isolation of virtualization systems

VPSee 只对 Xen 和 OpenVZ 有兴趣,这里省略了 Solaris Containers 的测试数据和图片,大家如有兴趣可参考原文。