Xen和OpenVZ

于 2009-12-23 - Linux服务器/VPS - 永久链接

标签:openvzvpsxen

Xen和OpenVZ的简单比较,以及相关问题的处理方法。本文一部分来自hostingfu(非常好的一篇文章),也有些是自己零散的搜索到的。

Xen和OpenVZ简要介绍

Xen和OpenVZ都是开源软件。Xen是一个半虚拟化平台,看起来更像真正的独立主机。你可以安装自己的Linux内核、模块,并且对于内存等资源的虚拟更合理且是可以预测的。OpenVZ则是操作系统级虚拟化,所有虚拟机工作在同一个内核下,性能好。更详细介绍参见Wiki或者官方网站。

Xen

内存管理

Xen对于内存的计算和通常我们认识的一样,是一个程序真实使用了多少内存。比如,一个256MB的Xen VPS正如一个256MB的独立服务器,这些内存是仅为你保留的,同一台服务器上其他的VPS无法接触和使用。

当你使用的超出了内存的限制,VPS就会开始使用swap(交换空间)。一般VPS提供商都会提供提供是内存两倍的交换区,也就是说,对于256MB的Xen VPS,实际你有768MB内存可用。

这样看起来很好,但也有缺点:

  • 正如上面所说,Xen看起来更像一个独立主机,而内核、缓存都要占你的内存。不像OpenVZ,内核共用,Buffer等也不计算为你所用的内存,节省不少。
  • 交换空间毕竟不是真正的内存,性能当然不好

内存查看

查看Xen的VPS内存占用很简单,直接:

free -m

可以看到类似下面的结果:

                        total       used       free     shared    buffers     cached
Mem:               128         125          2          0         60         19
-/+ buffers/cache:          46         81
Swap:               255           0        255

其中-/+ buffers/cache这行:46表示已经使用了46MB内存,81表示还有81MB内存没有使用。

OpenVZ的内存管理

内存管理

和Xen有很大不同,OpenVZ对于内存的计算并不是程序实际使用了多少,而是其被分配(allocate)了多少。OpenVZ的资源使用情况可以查询这个文件/proc/user_beancounters。文件里的privvmpages指示分配的内存的大小。比如,当一个程序执行 malloc(),请求分配内存,则分配的内存大小就会记录进privvmpages,当privvmpages到达规定的上限,malloc()就会失败并返回值NULL,即拒绝分配内存。同时,与使用Swap的Xen不同,OpenVZ是Burstable Memory(一般同样是两倍)。

这种方式的缺点是:一般分配的内存总是大于实际使用的。比如有些程序默认会要求分配很大的内存,而实际仅使用一小部分。所以你会发现一个仅使用了很少内存的程序却让你的OpenVZ VPS迅速超限,或者安装程序时发现内存不够。(解决方法见后面)

这种方式也有其优点:你的磁盘缓存、页面Buffer都不计入使用的内存里,所以在没有超售的服务器上能获得很好的性能

内存查看

通过/proc/user_beancounters文件查看。官方wiki解释见这里。使用命令:

cat /proc/user_beancounters

结果示例如下:

Version: 2.5
       uid  resource           held    maxheld    barrier      limit    failcnt
       123: kmemsize         836919    1005343    2752512    2936012          0
            lockedpages           0          0         32         32          0
            privvmpages        4587       7289      49152      53575          0
            shmpages             39         39       8192       8192          0
            dummy                 0          0          0          0          0
            numproc              20         26         65         65          0
            physpages          2267       2399          0 2147483647          0
            vmguarpages           0          0       6144 2147483647          0
            oomguarpages       2267       2399       6144 2147483647          0
            numtcpsock            3          3         80         80          0
            numflock              3          4        100        110          0
            numpty                1          1         16         16          0
            numsiginfo            0          1        256        256          0
            tcpsndbuf             0          0     319488     524288          0
            tcprcvbuf             0          0     319488     524288          0
            othersockbuf       6684       7888     132096     336896          0
            dgramrcvbuf           0       8372     132096     132096          0
            numothersock          8         10         80         80          0
            dcachesize        87672      92168    1048576    1097728          0
            numfile             238        306       2048       2048          0
            dummy                 0          0          0          0          0
            dummy                 0          0          0          0          0
            dummy                 0          0          0          0          0
            numiptent            10         16        128        128          0

uid:辨别虚拟机的编号

横向:

  • held:当前使用状况
  • maxheld:最近结算期(last accounting period)的使用最大值。结算期通常是虚拟机的生存期(一般是VPS从启动到结束的时间)
  • barrier 和 limit:资源控制设置。对有些参数只有一个,有些两个都有
  • failcn:整个生存期内,拒绝分配资源的次数。

纵向:

  • kmemsize:内核使用的内存,不能进入swap
  • privvmpages:内存分配限制。单位是page,1page=4K。其表示的总共分配的内存大小,而不是实际使用的。
  • physpages:实际使用的内存大小。
  • vmguarpages:分配给虚拟机的内存大小,即Guaranteed RAM,单位也是page
  • oomguarpages:即Burstable RAM的情况,单位page。

减少OpenVZ的内存占用

如上所述,OpenVZ的内存计算的是分配的内存大小,这会带来很多问题。比如你要apt-get,结果无法分配内存。解决方法就是使用ulimit命令限制程序的内存分配。命令:

ulimit -s 256

这会将堆栈大小限制在256KB,如果你觉得不够,也可以略微扩大。

临时使用:先执行ulimit命令,再运行/启动相关程序,比如

ulimit -s 256
apt-get install XXX

针对某个程序使用:比如lighttpd,在/etc/init.d/lighttpd中添加ulimit命令,然后重启lighttpd服务(/etc/ini.d/lighttpd restart)

全系统应用:添加到/etc/init.d/rc

添加一个评论

HTML 代码以文本显示,网站地址会被自动转化。

他/她们讨论同一个话题

Trackback URL : http://www.easyboxlite.com/index.php?trackback/16

这篇文章的评论 feed

博客展示