So Tired !_! 逆水行舟, 不进则退!

29Jun/11

初试Gevent – 高性能的Python并发框架

Posted by Nick Xu

Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效。

于greenlet、eventlet相比,性能略低,但是它封装的API非常完善,最赞的是提供了一个monkey类,可以将现有基于Python线程直接转化为greenlet,相当于proxy了一下(打了patch)。

今天有空就迫不及待的试一下效果。

1、安装

Gevent依赖libevent和greenlet,需要分别安装。

?
#相关代码, [四号程序员] http://www.coder4.com
#libevent 1.4.x
sudo apt-get install libevent-dev

#python_dev
sudo apt-get install python-dev

#easy_install
wget -q http://peak.telecommunity.com/dist/ez_setup.py
sudo python ./ez_setup.py

#greenlet
wget http://pypi.python.org/packages/source/g/greenlet/greenlet-0.3.1.tar.gz#md5=8d75d7f3f659e915e286e1b0fa0e1c4d
tar -xzvf greenlet-0.3.1.tar.gz
cd greenlet-0.3.1/
sudo python setup.py install

#gevent
wget http://pypi.python.org/packages/source/g/gevent/gevent-0.13.6.tar.gz#md5=7c836ce2315d44ba0af6134efbcd38c9
tar -xzvf gevent-0.13.6.tar.gz
cd gevent-0.13.6/
sudo python setup.py install

至此,安装完毕。

2、测试代码:XML-RPC

这里必须使用支持线程的XML-RPC,否则无法发挥gevent的优势!

传统版本:
需要说明的是,这个并很多资料描述的非单线程,而是一个select版本,所以某些时候比线程版本性能好。

?
#相关代码, [四号程序员] http://www.coder4.com
from SocketServer import ThreadingMixIn
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler

from SocketServer import TCPServer

TCPServer.request_queue_size = 10000

#Logic function
def add(a, b):
return a + b

#Logic function 2
def gen(n):
return '0' * n

#create server
server = SimpleXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler,False)
server.register_function(add, "add")
server.register_function(gen, "gen")
server.serve_forever()

线程版本:

?
#相关代码, [四号程序员] http://www.coder4.com
from SocketServer import ThreadingMixIn
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler

#Threaded XML-RPC
class TXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass

#Logic function
def add(a, b):
return a + b

#Logic function 2
def gen(n):
return "0" * n

#create server
server = TXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler)
server.register_function(add, "add")
server.register_function(gen, "gen")
server.serve_forever()

3、测试客户端

?
#相关代码, [四号程序员] http://www.coder4.com
from xmlrpclib import ServerProxy

#Execute RPC
server = ServerProxy("http://localhost:8080")
#print server.add(3,5)
print server.gen(2048)

4、gevent的monkey包装后的XML-RPC

monkey是非入侵式的patch,只需要显示调用你需要patch的东西就行了,别看我用了三行,其实可以patch_all()的

?
#相关代码, [四号程序员] http://www.coder4.com
from SocketServer import ThreadingMixIn
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
from gevent import monkey

#Threaded XML-RPC && Monkey Patch
monkey.patch_socket() #Just 2 line!
monkey.patch_thread() #Just 3 line!
monkey.patch_select() #Just 3 line!
class TXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer): pass

#Logic function
def add(a, b):
return a + b

#Logic function 2
def gen(n):
return "0" * n

#create server
server = TXMLRPCServer(('', 8080), SimpleXMLRPCRequestHandler)
server.register_function(add, "add")
server.register_function(gen, "gen")
server.serve_forever()

5、测试结果

现在只有一台机器,下午去实验室两台机器跑了以后,放上结果。对gevent还是比较寄希望的,希望不要太差。。

客户端的特殊配置:
echo -e ’1024\t65535′ | sudo tee /proc/sys/net/ipv4/ip_local_port_range
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_syncookies
ulimit -n 10240

服务器端的特殊配置:
echo “10152 65535″ > /proc/sys/net/ipv4/ip_local_port_range
echo 1 | sudo tee /proc/sys/net/ipv4/tcp_tw_recycle
sysctl -w fs.file-max=128000
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.core.somaxconn=250000
sysctl -w net.ipv4.tcp_max_syn_backlog=2500
sysctl -w net.core.netdev_max_backlog=2500
ulimit -n 10240

然后说让大家比较失望的结果:测试效果非常失败,经常出现异常情况,根据我的分析是默认的XML-RPC没有backlog(或者默认太低),导致压力一大,就会fail accept,从而导致RESET(connection refused)。
所以说对monkey的patch不要抱太大希望,他是和原代码密切相关的。

补充:已经找到修改默认backlog的方法,如下:

?
#相关代码, [四号程序员] http://www.coder4.com
from SocketServer import TCPServer
#修改这个全局变量即可
TCPServer.request_queue_size = 5000

当然测试数据说明,不要过分迷恋monkey,那只是个传说~

测试数据:
c=500 n=50000
默认:2845/s, 8M
多线程:1966/s, 51M
gevent:1888/s, 11M

c=1000 n=100000
默认:3096/s, 8M
多线程:1895/s, 52M
gevent:1936/s, 11M

c=5000 n=500000
默认:3009/s, 8M
多线程:失败,无法创建新线程
gevent:1988/s, 11M

c=10000 n=1000000
默认:2883/s, 8M
多线程:失败,无法创建新线程
gevent:1992/s, 20M

monkey的优点就是:省内存,我是和线程的相比。
我仔细的分析了一下,XML-RPC使用CPU的比例还是很大的,相比较于直接http的计算,xmlrpc还是属于cpu密集型。
在这种CPU占用很高,需要反复争夺微greenlet的情况下,gevent并不具有优势。
或者从另一种角度说,测试机不够强大,喂不饱gevent(可以看到,随着并发线程升高,gevent的性能不降反升,而默认的则在不断下降)

Tagged as: , No Comments
23Jun/11

让python的程序在ubuntu下以服务运行

Posted by Nick Xu

在/etc/init.d/下创建一个脚本snsserver.sh,内容如下:


#! /bin/sh
do_start()
{
python /home/nick/workspace/snsApp/src/run.py
}
do_stop()
{
killall python
}

case "$1" in
start)
do_start
;;
stop)
do_stop
;;
*)
echo "useage:snsserver {start|stop}"
exit 1
;;
esac

exit 0

然后sudo update-rc.d snsserver.sh defaults

这样就设置好新增的服务程序了,以后只要sudo /etc/init.d/snsserver.sh start|stop 就可以了

以上只是最简单的例子,实际使用要根据具体情况修改了。

7Jun/11

拳皇97大门不可防御地雷震VS全人物

Posted by Nick Xu

拳皇97大门不可防御地雷震VS全人物
天地返后:
草雉京:根返+假地雷震
二阶堂红丸:根返+假地雷震
大门五郎:根返+假地雷震
莉安娜:根返+假地雷震
矢吹真吾: 根返+假地雷震 2 头上拂+头上拂
大蛇 : 根返+假地雷震
东丈:根返两次 2 下重腿+假地雷震
拉尔夫:根返两次
克拉克:根返两次   2 后退+重手
坂崎良:根返两次 2 下重手+重击
罗伯特:后跳+轻超受身
麻宫雅典娜:后跳+轻超受身 2 重击(改)-重超受身
金家藩:后跳+轻超受身 2 下重腿+重手
玛丽:后跳+轻超受身
八神庵 :后跳+重超受身 2 重击-轻受身+重击
克里丝 :后跳+重超受身
蔡宝健 :根返+轻超受身 2 重腿+假地雷震
椎拳崇:根返+轻超受身
夏尔米 : 轻超受身+假地雷震
安迪: 轻超受身+假地雷震
比利 : 轻超受身+假地雷震
特瑞:暴气+轻超受身
七枷社 :暴气+轻超受身 2 重腿+重手
KING:暴气+假地雷震 2 下重腿(改)-切株返
坂崎由莉:出云投或切株返
镇元斋:轻超受身两次 2 下重腿+下重腿(改)-轻超受身
神乐千鹤:重超受身+假地雷震
不知火舞:重腿+头上拂 2 后跳+假地雷震
陈可汉:重拳+轻超受身 2 下轻腿+玉溃
山崎龙二:下重拳两次 2 重腿+根反

 

 

云投或切株返后:
草雉京:下重腿
二阶堂红丸:下重腿
大门五郎:下重腿
特瑞:下重腿
椎拳崇: 下重腿
不知火舞:下重腿
KING:下重腿
蔡宝健 :下重腿
七枷社 :下重腿
矢吹真吾:下重腿
坂崎良:轻腿
拉尔夫:轻腿
克拉克:轻腿
麻宫雅典娜:轻腿
金家藩:轻腿
玛丽:轻腿
东丈:超重击
罗伯特:超重击
山崎龙二:超重击
陈可汉:暴气
夏尔米 :暴气
比利 :暴气
克里丝 :重腿
镇元斋:重腿
大蛇 :重腿
八神庵 :后跳
莉安娜:后跳
安迪:根返
坂崎由莉:下轻拳
神乐千鹤:假地雷震

大门五郎常用技完全出招时间表
(单位:1/60秒)
近身A              13
近身B              20
近身C              21
近身D              26
远A                 15
远B                 19
远B挥空            5
远C                 34
远D                 27
蹲A                 13
蹲A挥空            5
蹲B                 15
蹲C                 28
蹲D                 23
蹲D挥空           10
垂直最小跳        32
垂直最大跳        41
最小斜跳           32
最大斜跳           41
最小影跳           28
最大影跳           37
滚动                 33
暴气                 28
后跳                 24
超重击              45
超重击挥空        16
玉溃                 52
头上拂              32
假地雷震           35
地雷震击中对方   29
地雷震完全出招   72
轻超受身           33
重超受身           41
切株返              53
根返                 29

“天地返”“出云投/切株返”“超大外割”击中对手,并从硬直状态恢复后到对方的防御不能时间表(单位:1/60秒)

草雉京            93     52     51
二阶堂红丸      93     52     65
大门五郎         93     51     63
特瑞               90     51     59
安迪               97     59     59
东丈               87     46     54
坂崎良            87     47     54
罗伯特            86     46     54
坂崎由莉         82     42     52
丽安娜            93     53     64
拉尔夫            87     47     53
克拉克            87     47     49
麻宫雅典娜      86     47     53
椎拳崇            91     51     57
镇元斋            95     55     61
神乐千鹤        105    64     78
不知火雾         88     47     51
京                 92     52     57
金家潘 86     47     68
陈可汉            96     57     64
蔡宝奇            91     52     58
七枷社            90     50     56
谢尔美            97     57     58
克里斯 94     55     53
山崎龙二         85     45     51
玛丽               86     47     53
比利               97     57     52
八神庵            94     54     53
失吹真吾         93     52     51
大蛇               93     55     60

   
site
site