存档

  • 大数据量系统

    这半个月一直在忙,忙着改程序,做实验,原来的系统的处理能力是10^4/10^5,我现在需要处理的数据量是10^6/10^7。原来正常的程序却出现了各种各样的异常,最明显的问题有两个,一个是OutOfMemory,一个是Connection Reset。
    前一个问题有很多种不同的解决方法,就是增加机器的物理内存,调优jvm的启动参数,如果这些都解决不了问题,那就是程序本身的问题。我遇到的最多的就是BufferedReader溢出、ArrayList的不正确使用。这些问题都解决了还是会发现莫明其妙的溢出的话,还是增加物理内存吧。jvm虽然有垃圾收集机制,但是如果程序设计的初衷就没有为大数据量的数据考虑过的话,内存消耗真是件杯具而且及其不好解决在问题,特别是在code base有10^5级别的时候。
    后一个问题,目前我还没有找到好的解决办法,目前能想到的,就是增加发送和接收缓存,平滑发送的速率,可是16*16的链接还是会莫明其妙的断掉。
    郁闷了!还是需要再接再厉,外围的方案解决不了问题的话,只能去动核心的代码了。身边也没有有经验的人可以请教,我自己现在倒是对大数据量、巨数据量系统的可伸缩性和性能有了很强的兴趣。

    431 次查看 | 4 条评论
    2010年2月5日 | 归档于 Java, 技术
  • CentOS配置vsftpd遇到550错误的解决办法

    安装vsftpd很简单:yum install vsftpd
    启动vsftpd也很简单:service vsftpd start
    默认情况下用root是无法连接的,你可以创建一个非root帐户登录,但是登录是可以登录,却没有办法创建或是上传文件。有人说,可以把SELinux关掉,可是这样未免也有点尺度太大了,其实是SELinux里的设置问题,只要修改相应的配置就可以了。
    发现问题的方法:
    # getsebool -a | grep ftp allow_ftpd_anon_write –> off allow_ftpd_full_access –> off allow_ftpd_use_cifs –> off allow_ftpd_use_nfs –> off ftp_home_dir –> off httpd_enable_ftp_server –> off [...]

    152 次查看 | 没有评论
    2010年1月27日 | 归档于 Linux, 技术, 软件
  • Refactor

    为什么要重构?我不知道教科书是或是别人都会怎么讲,但是重构对我来说,基本上就是把一个糟糕的设计重新写一遍。那么,什么是我定义的两糟糕的设计?又怎么样来重写,并且期望能够达到一个怎么样的目的才算是一个好的重构呢?
    糟糕的设计:

    因为时间紧,任务重,没有进行设计,基本上是随心所欲的写出来的代码;

    充斥着“if…else…”,打了无数的补丁,新增功能的时候,就得多增加判断条件;

    代码变得越来越复杂,相同的代码出现在了不同的地方,修改一处,必须时刻记着也要修改别的地方

    那怎么样来重写呢?完全抛弃以前的代码么?

    完全抛弃以前的代码:之前的代码写得实在是太糟糕,没有任何可取之处。而且没有办法使用一些重构工具一进行梳理。我自己没有遇到过这种情况。每一小段代码还不至于写得面目全非,这应该算是代价相对较重的一种重构方法,与其说是重构,不如说是重新写。

    使用之前的代码:之前的代码,小的部分还是可以使用的,将它们独立出来,形成单独的模块,并使用一定的模块调用机制(如使用事件机制、插件系统)等,来调合各个不同的模块之间进行谐调工作。

    我希望能达到一个几样的效果呢?

    简单的说,我比较追求系统的可扩展性(scalability & extensibility)、可维护性、较高的系统性能。

    scalability是期望在一个较大的数据集前,系统也可以有一个比较好的表现;

    extensibility是期望系统能够容易的增减功能;

    可维护性是期望系统在需要做出修改的时候,可以更加方便;

    较高的系统性能,这个就不必说了,谁都希望自己的程序跑得更快。

    有些时候,做重构并不是一个简单的决定,因为你要做出更多的工作,还不一定能搞出一个可用的系统来,但是,有风险的事情,做成功了会收获很大的好处,大部分时间,我还是咬咬牙会去选择重构代码。
    ==eof==
    这篇文章也发表在AgilePHP上,快去看看,Refactor

    135 次查看 | 没有评论
    2010年1月24日 | 归档于 技术, 软件
  • Python and RRD

    RRD是Round Robin Database的意思,RRDTool是用来管理RRD的一个工具。RRDTool的主页在这里,Wikipedia的页面在这里。RRD其实就是一个时序数据库,使用一个固定大小的环型buffer,适用于存储一些统计性的信息,如CPU负载呀,气温变化呀。我为什么要说这个东西呢,因为XenServer里的性能统计是用的RRD,你可以访问诸如http://xenserver-host/rrd_updates?cf=AVERAGE&interval=5&start=123131321形式的网址来获取统计信息。XenServer将返回一个XML文件,这个XML文件其实就是用rrdtool里的export工具导出的。
    好,下载完成了这个文件以后,我们假设文件名是data.xml,你可以使用rrdtool restore data.xml data.rrd的方式将数据重新恢复成rrd的格式,然后就可以使用rrdtool进行一系列操作。rrdtool的操作可以写十篇博客,这不是我今天想说的重点。
    我今天想说的是,当我把rrdtool跟Python集成的时候,发现Python提供了若干封装的工具,比如Python-PyRRD,Python-rrd,Python-rrdtool,我想没几个人能搞明白这几者之间的关系吧。我来说一下。
    Python-rrdtool,这个就是rrdtool的一个Python封装,调用方式与rrdtool里命令的格式是一致的。
    Python-rrd,这个据说应该是rrdtool的前身,命名方式不符合Python的命名策略,所以改名成了Python-rrdtool,但是debian和ubuntu的源里还保留了一个过渡性质的傀儡包(transitional dummy package),其实就是Python-rrdtool
    Python-PyRRD,这个是OO化的rrdtool封装,个人比较推荐用这个包,方便,代码也更容易让人理解。
    另外,Java也提供了两个rrdtool的封装,一个是JRobin,一个是rrd4j,后者是在前者的基础上做的,提供了更好的OO的支持和性能。但是这两个项目似乎更新得很慢,XenServer导出的rrd数据(version 0003)他们现在不支持(只支持到version 0001)。所以想用Java分析XenServer的性能,还是自己去解析那个xml文件吧。

    239 次查看 | 3 条评论
    2010年1月8日 | 归档于 Java, Linux, Python, Unix, 技术, 数据库
  • Xen Cloud Platform

    Xen Cloud Platform现在发布的版本是0.1,其实他的功能与XenServer 5.5的基本功能是几乎一样的。不过XenServer 5.5可以通过XenCenter来管理,XCP只有一个丑陋的Web界面。我没有深入的hack进去,也许存在某种方法,可以使用XenCenter来管理XCP,那样即可以使用一个开源的服务端版本,同时管理工具又很人性化。由于我的切入点是XCP,官方又混淆了许多XCP与XenServer的文档,所以开始配置的时候相当郁闷,后来才慢慢的都搞通了。
    我现在手头上用做实验的还都是PC机,四台ThinkCentre M8000T,每个机器有一颗Q95504核的CPU,4G的内存。每台机器上跑3个CentOS的性能与我之前实验室里的单独的一台PC(2005年的Dell吧,1G内存,2.8GHz的CPU)的性能差得不是特别多。因为我也给每个虚拟机分配了一个CPU,1G的内存。说到这里,用到的还都是虚拟化的技术。在XCP里,不同的VM可以在Host(物理主机)间迁移,并且这种迁移可以是在VM运行的时候进行的。XCP在其文档里宣称了有Load Balancing的功能,不过到现在我都没有找到在哪里下载,又怀疑这是文档跑在了发布前的一种现象。找到了文档里说的Load Balancing下载的地方,不过这个是XenServer高级版本里才有的功能,要付费的,可以免费用30天,应该可以供我实验的时候用了吧?这种可以动态的负载均衡和动态迁移的特点,则有许多“云”的感觉了。这两天准备再找找其Load Balancing的资料,做做实验。
    另外,你如果在XenServer上安装Windows 7,创建完VM后,不要自动执行,需要设置一下,才可以,命令如下:
    xe vm-param-set uuid=<VM UUID> platform:viridian=false

    127 次查看 | 没有评论
    2009年12月12日 | 归档于 云计算, 虚拟化
  • Google Wave 邀请提名

    Loading…

    40 次查看 | 没有评论
    2009年11月1日 | 归档于 Google, 技术
  • Java中线程同步的简单用法

    应用场景:应用程序需要新建若干线程进行事务处理,这些线程处理完毕后,应用程序会进行一些后续的操作。
    解决办法:使用Object.wait(),Object.notify()方法。Object.wait()方法会阻断当前线程的执行,直到其他线程调用Object.notify()。
    于是可以很快的写出一个示例程序:
    public static void main(String[] args) {
    final Object syncObj = new Object();

    Thread thread = new Thread() {
    public void run() {
    try {
    [...]

    52 次查看 | 没有评论
    2009年10月28日 | 归档于 Java, 技术
  • 在Live Writer中编辑WordPress博客

    今天试了一下,在Live Writer中添加了AgilePHP.net,发现Windows Live Writer不但支持WordPress的博客,而且还支持的相当好。其实WordPress的后台也挺好用的,只是现在实验室的网速真的是慢的吓死人,才想到了这个办法。你需要在后台把xml-rpc选项打开。在Live Writer里添加新的帐户就可以了。现在发日志方便了,同步两边的日志也方便了。
    ==end==

    103 次查看 | 2 条评论
    2009年10月22日 | 归档于 技术, 生活
  • Portable Firefox中安装Flash插件

    最近,由于一些众所周知的原因,我在使用Portable Firefox,但是最新的版本并没有提供Flash插件,在线安装也是以失败告终。最后发现了解决的办法,将C:\Windows\System32\Macromed\Flash中的flashplayer.xpt和NPSWF32拷贝到Portable Firefox中的App\Firefox\plugins文件夹下即可。
    ==end==

    62 次查看 | 没有评论
    2009年10月22日 | 归档于 技术, 生活
  • RANGE in HTTP

    ranges-specifier = byte-ranges-specifier
    byte-ranges-specifier = bytes-unit “=” byte-range-set
    byte-range-set = 1#( byte-range-spec | suffix-byte-range-spec )
    byte-range-spec = first-byte-pos “-” [last-byte-pos]
    first-byte-pos = 1*DIGIT
    last-byte-pos = 1*DIGIT
    今天写了个工具类,用来多线程下载文件,用到了HTTP协议里的RANGE头,以上是RANGE的定义。记个NOTE,RANGE的范围是从0开始,到CONTENT-LENGTH-1结束。过段时间总结一下自己写程度下载文件时需要注意以及可以优化的方面。

    63 次查看 | 没有评论
    2009年10月20日 | 归档于 技术
    标签:
‘技术’ 分类的存档