import gc;
gc.garbage 是显示 垃圾回收器不能回收的对象,例如__del__.
通过 pyrasite 导出内存的对象(有每个对象的地址,大小, 假如是字符串的话就会直接有字符串的值), 发现 unicode 对象较多, 通过 linux shell 命令 sort 和 uniq 字符串的值,
发现我某个频繁请求的接口输出的日志内存占用很多.(那个是拿任务的接口 ,客户端定时 10s 一次过来请求, 使用的是 http 短连接. 同时我对于每个接口都有一个装饰器包住,用来执行解密和日志输出,所以每个接口都有日志):
serverinterface_logger = logging.getLogger("default")
dump_string = func(request, *args, **kwargs)
serverinterface_logger.info("resp! descrypt:%s, request.url: %s, method: %s,body: %s, resp_before_encrypt: %s" % (settings.ENCRYPT, request.get_full_path(), request.method, request.body, dump_string)) -----此行打印的日志占用内存较高.
但是,思考觉得这种应该会很容易被回收,尽管频率很高.
===========
接下来为了使用 tracemalloc 把 django1.9 python2 升级到 django1.11 python3 (具体来说是一个能兼容 python3,python2 运行环境的版本) (可以通过编译 pyhon2 来达到使用 tracemalloc, 但是我觉得 py3 是迟早的,所以趁着这个机会升级), 查看分配内存最高的行代码 ,验证了上述代码行的确分配内存最高.
现在 python2 升级 python3 跑到正式环境出了点问题, 所以暂且只能用 python2 跑新版本, 等 bugs 修完就再次排查