原文请见:How to Tell Your Xen VPS is Overselling Memory无纯洁纯手工翻译,苹果树下无情转载。
话说博主一直不相信不能超售的鬼话

好吧,我们都知道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硬盘,以及超大的流量。价格也很低廉。所以我登陆以后开始察看到底我也多少内存……

# 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已用内存,事实上,我只有很少的进程。

我发现这个在进程文件系统中的文件:

# 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可以超售内存。

好吧,就是这样。其实,任何一种架构都可以超售。 VPS一定要选择好的优质的商家,这里面的猫腻太多了。当然,现在内存的价格其实并不高,反倒是CPU、IO被超售得比较严重。