Showing posts with label hacks. Show all posts
Showing posts with label hacks. Show all posts

Friday, May 14, 2010

并行计算框架 ParallelPython

如何在有限的硬件条件下,使程序耗时更少,或者处理数据量更大?

这个问题在进入多核时代以来,似乎多了一种解决途径,那就是充分利用多处理器(核)来并行的完成计算任务.

这里的多处理环境可以是指一台拥有多核处理器甚至多颗处理器的服务器,也可以是指一个拥有多节点的计算机群。


针对开篇提出的那个问题,解决办法其实都是"分而治之"。从数据分割入手,我们可以得到类似MapReduce的解决方案,类似的Python实现也有不少;从程序角度去看,目前主要是以下几种途径:
  • 大规模并行处理系统(MPP,Figure 1)
  • 对称多处理(SMP,Figure 2)
  • 分布式计算(集群/网格计算,Figure 3)



 Figure 1 MPP
Figure 2 SMP
 
 Figure 3 Cluster

本文主要介绍的ParallelPython(简称pp)框架可以有效支持SMP和集群方式进行并行计算。

根据官方介绍,pp提供了在SMP(多CPU或多核)和集群(通过网络连接的多台计算机)上并行执行Python代码的机制,具有以下特性:
  • 在SMP和集群上并行执行Python代码
  • 易于理解和实现的基于工作的并行机制,便于把穿行应用转换成并行的
  • 自动构造最佳配置(默认时工作进程数量等同于系统处理器数量)
  • 动态处理器分配(允许运行时改变工作处理器数量)
  • 函数的工作缓存(透明的缓存机制确保后续调用降低负载)
  • 动态负载均衡(任务被动态的分配到各个处理器上)
  • 基于SHA的连接加密认证
  • 跨平台移植(Windows/Linux/Unix)
和传统的线程模型不同的是,thread和threading模块无法在字节码一级实现并行。因为Python解释器使用GIL(全局解释器锁)来在内部禁止并行执行。这个GIL限制你在SMP机器上同一时间也 只能执行一条字节码指令。而pp在内部使用进程和进程间通信来组织并行计算。并隐藏了所有内部的细节和复杂性,应用程序只需要提交工作任务并取回结果就可以了。

代码说话:
import pp
nodes = ('10.0.0.1',)
jober = pp.Server(ppservers=nodes)
f = jober.submit(func,args,depfunc,module)

submit函数接受worker具体执行的函数func,参数args以及func内部调用的函数depfunc和涉及到的模块module

相应的节点机器上执行:
./ppservers.py

不过节点机器上可能会报错"Socket connection is broken".解决办法如下:

class Close(Exception):
    pass

def send(self, data):
        bufsz = self.bufsz
        t_size = len(data)
        size = struct.pack('!Q', t_size)
        p_size = self.socket.send(size)
        if p_size == 0:
            raise Close('end connection')

        s_size = 0L
        while s_size < t_size:
            nd_sz = min(bufsz, t_size - s_size)
            p_size = self.socket.send(data[s_size:s_size+nd_sz])
            if p_size == 0:
                raise Close('end connection')
            s_size += p_size

Wednesday, November 11, 2009

通过Shell Script解决Subversion分支与主干合并

最近公司内部推行了基于Subversion的开发流程规范.程序员在开发功能模块的时候,基本在各自的trunk活动,当完成单元测试后,方可提交至生产版本库.这样一来就涉及到版本合并的问题.

使用Windows的朋友自然不觉得这是一个多麻烦的事情,毕竟有"小乌龟"嘛.可是,作为拥护Unix&Shell以及崇尚"DRY"原则,还不时热爱捣鼓点新鲜玩意儿的本博来说:岂有不用shell实现的道理;)

#!/bin/bash
export trunk_dir=/root/dp-trunk/
export release_dir=/root/dp-release/dp-0.1.0/

trunk=`svn up $trunk_dir|grep revision|awk -F' ' '{ print $3 }'|awk -F'.' '{print $1}'`
release=`svn info $release_dir | grep "Last Changed Rev"|awk -F: '{print $2}'`

info=`svn merge -r $release:$trunk $trunk_dir $release_dir && svn ci -m '' $release_dir`
echo $info

Thursday, November 5, 2009

Perl实现Subversion更新守护进程

和前一篇使用Subverison同步多台服务器代码类似,前者主要解决Subversion向服务器同步完全相同的环境代码,但是当不同的服务器需要的程序并不一样的时候,前者就很捉襟见肘了.于是,这里给出一个Perl的Deamon实现

#!/usr/bin/perl
exit if fork();
while(1) {system("svn up /root/192.168.8.192");sleep(5)};

Wednesday, November 4, 2009

使用Subverison同步多台服务器代码

在实际生产中,一套分布式的程序可能需要被部署在很多环境相同的服务器上.如何实现程序的自动部署不仅可以降低因版本冲突而导致的服务异常,也可以未将来的持续集成做基础准备.

这里采用的代码版本控制程序为Subversion,由中央版本库向多台服务器同步代码的方法有很多,基本上都是通过使用hook(post-commit)来实现的.

这里记录下我的post-commit:

use Net::SSH::Expect;


#此处添本代码仓库需要同步的服务器组
my @cluster = ('192.168.1.191',
               '192.168.1.190',
               '192.168.1.193'
              );


foreach $svr (@cluster) {
   my $ssh = Net::SSH::Expect->new(
   host =$svr,
   password ='xxx',
   user ='xxx',
   raw_pty =1
   );
   my $logins = $ssh->login();
   my $command = $ssh->exec('svn up /path');
   $ssh->close();
}

Monday, October 26, 2009

Shell脚本收集

清除当前目录下所有emacs的临时文件
  • find . -iname '*~' | xargs rm -f
添加 当前目录下所有未进入版本库的文件
  • svn st| tr '^\?' ' ' | xargs svn add

实战虚拟化技术之Xen

Xen是由剑桥大学开发的VMM.这里简要记录下安装过程中的几个问题:
使用egrep '(vmx|svm)' /proc/cpuinfo 检测处理器是否支持虚拟化.
如果不支持的话那么很遗憾,只能使用全虚拟化.
接下来,按照手册的说明文件:
make world
make install
然后修改grub的引导,使xen支持的内核可以启动,重启服务器.下面就可以体验xen了

Thursday, October 22, 2009

实战虚拟化技术之VMware Server

在虚拟化技术方案中,最耳熟能详的莫过于VMware的产品了.其桌面端VMware Workstation让很多人体验了虚拟机的快感.在服务器虚拟化领域,它的对应产品就是VMware Server.
本文主要描述了我在虚拟化方案技术选型中对Vmware Server考察的过程.

测试环境
  •  Machine :Dell PowerEdge R200 Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz
  •  HostOS: CentOS 4.5
  •  Kernel: Linux2.6.9-89.0.11.EL
  •  Memory:2GB
  •  Software:Vmware Server 2.0.1
从Vmware官方下载二进制安装包,执行vmware-install.pl.根据提示输入你的实际参数,一般情况下直接默认就可以了.安装的最后会提示你是否运行vmware-config.pl.你可以选择yes,接下来如果遇到内核模块支持错误提示的话,可以放狗去搜对应内核模块的vmware-patch.我使用的CentOS4.5倒是没有这个问题.

一切完毕之后,就从浏览器输入服务器ip:8333进入VMware Infrastructure Web Acess,你会发现这和workstation版本几乎没有什么区别.接着就是新建虚拟机了:

 .
我配置的虚拟机参数Memory 256MB;Core 1;HDD 8G,由于使用场景的不同,我很关注I/O效率.所以特意做了一些实验,结果如下:

avg-cpu:  %user   %nice    %sys %iowait   %idle
           0.00    0.00    2.00   25.00   73.00
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          0.00  86.00  0.00 37.00    0.00 32800.00     0.00 16400.00   886.49     6.08  566.00   6.89  25.50
dm-0         0.00   0.00  0.00 88.00    0.00  704.00     0.00   352.00     8.00   703.14 27351.68   2.89  25.40
dm-1         0.00   0.00  0.00  0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

总体来看.Vmware Server门槛较低,交互界面相对统一;对服务器几乎没有硬性要求.部署方便容易,磁盘镜像可复用.
对于测试型场景来说,性能完全可以满足需求.

Monday, October 19, 2009

linux下使用vpn的方法

公司的开发服务器使用VPN连接,在Windows下面直接使用ppoe就可以了,但是在Liunx下面并不一样.这里将我的配置过程记录一下.

由于我所使用的环境是Fedora,所涉及到的软件这里全部采用yum方式安装.
首先需要保证系统上安装pptp的相关软件:

#yum install NetworkManager-pptp

这样你就可以在Gnome Network Manager里面去添加VPN连接了,注意选择PPTP:



下面进行连接配置:
  • Connection Name:随便填写,方便自己即可
  • Gateway: vpn连接的ip或者域名
  • User Name:用户名
  • Password:连接的密码


在Apply之前,点击Advanced,勾选Use Point-to-Point encryption(MPPE),然后OK



到这里,你可以尝试下选择NetworkManager里面的VPN Connection,如果连接成功的话,那么恭喜了;如果失败的话,没关系,我们继续:
很有可能你的VPN连接默认会使用EAP来做认证,但在NetworkManager不能 disable EAP的认证,需要使用gconf-edit才行,在你的终端中输入gconf-editor.

#gconf-editor
然后选择system->networking->connetions,找到子项有vpn连接的数字,在右边新建key,内容如下:


最后,连接到你的vpn服务器吧.