文章插图
这篇文章,我们循序渐进,从内存、磁盘I/O、网络I/O、CPU、缓存、架构、算法等多层次递进,串联起高性能开发十大必须掌握的核心技术 。
– I/O优化:零拷贝技术– I/O优化:多路复用技术– 线程池技术– 无锁编程技术– 进程间通信技术– RPC && 序列化技术– 数据库索引技术– 缓存技术 && 布隆过滤器– 全文搜索技术– 负载均衡技术准备好了吗,坐稳了,发车!
首先,我们从最简单的模型开始 。
老板告诉你,开发一个静态web服务器,把磁盘文件(网页、图片)通过网络发出去,怎么做?
你花了两天时间,撸了一个1.0版本:
主线程进入一个循环,等待连接来一个连接就启动一个工作线程来处理工作线程中,等待对方请求,然后从磁盘读文件、往套接口发送数据,完事儿上线一天,老板发现太慢了,大一点的图片加载都有卡顿感 。让你优化,这个时候,你需要:
I/O优化:零拷贝技术上面的工作线程,从磁盘读文件、再通过网络发送数据,数据从磁盘到网络,兜兜转转需要拷贝四次,其中CPU亲自搬运都需要两次 。
零拷贝技术,解放CPU,文件数据直接从内核发送出去,无需再拷贝到应用程序缓冲区,白白浪费资源 。
Linux API:
ssize_t sendfile(int out_fd,int in_fd,off_t *offset,size_t count);函数名字已经把函数的功能解释的很明显了:发送文件 。指定要发送的文件描述符和网络套接字描述符,一个函数搞定!
用上了零拷贝技术后开发了2.0版本,图片加载速度明显有了提升 。不过老板发现同时访问的人变多了以后,又变慢了,又让你继续优化 。这个时候,你需要:
I/O优化:多路复用技术前面的版本中,每个线程都要阻塞在recv等待对方的请求,这来访问的人多了,线程开的就多了,大量线程都在阻塞,系统运转速度也随之下降 。
这个时候,你需要多路复用技术,使用select模型,将所有等待(accept、recv)都放在主线程里,工作线程不需要再等待 。
过了一段时间之后,网站访问的人越来越多了,就连select也开始有点应接不暇,老板继续让你优化性能 。
这个时候,你需要升级多路复用模型为epoll 。
select有三弊,epoll有三优 。
select底层采用数组来管理套接字描述符,同时管理的数量有上限,一般不超过几千个,epoll使用树和链表来管理,同时管理数量可以很大 。select不会告诉你到底哪个套接字来了消息,你需要一个个去询问 。epoll直接告诉你谁来了消息,不用轮询 。select进行系统调用时还需要把套接字列表在用户空间和内核空间来回拷贝,循环中调用select时简直浪费 。epoll统一在内核管理套接字描述符,无需来回拷贝 。用上了epoll多路复用技术,开发了3.0版本,你的网站能同时处理很多用户请求了 。
但是贪心的老板还不满足,不舍得升级硬件服务器,却让你进一步提高服务器的吞吐量 。你研究后发现,之前的方案中,工作线程总是用到才创建,用完就关闭,大量请求来的时候,线程不断创建、关闭、创建、关闭,开销挺大的 。这个时候,你需要:
线程池技术我们可以在程序一开始启动后就批量启动一波工作线程,而不是在有请求来的时候才去创建,使用一个公共的任务队列,请求来临时,向队列中投递任务,各个工作线程统一从队列中不断取出任务来处理,这就是线程池技术 。
多线程技术的使用一定程度提升了服务器的并发能力,但同时,多个线程之间为了数据同步,常常需要使用互斥体、信号、条件变量等手段来同步多个线程 。这些重量级的同步手段往往会导致线程在用户态/内核态多次切换,系统调用,线程切换都是不小的开销 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 手机免费转换mp3格式的软件推荐 mp3转flac格式
- 北京环球影城医护人员免费吗
- 免费云电脑主机永久使用 乐云主机教程
- 车澈是爱奇艺副总裁吗 车澈个人资料简介
- 李茂扮太子结局是什么 李茂和太子是一个人吗
- 集中隔离是自费还是免费 集中隔离要交钱吗
- 西安咸阳人民可免费看爱奇艺1个月从什么时候开始
- 练太极拳能看出一个人的性格
- 福建高考个人成绩排名查询方法 福建高考成绩查询
- 个人成绩位次排名查询 四川高考成绩查询