今天跑了个脚本,在linux下运行没过多久,就被操作系统kill了,猜想应该是脚本占用的系统资源过多,被操作系统强杀了。通过google,确定了这是linux的OOM Killer机制。
刚开始想,应该有配置关掉oom Killer,这样我的进程就不会被杀掉了,但之后又担心更改了这些配置,会对机器上的其他程序有影响,所以决定从程序里面找原因,试图优化资源的占用。
于是,就开始了漫长的定位过程...
我通过top指令发现(刚开始我还傻傻的用ps -euf执行多次去看内存的变化),该脚本运行后,进程的内存占用涨很快,平均每秒张百分之10。然后很快被系统kill掉了。
刚开始怀疑是程序采用的数据结构不对,看了代码,没发现问题。
于是,在怀疑可能出问题的部分,前后分别写上raw_input,配合top指令查看内存占用率的变化,将范围缩小到了一个函数内。
最后定位到,由于一个判断写错了,导致一个string不断的被累加,然后撑爆了内存。原来是一个很低级的判断错误导致了bug,花了我半天时间去定位,感觉好崩溃。
在这过程中,顺便学了用pdb调试python,原来用命令行去调试代码还挺有趣的嘛,我应该能很快熟悉windbg的使用,想想还是有点小激动呢。
- python -m pdb main.py 用pdb调试py脚本
- b 15 在代码15行打断点
- c 让程序继续执行,相当于VC里面的F5
- s 跳入函数,相当于VC里面的step into
- p param 打印param的值
- cl 清除所有断点
- condition 4 date=="20140101" 将第四个断点的条件设置为 date等于"20140101"