作者简介:
张炎泼(XP)
白山云科技合伙人兼研发副总裁,绰号XP。
张炎泼先生于2016年加入白山云科技,主要负责对象存储研发、数据跨机房分布和修复问题解决等工作。以实现100PB级数据存储为目标,其带领团队完成全网分布存储系统的设计、实现与部署工作,将数据“冷”“热”分离,使冷数据成本压缩至1.2倍冗余度。
张炎泼先生2006年至2015年,曾就职于新浪,负责Cross-IDC PB级云存储服务的架构设计、协作流程制定、代码规范和实施标准制定及大部分功能实现等工作,支持新浪微博、微盘、视频、SAE、音乐、软件下载等新浪内部存储等业务;2015年至2016年,于美团担任高级技术专家,设计了跨机房的百PB对象存储解决方案:设计和实现高并发和高可靠的多副本复制策略,优化Erasure Code降低90%IO开销。
本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:
表现
运行环境:
# uname –a
Linux ** 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
# python2 --version
Python 2.7.5
# cat /etc/*-release
CentOS Linux release 7.2.1511 (Core)
python进程在大量请求的处理过程中,内存持续升高。负载压力下降之后,内存并未下降。
# ps aux | grep python2
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 124910 10.2 0.8 5232084 290952 ? Sl Mar17 220:37 python2 offline.py restart
# ~~~~~~
# 290M 内存占用
解决方法
三个步骤确定问题所在:
-确认当时程序是否有异常行为;
-排除行为异常后,查看python内存使用情况,确认所有相关对象的回收情况;
-排除垃圾回收等python内部内存泄漏问题后,则可以定位到libc的malloc实现问题;
确定后可直接替换malloc模块为tcmalloc:
LD_PRELOAD="/usr/lib64/libtcmalloc.so" python x.py
问题定位过程解读
gdb-python:搞清楚python程序在做什么
首先确定python在做什么,是否有大内存消耗任务正在运行,或出现死锁等异常行为。
从gdb-7开始,gdb支持用python实现gdb扩展,可以像调试c程序一样,用gdb对python程序检查线程、调用栈等;且可同时打印python代码和内部c代码的调用栈。
这对于定位是python代码问题还是其底层c代码问题,有很大帮助。
- 准备gdb
首先安装python的debuginfo:
# debuginfo-install python-2.7.5-39.el7_2.x86_64
如果缺少debuginfo,当运行后续步骤时,gdb会提示,按提示安装完成即可:
Missing separate debuginfos, use: debuginfo-install python-2.7.5-39.el7_2.x86_64
- 接入gdb
可直接用gdb attach到1个python进程,查看其运行状态:
# gdb python 11122