
技术分享
文章平均质量分 81
陶辉
www.taohui.pub
展开
-
这16年来我是如何做系统性能优化的
2019年下半年,极客时间总编辑郭蕾从北京飞来杭州,问我有什么特别想分享给大家的技术。我回顾了下自己这16年来的工作经历,发现无论在华为、腾讯、思科、阿里,我都在与海量数据打交道,这个过程中对性能优化有许多思考,但一直没有系统的写下来。于是我就跟郭蕾说,那就针对分布式系统,讲讲我心中的性能优化方法论吧。这就是这门课的诞生过程啦。这是一门与具体编程语言无关的课,前端、运维也可以学。我希望可以把我...原创 2020-04-27 18:54:31 · 4666 阅读 · 0 评论 -
HTTP性能极限优化
无论你在做前端、后端还是运维,HTTP都是不得不打交道的网络协议。它是最常用的应用层协议,对它的优化,既能通过降低时延带来更好的体验性,也能通过降低资源消耗带来更高的并发性。可是,学习HTTP不久的同学,很难全面说出HTTP的所有优化点。这既有可能是你没好好准备过大厂的面试:-),也有可能你没有加入一个快速发展的项目,当产品的用户量不断翻番时,需求会倒逼着你优化HTTP协议。这篇文章是根据...原创 2020-01-13 09:38:24 · 8744 阅读 · 1 评论 -
区块链技术学习笔记
上周末参加了一个区块链技术培训班,大致搞明白了以下问题:1、比特币为什么会衍生出挖矿、矿机这套产业链?为什么那么多人炒币?2、公有链、联盟莲、私有链的区别在此做个简单分享。1、比特币这种公有区块链的技术支撑实际上大量做服务器端开发的程序员,都对zookeeper有些熟悉,当我们为一个分布式集群寻找一致性解决方案时都会想到它。zookeeper实际使用了paxos的简化版算法(如果试图说清楚这个算法原创 2017-07-04 09:49:01 · 4633 阅读 · 0 评论 -
API的接口变迁
最近前端团队对于目前API接口的不满开始增多,所以我也借此重新理一下我们的API接口。API没有什么完美的设计理念和原则,只有最适合当下的设计。这个最适合包括:当前使用的技术架构、团队规模、团队成员技术特点、开发时间、人力成本、未来业务与技术的预期等。我先来回顾下我们产品的API变迁过程。作为从0到1的创业公司,客户、CEO提出的需求是全新没有产品先例可以参考的,故首先要验证产品原型,而最初只有我原创 2017-05-29 12:06:32 · 2185 阅读 · 0 评论 -
高性能网络编程5--IO复用与并发编程
开发基于TCP协议的高性能服务器时,能够处理的并发连接数是一个重要指标。为了实现高并发,前辈们在开发效率与执行效率上的不同权衡下,提供了多种实现方式。IO多路复用,这是最纯正、本质的方法,它也是追求执行效率最大化时的最佳选择。本篇简要描述了IO复用与并发编程间的关系,希望对做应用程序开发的同学们有所帮助。原创 2013-12-04 15:57:24 · 33098 阅读 · 9 评论 -
阿里云搭建wordpress生产级CMS网站实践
搭建cms内容站点时,wordpress是一个很好的选择,不用做任何开发就可以通过配置、插件获得丰富的功能。用docker容器技术部署运维都非常简单,特别是对于wordpress这种我们无需做任何开发的组件。而出于低成本考虑,公有云都是一个最佳选择,这里我选择的是阿里云。为了提速,wordpress前会有一个nginx作为负载均衡和web加速服务器,将静态内容都由nginx处理。出于高可靠性,我选原创 2017-01-09 19:26:41 · 5379 阅读 · 1 评论 -
django中ModelForm多表单组合的解决方案
django是python语言快速实现web服务的大杀器,其开发效率可以非常的高!但因为秉承了语言的灵活性,django框架又太灵活,以至于想实现任何功能都有种“条条大路通罗马”的感觉。这么多种选择放在一起,如何分出高下?我想此时的场景下就两个标准:1、相同的功能用最少的代码实现(代码少BUG也会少);2、相对最易于理解,从而易于维护和扩展。书归正传,web服务允许用户输入,基本上要靠表单。而dj原创 2016-10-10 18:18:45 · 18209 阅读 · 3 评论 -
专访阿里陶辉:大规模分布式系统、高性能服务器设计经验分享
http://www.youkuaiyun.com/article/2014-06-27/2820432原创 2014-06-30 16:38:14 · 9981 阅读 · 2 评论 -
信号处理方法的问题
这周有位新同事请我帮忙看一个关于信号处理的问题,程序希望在收到一个信号后退出,而他在信号处理方法里却做了许多事,包括释放一些全局内存等。这样问题就产生了,程序不定时的就挂死了,用gdb一看,所有的线程都挂在了pthread_once方法里,而似乎每个线程都在处理信号,其中产生问题的线程堆栈如下:Thread 1 (Thread 0x7f41252f3720 (LWP 31542)):#0 0x00原创 2014-05-15 11:29:33 · 10951 阅读 · 4 评论 -
taohui.org.cn建站历程
用云服务器+linux+nginx+python+django+mysql+memcached搭了个人网站,用万网域名加阿里云备案完成,使用多说作为评论系统,以RST作为博客录入格式。欢迎大家光临。原创 2014-02-27 19:12:35 · 9372 阅读 · 7 评论 -
高性能网络编程7--tcp连接的内存使用
当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。操作系统里可配置的、貌似跟TCP内存相关的设置项却很让人疑惑,例如,tcp_rmem[2]和rmem_max似乎都跟接收缓存最大值有关,但它们却可以不一致,究竟有什么区别?或者tcp_wmem[1]和wmem_default似乎都表示发送缓存的默认值,冲突了怎么办?在用抓包软件抓到的syn握手包里,为什么TCP接收窗口大小似乎与这些配置完全没关系?这篇文章将为应用程序开发者系统描述TCP的内存。原创 2014-01-23 17:47:28 · 47582 阅读 · 24 评论 -
《深入理解Nginx》第2版修订前读者意见征求帖
最近编辑lisa和我讨论《深入理解Nginx》这本书第2版的出版事宜,我想还是以读者的需求为主,请读者朋友们在这里回复你们觉得:有哪些第1版书中内容有些啰嗦,可以精简的?有哪些内容说得不够详尽,需要增加篇幅的?有哪些Nginx的新变化,在第1版中没有相关内容的出现,需要在第2版中涉及的?有哪些章节的顺序不太合理,有些应该放在前面更容易理解?或者其他意见,尽请提出。谢谢大家原创 2013-12-16 11:56:15 · 6440 阅读 · 20 评论 -
高性能网络编程6--reactor反应堆与定时器管理
在大数据和云计算时代,我们对服务器的处理能力要求越来越高,需要它处理几十万并发连接下,还能维持非常高的TPS。此时就必须用到epoll这样的IO复用,但直接基于它编程在软件工程层面效率是非常差的,我们需要一个网络模型、设计模式,来简化应用编码,反应堆就是这么一个东东。原创 2013-12-20 19:37:23 · 27200 阅读 · 10 评论 -
高性能网络编程4--TCP连接的关闭
TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。为方便阅读,我们可以带着以下5个问题来阅读本文:1、当socket被多进程或者多线程共享时,关闭连接时有何区别?2、关连接时,若连接上有来自对端的还未处理的消息,会怎么处理?3、关连接时,若连接上有本进程待发送却未来得及发送出的消息,又会怎么处理?4、so_linger这个功能的用处在哪?5、对于监原创 2013-10-26 12:24:23 · 22651 阅读 · 4 评论 -
BDTC2017北京大数据技术大会参会心得
《基于GPU的性能建模与分布式深度学习框架评价》是在GPU训练性能上讨论了benchmark分析方法。从CPU到GPU后,训练时间降低了一些,但能降得更多些吗?换成多块GPU显卡,可以再下降吗?应当采购什么样的显卡,性价比最好?这场分享回答了以上问题。我们如何设计网络模型,以使得GPU可以满载呢?这里要引入一个指标OI(operational insensity),它表示计算量除以带宽FLOPS/BYTES。例如:求两个向量的点积,每个向量含n个float变量,那么计算量是2n,读写字节数是2*n*4原创 2017-12-13 16:35:55 · 3194 阅读 · 0 评论 -
详解python django面向关系数据库的ORM对象映射系统(1)
django是一套开发成本低、迭代周期快的python web框架,而如mysql等关系数据库则是网站的必备组件,django通过设计一套python对象与数据库表的映射系统ORM,使得开发者不用写一行SQL语句就能实现极其复杂的关系数据库操作,特别是关联多张表的SQL操作。这让开发者的精力可以放在业务的迭代实现中,忽略SQL细节,同时提供了还不错的SQL语句性能。本文主要分析该ORM系统的实现原理及其设计思路,顺带描述python元类这个“黑魔法”。接下来,我们首先描述django model的一般用法,原创 2017-12-18 14:09:57 · 5869 阅读 · 0 评论 -
GIT仓库代码统计
虽然以代码行数来衡量项目或者程序员并不是一件靠谱的事,但是从统计角度看趋势对于技术管理人员还是很有帮助的!推荐一个比较好用的git仓库代码统计工具:git_stats,它用于按git提交人、提交次数、修改文件数、代码行数、注释量在时间维度上进行统计,亦可按各文件类型进行简单的统计,非常方便。实际上,这么多功能通常都是用WEB在多个页面上显示的,git_stats也是如此,它需要你先安装好ruby以...原创 2018-04-17 21:15:59 · 7316 阅读 · 0 评论 -
一文解释清楚Google BBR拥塞控制算法原理
BBR对TCP性能的提升是巨大的,它能更有效的使用当下网络环境,Youtube应用后在吞吐量上有平均4%提升(对于日本这样的网络环境有14%以上的提升):报文的往返时延RTT降低了33%,这样如视频这样的大文件传输更快,用户体验更好:不像CUBIC这种基于丢包做拥塞控制,常导致瓶颈路由器大量报文丢失,所以重新缓存的平均间隔时间也有了11%提升:在Linux4.19内核中已经...原创 2019-08-07 09:07:14 · 12728 阅读 · 5 评论 -
巧用 Nginx 实现大规模分布式集群的高可用性
本文是我对2019年GOPS深圳站演讲的文字整理。这里我希望带给各位读者的是,如何站在整个互联网背景下系统化地理解Nginx,因为这样才能解决好大流量分布式网络所面临的高可用问题。标题里有“巧用”二字,何谓巧用?同一个问题会有很多种解决方案,但是,各自的约束性条件却大不相同。巧用就是找出最简单、最适合的方案,而做到这一点的前提就是必须系统化的理解Nginx!本文分四个部分讲清楚如何达到这一...原创 2019-08-09 08:28:17 · 3556 阅读 · 0 评论 -
如何快速掌握HTTP协议?
HTTP 协议极其庞杂,它影响着浏览器、爬虫、代理服务器、防火墙、CDN、Web 容器、微服务等诸多方面,自身的规范却并不统一,所要面对的各类软件的新旧版本也同时存在于网络上。在这种情况下,如果对 HTTP 没有一个深入的理解,就很容易被各种各样的网络问题难倒。那么,如何才能快速掌握HTTP协议呢?在我看来,需要从以下四个方面入手:工欲善其事,必先利其器,首先我们先要掌握好抓包及相关的...原创 2019-05-12 14:56:01 · 2157 阅读 · 0 评论 -
为什么要出web协议这门课
我们公司有定期的分享课,好几位开发部的同学–包括android原生、JS前端、python后端–要求我分享网络协议方面的知识,我做过两场培训,一个是讲TLS/SSL协议,一个是讲HTTP协议的设计原则,结果培训完大家反馈有收获,但是太难了,收获又不是很大。我总结大家学习效果不好的原因后得出:1、必须由浅入深,才能让团队中的新人快速成长;2、必须系统化、体系化的讲解;3、必须实时配合抓包...原创 2019-05-06 08:34:03 · 1131 阅读 · 0 评论 -
《数学之美》与算法
原文链接:https://www.taohui.pub/2019/02/23/%e3%80%8a%e6%95%b0%e5%ad%a6%e4%b9%8b%e7%be%8e%e3%80%8b%e4%b8%8e%e7%ae%97%e6%b3%95/《数学之美》是一本非常好的算法进阶书,它与吴军老师从事的工作领域密切相关,所以工程性很强。半年时间断断续续读完此书,这里做个笔记,也希望能帮助还未读过本书...原创 2019-02-23 18:02:13 · 3574 阅读 · 0 评论 -
如何高效的主持会议
达利欧《原则》谈到“如果由你主持会议,应把握好对话”,深有感触,主持好会议不容易,这需要各种综合能力:时间管理、冲突管理、同理心、对企业文化的理解、集体心理学、强大的逻辑分析能力等。这里我以达利欧的建议为主线,谈谈我的个人理解。1、明确主持人及会议服务对象会议一定要以实现负责人的某个目标为目的!比如,我有一个方案,但我不确定它是否足够完备、合理,那么我的目的就是找持有不同意见的权威人士坐下...原创 2018-10-21 17:32:03 · 1984 阅读 · 0 评论 -
利用cpu缓存实现高性能程序
我们选购电脑时,CPU处理器的配置会有缓存大小,它是CPU性能的重要指标。为什么呢?因为CPU计算速度与访问主存速度非常不匹配!先来看计算速度。单颗CPU计算速度目前在2GHz-4GHz之间,以2.5GHz计即每秒钟计算25亿次,每个时钟周期耗时1/2.5GHz==0.4纳秒。当前所有的计算机都遵循冯诺依曼结构,所以执行任何指令(例如加法操作)的流程必然遵循下图:所以,做一次加...原创 2018-09-05 08:51:45 · 5566 阅读 · 4 评论 -
前端程序员如何快速转型全栈工程师(基础版)
前端与后端的思维专注点很不相同,前端聚焦在如何把内容以可视化的方式展现给用户,后端聚焦在如何利用IT基础设施实现业务逻辑。所以前端参与后端开发时(全栈工程师必备!)首先需要理解后端会做哪些事,其次才是如何才能做好这些事。所谓“利用IT基础设施实现业务逻辑”,意味着以下几个概念:IT基础设施有哪些?数据库一定是最重要的,这里特指关系数据库,例如mysql。因为前端所用的数据库往往非常简单,...原创 2018-09-04 07:50:14 · 47244 阅读 · 15 评论 -
产品思维的修炼–技术的必修课
作为写了十多年代码的技术表示:产品思维比程序员们想象中重要得多!掌握了产品思维的程序员能力可以double!我把产品思维的养成要点,从我的认知上提炼了下,供大家参考。理解产品思维前,首先需要了解产品经理是一群什么样的人;其次我们再来看产品思维的本质;再次看看程序员们的技术思维有什么特点;最后谈谈技术人员如何具备产品思维。1、产品经理是一群什么样的人?1)产品经理必须能保护技术人员!...原创 2018-07-25 08:15:38 · 4282 阅读 · 3 评论 -
CSDI2018广州关于《Nginx》的分享(附文字速录与PPT)
应百林哲笑含的邀请,于2018.6.9号至7.1号前往广州白云国际会议中心参加《CSDI Summit 中国软件研发管理行业技术峰会》。会上认识了很多互联网一线老师是最大的收获:本次我分享的主题是《兼顾灵活与性能的nginx》:意外的惊喜是CSDI的讲师证书非常精美:最后附上本次演讲的PPT内容:兼顾灵活与性能的nginx以下为文字速录内容:大家好,我是杭州市智链达数据有限公司的联合创始人和CTO...原创 2018-07-11 14:29:55 · 2314 阅读 · 2 评论 -
分布式环境Raft一致性共识算法解读
Raft是分布式环境下的一致性算法,它通过少数服从多数的选举来维持集群内数据的一致性。它与RBFT算法名称有点像,然而Raft算法里不能存在拜占庭节点,而RBFT则能容忍BFT节点的存在。Raft非常类似于paxos协议(参见我的这篇文章《paxos算法如何容错的–讲述五虎将的实践》),然而它比paxos协议好理解许多(因为paxos协议难以具体实现,所以zookeeper参考paxos实现了它自...原创 2018-06-03 16:16:32 · 19878 阅读 · 1 评论 -
区块链开源实现fabric快速部署及CLI体验
本文描述fabric快速部署的步骤,及演示基于官方example02的智能合约进行CLI命令行体验。区块链涉及服务很多,且大量使用docker容器技术,所以请严格遵守以下步骤去部署,以减少各种问题的出现,方便我们先对联盟链有个大概的感觉。本文描述环境是centos7操作系统,请其他版本更正相关的安装工具(如ubuntu操作系统请把yum命令换成apt-get)。1、搭建e2e_cli环境快速部署f...原创 2018-05-22 09:53:41 · 6554 阅读 · 5 评论 -
从码农到工程师:只要做到这6点
许多程序员自称码农,因为每天事情总也做不完,而这些工作也没有给自己带来职业上的提升,总在原地打转,自己的工作似乎随时可被新人替换,可有可无。于是,年轻些的考虑着转管理或者转行,年纪大些的则被所谓的40岁危机困扰焦虑着。另一方面,有些程序员工作高效,能力出众,每当机会来临时总能获得职位上升,收入迅速的提高,个人价值的提升又从精神上给自己带来满足感,常常斗志昂扬,而这样能解决复杂问题的程序员才叫工程师...原创 2018-04-21 09:07:51 · 5991 阅读 · 20 评论 -
深入浅出人脸识别技术
在深度学习出现后,人脸识别技术才真正有了可用性。这是因为之前的机器学习技术中,难以从图片中取出合适的特征值。轮廓?颜色?眼睛?如此多的面孔,且随着年纪、光线、拍摄角度、气色、表情、化妆、佩饰挂件等等的不同,同一个人的面孔照片在照片象素层面上差别很大,凭借专家们的经验与试错难以取出准确率较高的特征值,自然也没法对这些特征值进一步分类。深度学习的最大优势在于由训练算法自行调整参数权重,构造出一个准确率...原创 2018-04-19 11:07:59 · 3697 阅读 · 0 评论 -
Udp的反向代理:nginx
在实时性要求较高的特殊场景下,简单的UDP协议仍然是我们的主要手段。UDP协议没有重传机制,还适用于同时向多台主机广播,因此在诸如多人会议、实时竞技游戏、DNS查询等场景里很适用,视频、音频每一帧可以允许丢失但绝对不能重传,网络不好时用户可以容忍黑一下或者声音嘟一下,如果突然把几秒前的视频帧或者声音重播一次就乱套了。使用UDP协议作为信息承载的传输层协议时,就要面临反向代理如何选择的挑战。通常我们...原创 2018-04-19 11:05:44 · 5879 阅读 · 1 评论 -
高性能网络编程3----TCP消息的接收
1、应用程序调用read、recv等方法时,socket套接字可以设置为阻塞或者非阻塞,这两种方式是如何工作的?2、若socket为默认的阻塞套接字,此时recv方法传入的len参数,是表示必须超时(SO_RCVTIMEO)或者接收到len长度的消息,recv方法才会返回吗?而且,socket上可以设置一个属性叫做SO_RCVLOWAT,它会与len产生什么样的交集,又是决定recv等接收方法什么时候返回?3、应用程序开始收取TCP消息,与程序所在的机器网卡上接收到网络里发来的TCP消息,这是两个独立的原创 2013-08-26 18:55:02 · 44133 阅读 · 39 评论 -
高性能网络编程2----TCP消息的发送
在上一篇中,我们已经建立好的TCP连接,对应着操作系统分配的1个套接字。操作TCP协议发送数据时,面对的是数据流。通常调用诸如send或者write方法来发送数据到另一台主机,那么,调用这样的方法时,在操作系统内核中发生了什么事情呢?我们带着以下3个问题来细细分析:发送方法成功返回时,能保证TCP另一端的主机接收到吗?能保证数据已经发送到网络上了吗?套接字为阻塞或者非阻塞时,发送方法做的事情有何不原创 2013-07-18 16:37:55 · 37306 阅读 · 39 评论 -
nginx module 开发谈(3)
2、HTTP框架继续上面这个例子,比如当nginx收到一个http请求时,我的module需要处理这个请求,那么我应该怎么做?实际这个问题还要再细分。如果是希望nginx收到完整的HTTP请求,再交给我的module处理?又或者只需要接收到完整的http header就给我呢?我把接收完header就交给module处理的code列下,再说下它的处理流程。首先我要在ngx_XXX_in原创 2010-05-31 18:05:00 · 8150 阅读 · 1 评论 -
nginx module 开发谈(4)
3、对HTTP body的处理上面我们已经开始处理http request header了,接下来,如果请求中有body内容,那么需要处理body了。这里你肯定不会想要去阻塞式的读取body吧?body的长度可大可小,网络环境也巨复杂,只要有阻塞操作肯定玩完。Nginx这时已经准备了一个现成的读取body的非阻塞模式给用户,就是ngx_http_read_client_request_body原创 2010-05-31 18:46:00 · 11023 阅读 · 4 评论 -
nginx module开发5 (完结)
upstream机制Nginx提供的upstream机制,是nginx设计理念的忠实体现。异步、无阻塞,这是nginx的追求,任何对这种设计思想的违反,都会导致nginx达不到它预期的性能,包括nginx提供的fastCGI也是如此。 Upstream到底用来干什么呢?就是nginx在正常的请求处理过程中,需要访问其他SERVER,这时,nginx提供了这样的机制,把底层的http原创 2010-08-19 14:13:00 · 10342 阅读 · 7 评论 -
从TCP协议的原理来谈谈rst复位攻击
在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接、四次握手怎样把全双工的连接关闭掉、滑动窗口是怎么传输数据的、TCP的flag标志位里RST在哪些情况下出现。下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下RST攻击是怎么回事。1、TCP是什么?TCP是在IP网络层之上的传输层协议,用于提供port到port面向连接的可靠的字节流传输。我来用土语解释下上原创 2012-02-06 13:54:47 · 58993 阅读 · 8 评论 -
linux内核调度算法(3)--多核系统的负载均衡
多核CPU现在很常见,那么问题来了,一个程序在运行时,只在一个CPU核上运行?还是交替在多个CPU核上运行呢?LINUX内核是如何在多核间调度进程的呢?又是内核又是CPU核,两个核有点绕,下面称CPU处理器来代替CPU核。实际上,如果你没有对你的进程做过特殊处理的话,LINUX内核是有可能把它放到多个CPU处理器上运行的,这是内核的负载均衡。上文说过,每个处理器上有一个runqueue原创 2011-12-28 10:54:18 · 23151 阅读 · 5 评论 -
设计模式在C语言中的应用--读nginx源码
市面上的“设计模式“书籍文章,皆针对Java/C++/C#等面向对象语言,似乎离开了面向对象的种种特性,设计模式就无法实现,没有用武之地了。是这样吗?设计模式的概念是从建筑领域引入的,本身从没歧视过面向过程编程语言,它只是对一类问题的普遍解决方案而已。面向对象语言因为有类、多态等特点,使得开发者们容易达到:隐藏细节、封装变化,而这与设计模式的目的比较一致,所以大师们爱把设计模式与面向对原创 2012-02-01 17:20:54 · 33461 阅读 · 19 评论