这个问题在我进公司的时候一直就有,但是一直都没人解,这次做主干的项目被领导逼的不行了,只好亲自抄刀。
现象:在不能上外网的路由器上接多台机器,每台机器全都装上BT,像迅雷这种软件,开启多个,每个中有N多种子的时候。router跑一阵就会挂掉。dump_stack,提示内存不足。
分析:经过查找后发现是dproxy占用的内存过多。这下简单了,把这个小开源软件看了一遍,发现里面维护了一个链表。每个链表节点是
6014个字节。而这时链表的长度达到了300多(具体数字忘了)。用wiresharkZ包一看,发现迅雷果然狂发DNS包。
解决方法:后面对链表长度作限制为256,超过这个长度后就把包丢掉,发现还是不行,一路减下来,减到32发现不但内存不死机了,而且在网络接通的情况下,比原先的反应速度更快了。
总结:
开源软件DPROXY本身这并不算一个BUG,但在嵌入式上,这确是一个真真实实的BUG。前后一共花费了五天对这个BUG进行重现,而实际解决只花了半天。