Odoo 中文社区

    • 注册
    • 登录
    • 搜索
    • 版块
    • 标签
    • 热门
    • 用户
    • 群组

    Odoo中文社区可以通过以下两个域名访问:shine-it.net , odoo.net.cn

    由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

    本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

    开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

    如果您登录系统碰到问题,请在微信公众号留言:

    异步非阻塞 async_netrpc_server for openerp 简介及简单测试

    Odoo 系统测试
    6
    8
    12241
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • W
      wangbuke 最后由 编辑

              async_netrpc_server 是使用tornado 的ioloop 实现的异步非阻塞的net-rpc socket server for openerp。此模块是由本人开发并维护,现已托管在google code 上(http://code.google.com/p/openerp-asynchronous-non-blocking-net-rpc-server/),在google code 上,我写了简单的安装方法,有兴趣的朋友可以下载并测试。此模块为开源项目,欢迎大家参与。

              为什么要开发这个模块? 因为Openerp 官方的net-rpc server 是采取select 轮询的的socket 线程池模式,在一般情况下是没有任何问题的,但是如果在高并发的密集请求下,这种模式就会显得比较落后了。而tornado 是由facebook 开发的高性能框架,其核心是使用linux 的epoll (mac / bsd 下用 kqueue)实现异步非阻塞的socket模型。当然,windows下还是使用select 轮询,但并不是说windows 就一点都没用,线程池模式需要频繁创建和销毁对象,这对系统资源来说是一个很大的开销,而异步非阻塞的模型避免了这个缺点。所以,我在看了OE的代码之后,就萌生了这个想法,并因此有了这个模块。

              那么,这个模块到底怎么样?是骡子是马,拉出来溜溜。。。我做了简单的测试,请看下面。

      软硬件环境

              DELL 1420 笔记本
              CPU:Intel(R) Core(TM)2 Duo CPU    T5450  @ 1.66GHz
              内存:1G
              硬盘:160G
              操作系统:Debian Linux  2.6.39-2-686-pae #1 SMP Tue Jul 5 03:48:49 UTC 2011 i686 GNU/Linux
              OpenERP Server版本:openerp-server-6.0.3
              OpenERP web client:openerp-web-6.0.3
              CherryPY 版本:3.1.2

      相关参数设置

              Openerp Server:

              1、编辑 netrpc_server.py  修改 self.socket.listen(1024)。这个是官方的net-rpc server 的socket 等待队列,默认值是5,10个并发就挂了,所以必须修改。
              2、编辑openerp-server.conf 添加db_maxconn = 128。这个是数据库连接池,默认值是64。
              3、编辑openerp-server.conf,设置 xmlrpc = False 和 xmlrpcs = False,不启动http xmlrpc 服务 和 https xmlrpc服务。
              4、测试官方的net-rpc server 时,编辑 openerp-server.conf 中 netrpc = True  ,async_netrpc = False ,只启动官方的net-rpc server 。
              5、测试async_netrpc_server 时,编辑 openerp-server.conf 中 netrpc = False  ,async_netrpc = True ,只启动async_netrpc_serve。

              Opery Web Client:

              1、打开openerp-web.cfg,确认 server.environment = "development"(如果你是源码下载,这个就是默认值,无须修改)。
              2、测试官方的net-rpc server 时,编辑openerp-web.cfg 中 openerp.server.port = '8070' 。
              3、测试async_netrpc_server 时,编辑openerp-web.cfg 中 openerp.server.port = '8008' 。

              CherryPY:编辑_cpserver.py 修改 socket_queue_size = 500 和 thread_pool = 1024。详细的修改方式和说明,请参见拙文Openerp压力测试:Openerp到底能支撑多大的用户数?。
      测试过程

              一、使用本人编写oetest.py 测试 10000总任务100并发测试(程序请到拙文Openerp压力测试:多线程直连OE Server NET-RPC/XML-RPC端口测试下载)

              测试官方的net-rpc server 时,修改oetest.py 参数 PORT = '8070' 。测试async_netrpc_server 时,修改oetest.py 参数 PORT = '8008' 。

              1、 官方的net-rpc server 测试结果

      <br />$ ./oetest.py <br /><br />Start at 2011-08-25 20:58:17.636473<br />End&nbsp;  at 2011-08-25 20:59:35.510676<br /><br />Total Time: 0:01:20.874203<br />
      


      2、 async_netrpc_server 测试结果

      <br />$ ./oetest.py <br /><br />Start at 2011-08-25 20:53:15.829595<br />End&nbsp;  at 2011-08-25 20:54:18.310178<br /><br />Total Time: 0:01:02.480583<br />
      



              从上面的结果来看,官方的net-rpc server处理时间是 80.87秒,async_netrpc_server 的处理时间是 62.48。(80.87−62.48)÷62.48 = %29.43 也就是说 async_netrpc_server 大概比官方的net-rpc server快 29%左右。那么,实际情况是否有如此大的差距呢?下面我们用ab (ApacheBench)来模拟下实际情况。

              二、通过ab 测试/openerp/form/view?model=sale.order&id=1 地址,1000总任务1000并发。

              本次测试的框架是 ab -> OpenERP Web Client -> OpenERP Server

              1、 官方的net-rpc server 测试结果(点击下载测试文件)

      <br />$ ab -n 1000 -c 1000 -C session_id=16273c836063c55a73ff154f048884b450b76bed &#039;http://127.0.0.1:8080/openerp/form/view?model=sale.order&amp;id=1&#039;<br /><br />Server Software:&nbsp; &nbsp; &nbsp; &nbsp; CherryPy/3.1.2<br />Server Hostname:&nbsp; &nbsp; &nbsp; &nbsp; 127.0.0.1<br />Server Port:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 8080<br /><br />Document Path:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /openerp/form/view?model=sale.order&amp;id=1<br />Document Length:&nbsp; &nbsp; &nbsp; &nbsp; 92818 bytes<br /><br />Concurrency Level:&nbsp; &nbsp; &nbsp; 1000<br />Time taken for tests:&nbsp;  372.131 seconds<br />Complete requests:&nbsp; &nbsp; &nbsp; 1000<br />Failed requests:&nbsp; &nbsp; &nbsp; &nbsp; 0<br />Write errors:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  0<br />Total transferred:&nbsp; &nbsp; &nbsp; 93073000 bytes<br />HTML transferred:&nbsp; &nbsp; &nbsp;  92818000 bytes<br />Requests per second:&nbsp; &nbsp; 2.69 [#/sec] (mean)<br />Time per request:&nbsp; &nbsp; &nbsp;  372131.152 [ms] (mean)<br />Time per request:&nbsp; &nbsp; &nbsp;  372.131 [ms] (mean, across all concurrent requests)<br />Transfer rate:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 244.25 [Kbytes/sec] received<br />
      


      内存占用情况:

      测试前:23.3M。测试使用firefox 登录并访问地址 /openerp/form/view?model=sale.order&id=1 ,然后察看进程内存占用情况。
      [img [检测到链接无效,已移除] /img]
      测试后:27.3M。测试完成1000任务后,察看进程内存占用情况。
      [img [检测到链接无效,已移除] /img]
      测试过程中,观察内存上升情况,发现是随着测试任务完成情况而线性增长的。

            2、 async_netrpc_server 测试结果(点击下载测试文件)

      <br />$ ab -n 1000 -c 1000 -C session_id=9d82bf71745241afba1451f7fc8206e7a09a6e2d &#039;http://127.0.0.1:8080/openerp/form/view?model=sale.order&amp;id=1&#039;<br /><br />Server Software:&nbsp; &nbsp; &nbsp; &nbsp; CherryPy/3.1.2<br />Server Hostname:&nbsp; &nbsp; &nbsp; &nbsp; 127.0.0.1<br />Server Port:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 8080<br /><br />Document Path:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /openerp/form/view?model=sale.order&amp;id=1<br />Document Length:&nbsp; &nbsp; &nbsp; &nbsp; 92818 bytes<br /><br />Concurrency Level:&nbsp; &nbsp; &nbsp; 1000<br />Time taken for tests:&nbsp;  365.387 seconds<br />Complete requests:&nbsp; &nbsp; &nbsp; 1000<br />Failed requests:&nbsp; &nbsp; &nbsp; &nbsp; 0<br />Write errors:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  0<br />Total transferred:&nbsp; &nbsp; &nbsp; 93073000 bytes<br />HTML transferred:&nbsp; &nbsp; &nbsp;  92818000 bytes<br />Requests per second:&nbsp; &nbsp; 2.69 [#/sec] (mean)<br />Time per request:&nbsp; &nbsp; &nbsp;  371386.709 [ms] (mean)<br />Time per request:&nbsp; &nbsp; &nbsp;  371.387 [ms] (mean, across all concurrent requests)<br />Transfer rate:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 244.74 [Kbytes/sec] received<br /><br />
      




      内存占用情况:

      测试前:23.3M。测试使用firefox 登录并访问地址 /openerp/form/view?model=sale.order&id=1 ,然后察看进程内存占用情况。
      [img [检测到链接无效,已移除] /img]

      测试后:23.8M。测试完成1000任务后,察看进程内存占用情况。
      [img [检测到链接无效,已移除] /img]

      测试过程中观察,完成100任务后内存上升到23.8之后就一直停留在23.8,没有再增长。

      从以上的对比情况来看,处理时间基本上没有多大的差距,(372.131−365.387)÷365.387 =  %1.845 。但是从内存占用情况来看,async_netrpc_server 仅增长了0.5M,而官方的net-rpc server 则增长了4M ,显示出 8 倍的差距。


      结论

              通过以上的测试,async_netrpc_server 对比 官方的 net-rpc 模块,显示出一些性能的优势。

              1、第一种测试中的29%差距,应该仅是表明async_netrpc_server 异步非阻塞框架的优秀性能。而oe实际应用情况则比较复杂,涉及缓存、数据库读取等。所以,在第二种测试中,差距不到2%,也是正常情况。

              2、第二种测试中,内存占用情况有8倍的差距,这个表明线程池模型在面对高并发时很有可能成为系统瓶颈。官方的net-rpc server 使用的线程池模型频繁创建销毁对象,带来较大的性能开销,虽说python有垃圾回收机制,但问题是你不知道它什么时候回收。如果线程池销毁的对象一直没有被回收的话,那将是一场灾难。


      以上的测试,仅仅是本人在有限条件下进行的,并且受限于与本人知识水平,测试结果仅供各位参考。非常欢迎大家试用并测试async_netrpc_server模块。也欢迎大家和我讨论,我的联系方式在页面最下方。谢谢!

      本文转自本人博客 [检测到链接无效,已移除] ,测试文件和程序请到本人博客下载。谢谢!

      1 条回复 最后回复 回复 引用 0
      • mrshelly
        mrshelly 最后由 编辑

        建议 把实现方法提交到OE官方... 射射....

        1 条回复 最后回复 回复 引用 0
        • digitalsatori
          digitalsatori 管理员 最后由 编辑

          兄弟技术精湛,才思敏捷,论述有理有据,行文流畅,图文并茂。
          读你的文章非常受启发,本人甚是佩服。希望能看到更多此类文章。

          【上海先安科技】(tony AT openerp.cn)

          1 条回复 最后回复 回复 引用 0
          • Joshua
            Joshua 管理员 最后由 编辑

            支持提到官方那里,LZ厉害,佩服佩服。

            【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

            1 条回复 最后回复 回复 引用 0
            • W
              wangbuke 最后由 编辑

              谢谢shelly,谢谢Joshua

              关于提交到官方,个人感觉不是很靠谱啊。一是不知道怎么提交,还请各位指点。二是修改的有点大,而且还引入了tornado 这个第三方类库,关于神码license 的东西,够OE官方搞一阵子了。提交上去估计也是如沉入大海,无影无踪鸟。。。

              PS:校长啊,读你的每个字都是胆战心惊啊,有点大难临头的感觉,莫非你要开除我啊。。。。你肿么要这样对我?我到底做错鸟神马?你不要赶我出去啊。。。啊啊啊  😎

              1 条回复 最后回复 回复 引用 0
              • C
                ccdos 最后由 编辑

                这个强

                1 条回复 最后回复 回复 引用 0
                • O
                  oldrev 最后由 编辑

                  高手出现了

                  1 条回复 最后回复 回复 引用 0
                  • First post
                    Last post