Instagram Under the Hood

https://speakerdeck.com/carljm/instagram-under-the-hood

找到这篇文章是因为在看 "Web Service Efficiency at Instagram with Python"( 中文 英文 )这篇文章的时候,里面提到了dynostats这个middleware. 这个middleware看的不是某个函数的耗时,而是这个函数耗费的CPU指令数量,这个就和机器本身性能就隔离开了。实现原理我猜测应该是使用linux perf这样的工具来 进行采集的,但是我对这块也不熟悉没有办法自己实现,他们也没有开源的版本。但是我想可能会有类似的实现,最后按照这个关键字搜索找到了这篇文章"instagram under the hood"

使用Linux Perf获得某一段代码的CPU指令数量(但是如果使用的是gevent的话,那么会因为中间线程切换造成profile到其他代码,必须解决这个问题)

instagram-under-the-hood-cpu-instructions.png

instagram dynostats中间件可以用来对cpu, mem进行采样。同样如果使用gevent的话,会导致采集的mem和cpu不准确,除非使用原生线程池。可能他们是用uwsgi来启动,gunicorn里面似乎没有使用原生线程这个选项。

instagram-under-the-hood-dynostats.png

dynostats是用来对app进行性能监控的,而下面这个profiler则可以用来性能剖分。同样必须确保profiler可以按照线程进行分析收集。当然这个工作也可以通过pyflame来完成。

instagram-under-the-hood-profiler.png

在profiler的基础上改进一下就可以得到按照cpu instructon和max rss作为metric的profiler了

instagram-under-the-hood-custom-profiler.png

看来django大礼包可用的东西还是蛮多的

instagram-under-the-hood-django.png