首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HTTPS用CurlAsyncHTTPClient请求内存泄漏

HTTPS用CurlAsyncHTTPClient请求内存泄漏
EN

Stack Overflow用户
提问于 2017-08-04 04:56:55
回答 1查看 963关注 0票数 2

我的处理程序文件

代码语言:javascript
运行
复制
# -*- coding:utf-8 -*-
import sys
from tornado import gen, web, httpclient

url = "https://mdetail.tmall.com/templates/pages/desc?id=527485572414"

class SearchHandler(web.RequestHandler):
    @gen.coroutine
    def get(self):
        async_client = httpclient.AsyncHTTPClient()
        print sys.getrefcount(async_client) # The first time less than 10, then always bigger than 200
        req = httpclient.HTTPRequest(url, "GET", headers=headers)
        req_lists = [async_client.fetch(req) for _ in range(200)]
        r = yield req_lists
        print sys.getrefcount(async_client) # always bigger than 200
        # The longer req_lists, the more memory will be consumed, and never decrease

配置文件

代码语言:javascript
运行
复制
tornado.httpclient.AsyncHTTPClient.configure(client, max_clients=1000)

如果我的客户是"tornado.curl_httpclient.CurlAsyncHTTPClient",,那么当我在broswer中访问我的处理程序时,htop显示内存增加了大约6GB,只要进程运行,内存使用量就不会减少。

如果我将范围(200)设置为范围(500)或更高,则内存使用量会增加。

如果我的下体是None,那么内存几乎不会增加。

我发现只有获取https://才会有内存问题。

如何用CurlAsyncHTTPClient解决记忆问题?

环境:

代码语言:javascript
运行
复制
Ubuntu 16.10 x64
python2.7.12
Tornado 4.5.1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-04 09:35:11

您所看到的引用计数是预期的,因为使用max_clients=1000,旋风将缓存和重用实例,每个实例都可能是持有参考到客户端的_curl_header_callback。你可以在objgraph.show_backrefs上看到它。

你真的需要max_clients=1000吗?也就是说,多达1000个请求并行?(我希望它们不是都在同一台服务器上,就像在您的例子中一样!)

无论如何,Curl实例似乎占用了大量内存。

在我的系统(Ubuntu16.04)上,当使用针对系统范围的libcurl3-gnutls 7.47.0链接的PycURL时,我可以重现这个问题:

代码语言:javascript
运行
复制
$ /usr/bin/time -v python getter.py 
6
207
^C
[...]
    Maximum resident set size (kbytes): 4853544

当我将PycURL链接到一个新构建的libcurl 7.54.1 (仍然使用GnuTLS后端)时,我得到了一个更好的结果:

代码语言:javascript
运行
复制
$ LD_LIBRARY_PATH=$PWD/curl-prefix/lib /usr/bin/time -v python getter.py 
6
207
^C
[...]
    Maximum resident set size (kbytes): 1016084

如果我在OpenSSL后端中使用libcurl,结果会更好:

代码语言:javascript
运行
复制
    Maximum resident set size (kbytes): 275572

还有其他关于GnuTLS:卷曲问题#1086内存问题的报告。

因此,如果您确实需要一个大型max_clients,请尝试使用使用OpenSSL后端构建的较新的libcurl。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45498537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档