新浪微博宋琦:PHP在微博优化中的“大显身手”
摘要:2013中国软件开发者大会编程语言与工具专题论坛中,新浪微博架构师宋琦介绍了PHP在新浪微博中的应用,并且分享了很多微博主站所做的性能优化的工作。
【CSDN报道】 2013中国软件开发者大会(以下简称SDCC)于8月30-31日在北京新云南皇冠假日酒店举办。作为CSDN和《程序员》杂志倾力打造、千人规模以上的顶级技术盛会,今年SDCC 2013以“软件定义未来”为主题,来自于国内外一线的技术精英,就大数据分析与BI、架构实践、研发管理、IT基础设施与运维、产品与设计、开放平台等专题和参会者进行了深入的分享和探讨。此外,32小时编程马拉松、CTO论道论坛等量身定制的特色环节也受到了参会者的强烈关注。
31日下午的编程语言与工具专题论坛上,新浪微博主站架构师宋琦与大家分享和探讨了关于PHP在新浪微博实际中的应用情况。
在进入新浪微博之前,宋琦一直在做商业产品,使用的是传统的LAMP架构。而通常商业产品不涉及到很大流量,只是业务逻辑比较复杂。宋琦说当时他关注的主要是框架、扩展性、安全性方面的话题,对性能关注的较少。“之后选择做微博,是因为我认为对于程序员来说,微博产品所带来的技术挑战是一般产品无法比的。在大数据和大访问量下,任何东西都有可能成为非常棘手的问题。”宋琦说。
因为微博本身的一些特性,使得传统的LAMP架构,传统的框架、模板系统等在微博中变得不再适用,需要更加深入了解系统底层,才能应对更多挑战。
微博海量数据不容小觑
宋琦列了一组数据,微博用户数大约5.5亿,假设每个人有100条关注关系,那么总共就有550亿条用户关系,用两个long也就是16个字节来表示一个关注关系的话,那么单独保存这些关注关系就需要800G的存储空间。“以往在db里用一个map表就解决的事,放在这个场景下就变得可笑了。”宋琦说。
那么微博的访问量有多大呢?宋琦说,在2013年除夕当晚,蛇年第一秒共发出近35000条微博,第一分钟发出近73万条微博。这个只是上行的数据量,而下行的数据量是这个的N倍还多。由此可见,这样的数据量非常惊人。

响应速度关乎用户体验
在如此大的数据量和访问量下,微博对响应速度的要求非常高。有研究数据显示,如果一个页面响应速度超过3秒,那么57%的用户就会放弃;而在登录某网站时,若超过5秒,74%的用户就不会再登录;亚马逊的主页响应时间每延长1秒,每年就会减少16亿美元的销售额;而Google搜索结果每慢0.4秒,一天搜索量将减少800万次。
“总之,这些数据都说明了响应速度的重要性,可以说响应速度是保障流畅用户体验的基础。我们Team的主要KPI之一就是提升微博的性能。”宋琦补充道。
数据加载的优化
宋琦指出,微博有很多的配置文件,有几十个,这些配置每一次请求都要被加载,都要重新申请内存存放这些配置。而配置文件的修改是非常少的,那么可不可以只加载一次就可以一直使用呢?很遗憾PHP是做不到的,PHP脚本中所申请的资源在请求结束后全都会被释放。“于是我们同样使用PHP扩展来解决了它,我们创建了一个名叫Weibo_Conf的扩展,他在php-fpm启动阶段扫描指定的目录,将其下的.ini文件加载到内存中,每5分钟更新一次。这样服务器每一次接到请求时,不需要重新加载这些配置,而是直接取用,效率提升了不少。”宋琦介绍说。
除了配置外,还有一些需要常驻内存,而且不常变化的东西,但是这些的量更大一些,比如白名单/黑名单,或者切词服务的字典等。这些东西以往都是放在数据库或者MC当中,然后通过http开放接口供远程调用。“因为他们的逻辑都比较简单或者固定,不太常变化,我们将他们独立出来做成单独的C服务,用的是yar的兄弟yar-c,yar-c所做的工作就是提供一个基于C的RPC框架,帮你完成网络和进程方面的管理,让你可以专注于实现业务逻辑,同时更方便的是,通过PHP的yar扩展可以直接调用,也就是说PHP端不论是对于基于yar-c的socket RPC服务还是基于yar的http RPC服务,无需做出改变既可以通用。”宋琦说道。
缓存优化
众所周知,对于访问量巨大的服务来说,缓存是必不可少的,而微博是一个重度依赖缓存的应用。宋琦指出,微博前端展现的数据全部依赖于开放平台,开放平台提供的是基于http的RESTFul的接口,响应速度一般,所以为了提速同时降低对开放平台造成的负载,微博大量的使用了MC来缓存数据。“但是用MC也不是轻轻松松就能满足我们需要的。我们做个计算,假设我们每台服务器上开启128个php-fpm,总共100台服务器,如果每个请求响应时间是1秒,从请求开始就连接MC并且等到请求结束后才自动释放,那么每一台MC上至少有上万的连接,实际微博的量比这个还要大的多,这样MC的效率就会慢下来,同时增加了PHP处理请求的耗时,又进一步加剧了连接占用的情况,很容易造成雪崩效应。”宋琦指出。

针对此问题,宋琦展示了两种解决方案:
一种是引入一个proxy来代理对MC的访问,twitter采用的是这种方案,通过代理,php-fpm与proxy、proxy与MC之间都可以维持长连接,并且请求可以在proxy上做合并。twitter开源了他们的这个代理twemproxy。可以看到在加入twemproxy之后,MC集群的连接数大大降低了。
但是在加入了一层proxy之后,因为要通过一层twemproxy,会使得MC请求的响应变慢,于是采用了另外一个方案:增加一层缓存做成多级缓存。

首先通过会话保持,让一个用户的每一次访问都落到固定的一台机器上,然后我们在前端机的本地开启一个本地缓存,用它来挡在MC集群之前,降低对MC的访问。这层本地缓存的实际命中率大概在60%~70%左右,这些请求只需要从本地缓存中获取数据,就不需要走网络从MC集群上获取数据。
摘自:http://www.csdn.net/article/2013-09-04/2816820-sina
新浪微博宋琦:PHP在微博优化中的“大显身手”的更多相关文章
- PHP在微博优化中的“大显身手”
新浪微博宋琦:PHP在微博优化中的“大显身手” 地址http://www.csdn.net/article/2013-09-04/2816820-sina
- django缓存优化中caches参数如何配置?
在python开发中,如果运营django进行编写,为了提升效率,常常需要优化缓存,缓存优化中必须掌握的caches参数相关知识: CACHES 配置参数概述 - 格式 CACHES 字典配置格式如下 ...
- iOS开发小技巧--微博项目中的键盘工具条
微博项目中的键盘工具条 项目中的键盘工具条不能使用inputAccessoryView,因为inputAccessoryView不能实现键盘隐藏的时候,工具条还显示在眼前,如图: 所以,果断决定将工具 ...
- 转:浅谈CSS在前端优化中一些值得注意的关键点
前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...
- Cocos2d-x优化中纹理优化
转自 http://blog.csdn.net/tonny_guan/article/details/41016241 Cocos2d-x优化中纹理优化 1.纹理像素格式纹理优化工作的另一重要的指标是 ...
- 网站SEO优化中内部链接的优化
重要性:内链有效的优化能够间接的提高某页面的权重达到搜索排名靠前的效果.同时有效的带领搜索引擎蜘蛛对整站进行抓取. 网站头部导航: 这个导航称为'网站主导航',当用户来到网站需要给他们看到的内容.也就 ...
- 网站静态化处理—web前端优化—中(12)
网站静态化处理—web前端优化—中(12) Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原 ...
- MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?
本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...
- 拓扑优化中SIMP方法与水平集方法有何优缺点,水平集法变换到高维,不是更复杂了
作者:周平章链接:https://www.zhihu.com/question/52008623/answer/187927508来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
随机推荐
- 自定义shell开头PS1
vim /etc/profile export PS1="flag:\W \u\$" \h是主机名,并不全,域 \W是当前所在目录名 \u 是当前shell用户名
- VPS性能测试(1):CPU物理个数、内核、超线程、多核心
1.登录VPS界面,执行:cat /proc/cpuinfo,就会显示出VPS主机的CPU详细参数,如内核.频率.型号等等 2.主要参数physical_id表示物理CPU个数,cpu cores是内 ...
- input标签获取焦点时文本框内提示信息清空背景颜色发生变化
<input type="text" id="username" onfocus="myFocus(this,'#f4eaf1')" ...
- leetcode 之Plus One(9)
这题需要注意的是最后的进位 vector<int> plusOne(vector<int>& nums,int num) { add(nums, num); } voi ...
- io流中比较特殊的流-java
1.序列流(SequenceInputStream)整合个多个文件 A SequenceInputStream表示其他输入流的逻辑级联. 它从一个有序的输入流集合开始,从第一个读取到文件的结尾,然后从 ...
- Activiti如何替换已部署流程图
首先交代下背景:我们有一个已经上线的activiti工作流系统,对于流程图的操作已经封装好部署,查看,删除的接口.此时客户提出要修改个别流程图里的节点名称. 我的第一个想法就是本地修改流程图bpmn文 ...
- Python Flask 蓝图Blueprint
1. 目录结构 2. manage.py类似于django中manage import fcrm if __name__ == '__main__': fcrm.app.run(port=8001) ...
- Pow(x, n)——这也能用二分法!!!!
Implement pow(x, n). 下面介绍一下解决该问题的几种方法以及要注意的地方: 1)最直观容易想到的方法就是用递归方法求n个x的乘积,注意考虑n的正负号,时间复杂度为O(n) class ...
- 182. Duplicate Emails
Write a SQL query to find all duplicate emails in a table named Person. +----+---------+ | Id | Emai ...
- Linux文件系统中/tmp的临时文件清理说明
https://www.cnblogs.com/MonkeyAC/articles/3631401.html