英文原文
转载翻译自:”无纯洁部落

好吧,我们都知道OpenVZ架构的VPS通常会超售内存、硬盘和流量。超售内存和硬盘对OpenVZ来说是一件很简单的事。即使实在内存和硬盘都不充足的情况下,你只需要执行vzctl create就可以创建一个小鸡,够简单吧。当然如果你过度超售(2B超售)的话很可能会引起客户的不满。
正是因为这种过度超售,人们对OpenVZ的印象并不太好。与Xen对比时,人们常常会说“OpenVZ可以轻易超售,而Xen架构的VPS拥有独立的内存”云云。事实上,那并不正确。
2周前,我购买了Asheville NC提供的一款廉价VPS,Xen架构,Ubuntu 10.04 64位,Linux 2.6.32内核,512M内存,25G硬盘,以及超大的流量。价格也很低廉。所以我登陆以后开始察看到底我有多少内存……

1
2
3
4
5
# free
             total       used       free     shared    buffers     cached
Mem:        543776     535360       8416          0      66516     130504
-/+ buffers/cache:     338340     205436
Swap:      1048568        136    1048432

呃,居然已经使用了330M内存,让我们看看有多少正在运行的程序。

1
2
3
4
5
6
7
8
9
10
# ps aux
...
 
root       204  0.0  0.1  17028   780 ?        S    Oct27   0:00 upstart-udev-bridge --daemon
102        356  0.0  0.1  23548  1080 ?        Ss   Oct27   0:00 dbus-daemon --system --fork
root       431  0.0  0.1  21068   788 ?        Ss   Oct27   0:00 cron
root      3110  0.0  0.5 253832  2992 ?        Sl   Oct28   0:00 /usr/sbin/console-kit-daemon --no-daemon
root     11037  0.0  0.1  49256  1012 ?        Ss   Oct28   0:00 /usr/sbin/sshd
root     15427  0.0  0.1  12520   772 ?        S    Oct28   0:00 /usr/sbin/syslogd --no-forward
root     31231  0.0  0.0  16748   436 ?        S

这就是了并没有运行一些占用内存比较多的程序,只有SSH,syslogd,cron,差不多了。但是这330M内存到底去了什么地方?
在深入挖掘之前,先告诉大家一件事。你差不多可以将它认为是Xen架构超售内存,其实早在几年前就已经很有名了,虽然绝大多数提供IDC不愿提起。这项技术被称为ballooning。(也被称为balloon)
一个称为balloon的驱动会被安装在你的系统上。当母鸡需要更多内存的时候,需要小鸡们贡献一点内存,它就会让balloon占用的内存迅速变大——向Linux内核申请更多的内存。内核会分配它所请求的内存,并且这一部分占用内存并不会使用swap。当balloon获得这些内存以后,就会传递给母鸡,以便用在其它地方,比方说创建新的VPS。这一过程中,你并不会发觉你的VPS内存总量的减少,但已用内存会快速增加,这一块其实是被balloon拿走了,也许是在另一台VPS上。一个内核级进程xenballoond(其实只是一个bash脚本)甚至可以用来搞动态调节,虽然我在我的VPS上并没有发现。
我猜这可以解释为什么会有330M已用内存,事实上,我只有很少的进程。
我发现这个在进程文件系统(procfs)中的文件:

1
2
3
4
5
6
7
8
# cat /proc/xen/balloon
Current allocation:   524288 kB
Requested target:     524288 kB
Minimum target:       173056 kB
Maximum target:       532480 kB
Low-mem balloon:        8192 kB
High-mem balloon:          0 kB
Driver pages:            224 kB

我并没能找到一些可靠的文档来解释上述几个数字各代表什么。感觉我的VPS共请求512M内存(Requested target),并且已经分配(Current allocation)。然而,还有一项Minimum target,大概是指VPS保留的最小内存,防止balloon占用太多,居然被设置成169M。难道这才是我那台VPS保证的内存?我们不熟悉的东西太多,容易被IDC忽悠。结论很显然,Xen可以超售内存

ps.正准备入月付30刀的budgetvm的或者是月付41刀的photons,但是photons给的流量多cpu少,希望budgetvm不超售…