极客时间-linux性能优化 35 C10K到C1000K回顾

这节对我来说是比较容易的一节课,因为正是我平时的工作内容,所以心里很熟悉

直接说下C10M,千万并发如何能达到?

第一、优化IO模型

使用非阻塞I/O和边缘触发机制,比如epoll

epoll内部使用红黑树管理文件描述符的集合,不需要应用程序每次操作时都传入、传出文件描述符集合。

epoll使用事件驱动的机制,只关心有IO事件发生的文件描述符,不需要轮询扫描整个集合。

由于边缘触发只在文件描述符可读或可写事件发生时才通知,所以应用程序需要尽可能多的执行IO,并处理更多的异常事件

 

第二、使用异步IO

市面上有什么不错的异步IO的库吗?

 

工作模型优化

一、主进程 + 多个worker子进程

主进程:侦听并接收连接,管理子进程生命周期

worker进程:处理已建立连接的读写请求

惊群问题是什么?如何解决惊群问题?nginx是如何处理惊群问题的呢?(这块需要好好看下)

二、监听到相同端口的多进程模型

所有的进程都监听相同的端口,并且开启SO_REUSEPORT选项,由内核负责将请求负载均衡到这些监听进程中。

极客时间-linux性能优化 35 C10K到C1000K回顾_第1张图片

Nginx在1.9.1中已经支持了这种模式。

实现千万并发连接,有什么阻碍的因素吗?

占用的物理资源:

1、每个连接要占用内存是3K,1000万连接占用的内存为3G

2、从带宽上计算,1000万连接中有20%的活跃连接,即使每个连接只需要1KB/s的吞吐量,,总共需要1.6Gb/s的吞吐量。

需要配置万兆网卡。

占用的软件资源:

文件描述符的数量

连接状态的跟踪

网络协议栈的缓存大小(套接字读写缓存、TCP读写缓存)

网上上大量的数据包请求,会也触发高的中断数

做完这些,发现想实现1000万并发连接,还是有点困难。

主要是Linux系统的数据包处理路径太冗长了,从网卡,DMA环形队列,硬中断,软中断,网络协议栈逐层协议处理,投递给应用层程序,想解决这个问题,就需要绕过Linux内核协议栈。

DPDK

XDP(eXpress Data Path),是Linux内核提供的一种高性能的网络数据路径,它允许网络包在进入内核协议栈之前,就进行处理。XDP是基于Linux内核的eBPF机制实现的。

极客时间-linux性能优化 35 C10K到C1000K回顾_第2张图片

你可能感兴趣的:(性能优化-专栏)