Xen和OpenVZ的简单比较,以及相关问题的处理方法。本文一部分来自hostingfu(非常好的一篇文章),也有些是自己零散的搜索到的。
Xen和OpenVZ
于 2009-12-23 - Linux服务器/VPS - 永久链接
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
他/她们讨论同一个话题
Trackback URL : http://www.easyboxlite.com/index.php?trackback/16

最新评论