V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
cloudyplain
V2EX  ›  Python

pypy 内存占用问题

  •  
  •   cloudyplain · 2017-08-28 17:20:31 +08:00 · 5531 次点击
    这是一个创建于 2674 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不知道论坛有玩 pypy 的高手吗? 基础架构:gunicorn+gevent+pypy5.8,由于 jit 的原因 qps 的确有明显提升,但在大量并发请求时内存会突然飙升,用 psutil 查看: 不知道没有什么工具查看这部分内存是怎么分布的?谢谢! ps:guppy 以及 pyrasite 等,pypy 都无法支持。

    第 1 条附言  ·  2017-08-29 10:07:30 +08:00
    from gevent import monkey
    monkey.patch_all()
    import redis
    import bottle
    from bottle import route
    
    conn = redis.Redis()
    
    
    app = bottle.Bottle()
    
    
    @app.route('/hello')
    def hello():
        return conn.hget('key', 'filed')
    

    分析了下代码,发现是redis在并发时会消耗大量内存,用wrk -c 50 -d 20压测,pypy大概占用700M而cpython只有20M左右

    第 2 条附言  ·  2017-08-29 10:14:12 +08:00
    把 gunicorn 的 worker 改成 sync,内存表现正常,怀疑是 gevent 的问题
    18 条回复    2017-08-29 12:17:45 +08:00
    janxin
        1
    janxin  
       2017-08-28 17:53:49 +08:00
    试试 objgraph?pypy 没有生产上过,帮不上什么忙
    billlee
        2
    billlee  
       2017-08-28 19:53:13 +08:00
    据说,Quora 切换到 pypy 后又因为内存问题换回 CPython 了
    SlipStupig
        3
    SlipStupig  
       2017-08-28 20:12:06 +08:00
    过来人经验告诉的告诉你,90%是你的代码问题,检查一下是不是有对象一直占用着,gc 回收周期是否过长,剩下的就是 pypy 神坑,会莫名其妙的 crash 掉
    gouchaoer
        4
    gouchaoer  
       2017-08-28 20:34:36 +08:00 via Android
    request 到了 1000 重启
    gouchaoer
        5
    gouchaoer  
       2017-08-28 21:39:18 +08:00 via Android
    脚本语言常驻内存做 http server 很容易泄露
    sujin190
        6
    sujin190  
       2017-08-28 22:28:32 +08:00
    pypy 似乎是为了尽可能减少 gc 而会使用比较多内存,可以设置 gc 相关的环境变量限制其最大内存就可以了
    一直稳定在生产环境用,内存使用量巨大是个很大的问题,而且其本身提供的 gc 相关的信息有太少
    sujin190
        7
    sujin190  
       2017-08-28 22:30:20 +08:00
    @gouchaoer #4 不靠谱,pypy 本来就是为了高并发的,每秒一千请求才起步还没预热的,你就重启,还用什么的 jit 啊
    tempdban
        9
    tempdban  
       2017-08-29 08:13:17 +08:00 via Android
    @sujin190 这个哥们和 Python 有关的问题基本都要强答一遍,基本都要被人喷。
    tempdban
        10
    tempdban  
       2017-08-29 08:16:21 +08:00 via Android
    @gouchaoer 脚本语言常驻内存很容易内存泄漏
    贼 6666666666
    sagaxu
        11
    sagaxu  
       2017-08-29 09:55:35 +08:00 via Android
    cloudyplain
        12
    cloudyplain  
    OP
       2017-08-29 10:12:09 +08:00
    @SlipStupig 目前看上去不是业务代码本身的问题,可能是 gevent 的问题
    cloudyplain
        13
    cloudyplain  
    OP
       2017-08-29 10:13:00 +08:00
    @janxin objgraph 貌似没什么用,不过谢谢了。
    terrawu
        14
    terrawu  
       2017-08-29 10:16:23 +08:00
    pypy 和 gevent 相性不和,强烈推荐 pypy + tornado
    cloudyplain
        15
    cloudyplain  
    OP
       2017-08-29 10:44:54 +08:00
    @terrawu 怎么不和,还请解释下? 切 tornado 业务代码要重构代价太大。
    terrawu
        16
    terrawu  
       2017-08-29 11:09:52 +08:00
    @cloudyplain 语言无关,runtime gc 最怕的就是所谓的 ffi 问题。比如 gevent 重度使用了 c 来实现协程和其他工具类。这在 cpython 是优势(效率高,内存使用效率也好)。但在 pypy 是相当的劣势 -- pypy gc 不得不追踪的 gevent c 调用,然后很难及时释放它。

    pypy 的成功案例或演示案例基本都是 tornado 这种接近纯 python 的例子。
    cloudyplain
        17
    cloudyplain  
    OP
       2017-08-29 11:27:31 +08:00
    @terrawu 感谢回复,不过我简单看了下 gevent 在 pypy 环境下并不是使用 cpython 的 greenlet 而是自己实现的 greenlet.py ,另外 gevent 针对 pypy 放弃了 cython 而是使用 cffi 调用 c,这是目前 pypy 推崇的方式。接触 pypy 时间很短,可能有错。
    est
        18
    est  
       2017-08-29 12:17:45 +08:00
    @gouchaoer 正解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3673 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:52 · PVG 08:52 · LAX 16:52 · JFK 19:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.