[置顶] Linux Cgroups 详解(合集)

摘要: 随着云计算的不断升温,与之相关的虚拟化技术也受到越来越多的人的关注。以LXC、OpenVZ等为代表的容器虚拟化技术也开始走入人们的视野。之前我写过一个Linux Cgroups详解系列,以其源代码为出发点,比较详细地介绍了Linux Cgroups。作为Linux 内核的一个重要子系统,Linux Cgroups应用也越来越广泛。在微博上,不断看到有公司开始采用LXC或者Cgroups技术,而且取得了很好的效果。为了方便博友们阅读,我把之前写的Linux Cgroups系列的原始合集版本分享给大家。这篇文档是我2012年4、5月份的时候写的,到现在Cgroups系统可能又有了变化,如有不同,请 阅读全文
posted @ 2013-01-14 21:39 lisperl 阅读(7104) 评论(5) 推荐(5) 编辑
2013年4月29日

一个行压缩图的简单实现

摘要: 首先简单说一下什么是行压缩图,其实严格意义上应该是行压缩矩阵。正常情况下,矩阵是用二维数组简单存储的,但是如果是稀疏矩阵,也就是零很多的时候,这样比较浪费空间。所以就有各种节省空间的存储方式,三元组存储就是其中一种。什么是三元组呢?一个三元组就是(row,col,value),这样把所有不为零的值组成一个向量。这种存储方式比二维数组节省了不少空间,当然还可以进一步节省,因为三元组里面row或者col重复存储了,一行或者一列存一次就行了,按这种思路走下去就是行压缩存储了。那具体什么是行压缩存储呢?行压缩存储的思想就是,把所有不为零的值按行访问的顺序组成一个向量,然后再把每一行值不为0的列的下标存 阅读全文
posted @ 2013-04-29 21:33 lisperl 阅读(2152) 评论(0) 推荐(1) 编辑
2012年11月17日

一种高效的矩阵乘法实现

摘要: 如何计算矩阵乘法,这个大家都知道。通常情况下,我们都是用以下代码实现的:for(i=0;i<n;++i) for(j=0;j<n;++j){ sum=0; for(k=0;k<n;++k) sum+=A[i][k]*B[k][j]; C[i][j]+=sum;}但是考虑了高速缓存的问题后,其实有一种更好的实现方式:for(i=0;i<n;++i) for(k=0;k<n;++k){ r=A[i][k]; for(j=0;j<n;++j) C[i][j]+=r*B[k][... 阅读全文
posted @ 2012-11-17 12:49 lisperl 阅读(5711) 评论(3) 推荐(6) 编辑
2012年11月15日

C语言循环优化二三事(二)

摘要: 在前一篇博客里,我们提出了三种常见的循环优化的方法,主要包括:减少不必要的计算,减少不必要的函数调用,减少不必要的内存访问。这三种方法跟特定的机器的特性无关,具有很强的通用性。今天,我们本着榨干机器最后一滴性能的原则,再进一步提出几种跟指令执行有关系的优化方法。一.循环展开循环展开可以减少循环的次数,对程序的性能带了两方面的提高。一是减少了对循环没有直接贡献的计算,比如循环计数变量的计算,分支跳转指令的执行等。二是提供了进一步利用机器特性进行的优化的机会。例子:优化前的代码见前一篇博客里的sum3.优化后:void sum4(vec_ptr v,data_t *dest){int i;int 阅读全文
posted @ 2012-11-15 16:12 lisperl 阅读(8708) 评论(2) 推荐(4) 编辑
2012年11月14日

C语言循环优化二三事(一)

摘要: 一.代码移动将在循环里面多次计算,但是结果不会改变的计算,移到循环外面去。例子:优化前:void lower1(char *s){int i;for(i=0;i<strlen(s);++i) if(s[i]>='A'&&s[i]<='Z') s[i]-=('A'-'a');}优化后:void lower2(char *s){int i;int len=strlen(s);for(int i=0;i<len;++i) if(s[i]>='A'&&s[i]& 阅读全文
posted @ 2012-11-14 18:38 lisperl 阅读(7392) 评论(10) 推荐(5) 编辑
2012年10月29日

C语言随机数小结

摘要: C语言中可以使用rand()函数来生成一个从0到RAND_MAX的uniform分布。基于这个函数,我们可以构造出一些特定的随机数生成器来满足我们的需求。(一)0到1的uniform分布://generate a random number in the range of [0,1]double uniform_zero_to_one(){ return (double)rand()/RAND_MAX;}(二)任意实数区间的uniform分布://generate a random real number in [start,end]double uniform_real(double ... 阅读全文
posted @ 2012-10-29 13:51 lisperl 阅读(5822) 评论(7) 推荐(2) 编辑
2012年7月24日

Cgroups在云计算中的应用

摘要: 云计算是目前计算机业界热门的方向,Cgroups作为一种有效的资源管理方案在云计算中得到越来越大的应用。下面简要介绍一下Cgroups在云计算中一些应用,欢迎补充。 首先,我们看一下Cgroups的娘家Google(Cgroups最早是Google工程师提出的)。在推出PaaS产品GAE几年后,Google终于推出了自己的IaaS的产品Google Compute Engine,跟Amazon进行全面的竞争。跟Amazon EC2采用Xen虚拟机不同的是,GCE采用的KVM虚拟机。KVM虚拟机是一种将Linux 内核当成Hypervisor的虚拟化技术,一个KVM虚拟机作为一个进程运行在Li. 阅读全文
posted @ 2012-07-24 19:16 lisperl 阅读(3392) 评论(1) 推荐(1) 编辑
2012年6月28日

java执行带重定向或管道的shell命令的问题

摘要: 以前没用过java执行shell命令,以为也是像C那样便捷,用个system函数就可以搞定。今天一用才发现不是那么回事。java里面执行shell命令有两种方法:1.使用ProcessBuilderProcessBuilder pb=new ProcessBuilder(cmd);pb.start();2.使用RuntimeRuntime.getRuntime().exec(cmd)但是这个两种方法都有个问题,执行诸如:ps -ef | grep -v grep 带有管道或重定向的命令就会出错。我们都知道使用以上两种方法执行命令时,如果带有参数就要把命令分割成数组或者List传入,不然会被当成 阅读全文
posted @ 2012-06-28 17:52 lisperl 阅读(11060) 评论(0) 推荐(3) 编辑

利用shell脚本监控LXC应用容器内的应用

摘要: 利用lxc-execute启动应用容器后,可以利用lxc自带的lxc-info获取容器的状态,lxc-monitor监控容器状态的变化,但是不能获取容器内应用的信息。这点可以通过结合Linux ps命令和lxc自带的lxc-ps和lxc-cgroup命令来实现。1.首先我们可以通过lxc-ps获取特定容器内需要监控的应用的pid号#usage:get_pid container_name app_namefunction get_pid{ local pid=`lxc-ps -n $1 |grep $2 | awk '{print $2}'|grep -v PID` echo 阅读全文
posted @ 2012-06-28 10:53 lisperl 阅读(3056) 评论(0) 推荐(1) 编辑
2012年6月20日

如何解除LXC容器和应用生命周期之间的耦合

摘要: 使用LXC应用容器时,容器的生命周期和应用是耦合在一起的。即:Lxc-execute-nfoobar此时用容器foo启动了一个应用bar,在容器启动时,应用就启动了。Lxc-stop-nfoo此时停止了容器foo,根据lxc的规则,容器的应用也就停止了。 通过以上两个例子可以看出应用和容器是紧耦合在一起的,要生一起生,要死一起死。可能有很多人会不明白LXC怎么会有这么蛋疼的规定。其实深入了解一下LXC的实现就清楚了,LXC是基于cgroups实现的,LXC的应用容器并不是一个真正意义上完整的系统,只是一个进程组,然后系统以这个进程组进行资源和安全管理。因此,进程在,容器才在,不能只有容器... 阅读全文
posted @ 2012-06-20 17:17 lisperl 阅读(2590) 评论(0) 推荐(0) 编辑
2012年6月15日

LXC(Linux Containers)的不足和改进

摘要: 在之前的博文中(参见Linux Cgroups详解系列),作者对LXC 的实现做了分析,这里再例举一下LXC 的一些不足和作者个人的一些改进意见。(一) 缺少对磁盘配额(disk quota)的支持LXC 依赖于Linux Cgroups 实现资源管理的功能,而Cgroups 并没有相应的子系统来提供限制磁盘空间的功能。对于服务器整合而言,限制磁盘空间是个很有用的功能,可以限制单一应用占有过多的磁盘空间,从而导致其他应用失败。LXC 现在的解决办法是在创建容器的时候利用LVM 创建一个LVM 分区来限制容器可使用的磁盘空间。这个办法依赖于LVM,用户在使用LXC 时需要做额外的工具。最好的解决 阅读全文
posted @ 2012-06-15 18:26 lisperl 阅读(7454) 评论(5) 推荐(0) 编辑
2012年5月21日

Java获取URL链接的文件类型

摘要: 在写网络爬虫的时候,需要根据链接来获取文件类型,将内容正确存储。之前我都是根据链接的后缀来判断的,比如:http://img12.360buyimg.com/da/20120330/88_31_ZySDre.jpg这个链接指向的文件就是个jpg文件。但是后来发现有诸如http://jprice.360buyimg.com/getSkuPriceImgService.action?skuId=1850001109&origin=1&webSite=1&type=1的链接,这招就不灵了。后来谷歌百度了一下也没发现解决办法。后来机缘巧合在Java Network Progra 阅读全文
posted @ 2012-05-21 10:12 lisperl 阅读(14014) 评论(6) 推荐(4) 编辑
2012年5月7日

Solaris Containers 简介

摘要: Solaris Containers是Solaris平台上的一种基于容器的虚拟化技术。Solaris容器的正式定义是使用资源管理功能的Solaris区域(Solaris Zones)。因此,Solaris Containers的实现包括两部分:Solaris Zones和System Resource Controls。Solaris Zones是作为一个服务器整合解决方案出现的。服务器整合允许在一台服务器上部署多个应用负载,可以提高服务器使用率,降低成本。Solaris Zones将一个系统划分为一个global zone和多个non-global zone,系统管理员通过global zo 阅读全文
posted @ 2012-05-07 14:32 lisperl 阅读(2420) 评论(0) 推荐(2) 编辑

FreeBSD Jails 简介

摘要: FreeBSD Jails是FreeBSD平台上的一种基于容器的虚拟化技术,是对Unix传统的chroot机制的一种扩展。Unix传统的安全模型高效简单,适用于很多应用场景。但是它是基于系统只有没有管理权限的普通用户和有管理权限的根用户这两类用户的情况设计的,它无法很好地处理把一部分管理权限授权给不被信任的用户的情况。Unix后来引入了chroot机制,提供了一种简单的系统隔离功能,但是仅限于文件系统,进程和网络空间都没得到相应的处理。FreeBSD Jails正是在这种情况下出现的,它提供了一种很强的隔离能力,将chroot等已有的机制进行了扩展,可以为进程提供一个虚拟运行环境。[4]在Fr 阅读全文
posted @ 2012-05-07 10:45 lisperl 阅读(6897) 评论(0) 推荐(3) 编辑
2012年5月3日

Linux Namespaces机制——实现

摘要: 由于Linux内核提供了PID,IPC,NS等多个Namespace,一个进程可能属于多个Namespace。为了task_struct的精简,内核引入了structnsproxy来统一管理进程所属的Namespace,在task_struct中只需存一个指向structnsproxy的指针就行了。structnsproxy定义如下:structnsproxy{atomic_tcount;structuts_namespace*uts_ns;structipc_namespace*ipc_ns;structmnt_namespace*mnt_ns;structpid_namespace*pid 阅读全文
posted @ 2012-05-03 14:40 lisperl 阅读(11786) 评论(1) 推荐(4) 编辑