8月 27

读《人生不过如此》

  林语堂老先生的经典颇多。如:
过客
  我们对于人生可以抱着比较轻快随便的态度:我们不是这个尘世的永久房客,而是过路的旅客。

稀罕
  人类之足引以自傲者总是极为稀少,而这个世界上所能予人生以满足者亦属罕有。
  中国就有这么一群奇怪的人,本身是最底阶层,利益每天都在被损害,却具有统治阶级的意识.在动物世界里找这么弱智的东西都几乎不可能.

  林语堂老先生笑看人生,教会我们如何面对生活。对于中国人的略根性也只能和老先生一样,幽默的去呼吁,慢慢的改变。

“譬如坐汽车,按照市章,常人只许开到每三十五英里速度,部长贵人便须开到每五十六十英里,才算有脸。万一轧死人,巡警走上来,贵人腰包掏出一张名片,优游而去,这时的脸便更涨大。倘若巡警不识好歹,硬不放走,贵人开口一骂,“不识你的老子!”喝叫车夫开行,于是脸更涨大。若有真傻的巡警,动手把车夫扣留,贵人愤愤回去,电话一打给警察局长,半小时内车夫即刻放回,巡警即刻免职,局长亲来诣府道歉,这时贵人的脸,真大得不可形容了。”(脸与法制)
image

8月 17

固态硬盘在服务器上测试

  服务器是dell R410,操作系统CentOs5.7 64位,安装一块固态硬盘做数据缓存盘。

首先在台式机上测试了一下。
如图,intel 300i,显示第一次加电还能用9年。

读写测试均在200M/s。

放到服务器上,格式为ext4,测试结果如下:

sas盘

time dd if=/dev/zero of=/root/test.dbf bs=8k count=300000

测试磁盘读能力
time dd if=/root/test.dbf of=/dev/null bs=8k

ssd盘

time dd if=/dev/zero of=/cache/test.dbf bs=8k count=300000

测试磁盘读能力
time dd if=/cache/test.dbf of=/dev/null bs=8k

结论:固态硬盘做缓存效果还是不错。如果只是缓存,大量读取写入不大,直接用sas就好了,毕竟相同的价格存储能大一、二倍。

8月 16

go 操作redis ,对比python 操作redis

  之前做过python入库到redis的测试 http://www.simonzhang.net/?p=430
  今天才发现由于页面生成问题,有部分代码被转译了。借这个机会在同一台机器上再测试一下这两种语言。

  测试服务器为一个Xeon(TM)双核3.20GHz 的cpu,内存4G。操作系统为Centos5.4 64位。go1.0.2,python2.6

  go环境和redis之前已经有记录,go语言的redis开发包安装也比较简单,但是官方文档中目录有写错。
  我的go放在/usr/local/go,我的安装记录如下:
cd /usr/local/go/src/pkg
git clone git://github.com/alphazero/Go-Redis.git redis
cd redis
go install

仍旧用大密码表实验,go语言代码如下:

//www.simonzhang.net
package main 

import (
	"os";
	"log";
	"fmt";
	"redis";
        "encoding/hex"
        "crypto/md5"
)

func main () {
	spec := redis.DefaultSpec().Db(1).Password("");
        //如要操作远程redis服务器连接如下
	//spec := redis.DefaultSpec().Host("192.168.1.200").Db(1).Password("123");
	client, e := redis.NewSynchClientWithSpec (spec);
	if e != nil { log.Println ("failed to create the client", e); return }
        var str string
        userFile := "big_pass.txt"
        fin,err := os.Open(userFile)
        defer fin.Close()
        if err != nil {
                fmt.Println(userFile,err)
                return
        }
        buf := make([]byte, 1)
        for{
                n,_:= fin.Read(buf)
                if 0==n {break}
                if string(buf)=="\n"{
	            h:= md5.New()
   	            h.Write([]byte(str))
                    key:=hex.EncodeToString(h.Sum(nil));
                    value:=[]byte(str)
                    client.Set(key, value);
                    str=""
                 }else{
                    str+=string(buf)
                 }
                  
        }
}

开始测试

go使用build编译运行,cpu使用率在55%左右,load average: 1.98, 1.22, 0.91
real 1m33.310s
user 0m42.586s
sys 0m34.567s

python cpu使用在在80%,load average: 2.19, 1.36, 0.86。
real 1m26.873s
user 0m56.316s
sys 0m19.595s

  总结python写redis的东西比较简单。go对字符串做了MD5,入redis时用MD5值做key。
a)都运行完毕python和go录入redis行数与文本行数相同。
b)从大小来看python不到1K,go编译完成2.3M。如果要一处编译,移到其他服务器运行,go编译完的可以直接运行,python还要再装环境。但是有easy_install,所以装环境对我来说比较简单。
c) cpu使用量来看go要比python好一些,在增加md5计算的情况下所用系统资源也比pyhton少,但是应该快不了一倍。
d) 从代码编写的逻辑和难易程度来看,还是python简单一点。
如果要考虑速度可以试试Cpython,我没有试过。

8月 15

读《商业的常识》

书中对中国创业圈的事情说的比较实在。所发生的故事我也亲身感受过一部分。
阅读此书不会像大家看乔、盖、马的自传,看的热血沸腾,动不动就拿某句话作为作用名和方针照做。良药苦口,让大家感受到事情真实的一面。
企业中出现的问题各式各样,企业家的解决方式各有所长,但是本书并未对问题解决方案做过多的描述。
十分推荐大家读读。
image