电商项目怎样处理或用啥技术解决高负载、高并发、高可用性问题( 二 )
写缓存应用层使用的不多,操作系统的写缓存,完全是为了提高IO写的效率。操作系统在写IO的时候会对缓存进行合并和调度,例如写磁盘会用到电梯调度算法。
\u0026gt;\u0026gt;\u0026gt;\u0026gt;0x06 高效利用网卡
高并发问题首先要解决的是如何高效利用网卡。网卡和磁盘一样,内部也是有缓存的,网卡接收网络数据,先存放到网卡缓存,然后写入操作系统的内核空间(内存),我们的应用程序则读取内存中的数据,然后处理。
除了网卡有缓存外,TCP/IP协议内部还有发送缓冲区和接收缓冲区以及SYN积压队列、accept积压队列。
这些缓存,如果配置不合适,则会出现各种问题。例如在TCP建立连接阶段,如果并发量过大,而nginx里面socket的backlog设置的值太小,就会导致大量连接请求失败。
如果网卡的缓存太小,当缓存满了后,网卡会直接把新接收的数据丢掉,造成丢包。当然如果我们的应用读取网络IO数据的效率不高,会加速网卡缓存数据的堆积。如何高效读取网络数据呢?目前在Linux上广泛应用的就是epoll了。
操作系统把IO设备抽象为文件,网络被抽象成了Socket,Socket本身也是一个文件,所以可以用read/write方法来读取和发送网络数据。在高并发场景下,如何高效利用Socket快速读取和发送网络数据呢?
要想高效利用IO,就必须在操作系统层面了解IO模型,在《UNIX网络编程》这本经典著作里,总结了五种IO模型,分别是阻塞式IO,非阻塞式IO,多路复用IO,信号驱动IO和异步IO。
\u0026gt;\u0026gt;\u0026gt;\u0026gt;0x07 阻塞式IO
我们以读操作为例,当我们调用read方法读取Socket上的数据时,如果此时Socket读缓存是空的(没有数据从Socket的另一端发过来),操作系统会把调用read方法的线程挂起,直到Socket读缓存里有数据时,操作系统再把该线程唤醒。
当然,在唤醒的同时,read方法也返回了数据。我理解所谓的阻塞,就是操作系统是否会挂起线程。
\u0026gt;\u0026gt;\u0026gt;\u0026gt;0x08 非阻塞式IO
而对于非阻塞式IO,如果Socket的读缓存是空的,操作系统并不会把调用read方法的线程挂起,而是立即返回一个EAGAIN的错误码,在这种情景下,可以轮询read方法,直到Socket的读缓存有数据则可以读到数据,这种方式的缺点非常明显,就是消耗大量的CPU。
\u0026gt;\u0026gt;\u0026gt;\u0026gt;0x09 多路复用IO
对于阻塞式IO,由于操作系统会挂起调用线程,所以如果想同时处理多个Socket,就必须相应地创建多个线程,线程会消耗内存,增加操作系统进行线程切换的负载,所以这种模式不适合高并发场景。有没有办法较少线程数呢?
非阻塞IO貌似可以解决,在一个线程里轮询多个Socket,看上去可以解决线程数的问题,但实际上这个方案是无效的,原因是调用read方法是一个系统调用,系统调用是通过软中断实现的,会导致进行用户态和内核态的切换,所以很慢。
但是这个思路是对的,有没有办法避免系统调用呢?有,就是多路复用IO。
在Linux系统上select/epoll这俩系统API支持多路复用IO,通过这两个API,一个系统调用可以监控多个Socket,只要有一个Socket的读缓存有数据了,方法就立即返回,然后你就可以去读这个可读的Socket了,如果所有的Socket读缓存都是空的,则会阻塞,也就是将调用select/epoll的线程挂起。
所以select/epoll本质上也是阻塞式IO,只不过他们可以同时监控多个Socket。
\u0026gt;\u0026gt;\u0026gt;\u0026gt;0x0A select和epoll的区别
为什么多路复用IO模型有两个系统API?我分析原因是,select是POSIX标准中定义的,但是性能不够好,所以各个操作系统都推出了性能更好的API,如Linux上的epoll、Windows上的IOCP。
至于select为什么会慢,大家比较认可的原因有两点,一点是select方法返回后,需要遍历所有监控的Socket,而不是发生变化的Ssocket,还有一点是每次调用select方法,都需要在用户态和内核态拷贝文件描述符的位图(通过调用三次copy_from_user方法拷贝读、写、异常三个位图)。epoll可以避免上面提到的这两点。
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 滁宁城际铁路一期项目汊河新城特大桥箱梁架设完成
- 广西鹿寨贫困户玩直播带货变身创业新星以电商帮老乡卖滞销农产品
- 互联网怎样解决“家政服务上门速度慢”的问题
- 盐都区|15个高质量项目签约落户盐城高新区
- |盐城在建省级农业农村重大项目已完成投资65.9亿元
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 南通大学|创业项目聚焦二孩家庭,南通大学喜获国赛金奖
- 农民工工资|海门三项目被省住建厅列入拖欠农民工工资预警名单
