当年 1.6 亿美金估值的公司—— Digg 是如何被一句 Python 函数可变默参 毁掉的

2018-07-03 16:18:14 +08:00
 est

https://lethain.com/digg-v4/

太戏剧性了。画重点:

2011 年,Google 推出「 Panda 」 机制动摇了很多老的 SEO 手段,digg 流量被腰斩。推出 DiggV4 作战计划。经过紧张的开发发布,不过访客页面没问题,已登录用户打不开 MyNews 页面。开发不得不用临时手段把登录用户的默认页面改成 TopNews

MyNews 只能通过不断重启进程才能短暂修复。初期以为是 cassandra 的缓存击穿了 memcache,后来加紧用 redis 重写了,还是得几个小时重启一次

(折腾了一个月之后)

终于发现原因了:API 服务器是 tornado 写的名字叫 Bobtail。里面最常用的函数是:

def get_user_by_ids(ids=[])

然后这个 ids 就一直被 append 直到撑爆内存

所以这个 MyNews 功能也渐渐用的人少,因为没法定制化看新闻,后来,大家都不去 diggv4 而去 reddit 了。。

后来,digg 以 50w 美金被别人收了。。

作为这次 digg v4 事件的受害者,觉得太神奇了。。

20653 次点击
所在节点    Python
80 条回复
owenliang
2018-07-03 16:19:36 +08:00
这种 bug 有点意思😁
hahastudio
2018-07-03 16:23:43 +08:00
证明没开 Pylint
liuxu
2018-07-03 16:25:26 +08:00
python 就没有一个 xhprof 这样的工具监控内存么。。。
Livid
2018-07-03 16:25:40 +08:00
无论哪个行业,基本上能活下来的公司都是能够搞定性能和安全问题的。
est
2018-07-03 16:27:03 +08:00
@liuxu 有类似。不过估计 digg 当时的开发水平太挫。。。。这个问题基本是 python 实习生都会必面的问题。。。
zynlp
2018-07-03 16:30:10 +08:00
这 bug 要找一个月?😂
pynix
2018-07-03 16:32:38 +08:00
我一个四五年没用过 python 的人都知道不宜用 mutable 做默认参数。
cszhiyue
2018-07-03 16:35:22 +08:00
同样排查过这个坑
deadEgg
2018-07-03 16:51:01 +08:00
有点惨,这个 Bug 知道原理的都不会犯,恰巧他写这么一个方法返回的数据不一定是错的(有可能他只取返回的部分)。
Hstar
2018-07-03 16:51:20 +08:00
这问题只在面试时见过, 我觉得这问题测试的时候很容易暴露出来啊
est
2018-07-03 16:51:46 +08:00
@Hstar 测试怎么暴露呃。。测内存泄露?
xomix
2018-07-03 17:00:52 +08:00
@est 压力测试的时候跟内存消耗。
我们之前就这样跟出来一个可能出现的 bug。
当然要歌颂 vs 的诊断工具,确实太有用了。
liuxey
2018-07-03 17:04:16 +08:00
不了解 Python,能解释下原因吗?这个 ids=[] 为什么会被撑爆
lxy
2018-07-03 17:09:52 +08:00
嗯,以前被这个坑过……
def f(l=[]):
l.append(1)
print(l)

f()
f()
f()
输出
[1]
[1, 1]
[1, 1, 1]
zsdroid
2018-07-03 17:11:27 +08:00
doubleflower
2018-07-03 17:17:59 +08:00
哪怕有这个问题一下子找不出来还可以多搞几台机子定时重启程序清内存吧
monsterxx03
2018-07-03 17:24:03 +08:00
https://mg.pov.lt/objgraph/ 调试内存泄漏挺有用的, 前阵子升级碰到 celery 4.2 的一个内存泄漏问题, 光看代码真看不出来
glasslion
2018-07-03 17:39:37 +08:00
@est 内存泄露不可怕, 这种 bug 要 1 个多月才发现 才可怕吧。再说内存泄露是怎样想到缓存穿透上去的
megachweng
2018-07-03 17:43:15 +08:00
不用可变参数作为函数的默认参数不是 Python 最基础的吗...😂
tabris17
2018-07-03 17:44:19 +08:00
@glasslion redis 和 python 跑在一个服务器上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/467817

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX