首页 > 其他分享 >认识事件驱动

认识事件驱动

时间:2023-03-01 23:36:35浏览次数:40  
标签:请求 认识 事件驱动 处理 内核 事件 socket

针对什么代码做事件驱动

什么代码值得基于事件做拆分?目标是为了高性能,服务里对资源操作速度由快到慢:CPU > 内存 > 磁盘 > 网络。由于CPU和内存都是纳秒级,故只有磁盘和网络可以考虑采用事件驱动的异步方式处理。机械硬盘最慢也就几十毫秒,属于可控,而网络速度慢波动大,既受制于连接对端性能,也受制于网络传输路径。故,一般事件驱动,都指网络事件

多路复用

基本概念

一个进程任一时刻虽然只能处理一个请求,但如果处理单个请求产生的事件控制在1毫秒内,那么1秒就可以处理上千个请求。从更长的时间维度看,多个请求复用了一个进程,就叫多路复用(时分多路复用)。

Linux内核多路复用接口

select接口/poll接口/epoll接口

select接口

获取事件时,将所有并发连接传给内核,再由内核返回产生了事件的连接,最后处理这些连接对应的请求。

epoll接口

像select这样,会有频繁的用户态到内核态数据拷贝到消耗。C10M 意味着有一千万个连接,若每个 socket 是 4 字节(unsigned int),那么 1 千万连接就是 40M 字节。这样,每收集一次事件,就需要从用户态复制 40M 字节到内核态。而且,高性能 Server 必须及时地处理网络事件,所以每隔几十毫秒就要收集一次事件,性能消耗巨大。

epoll为了降低性能消耗,把获取事件拆分成了两步。

  1. 把需要监控的socket传给内核(epoll_ctl函数),仅在连接建立等有限的时机调用传递;
  2. 由于内核已管理了socket,故收集事件不再需要传递socket。

这样便只有一次socket复制。

获取到了产生事件的socket后,如何处理?

处理事件的代码分为三类来看。

  1. 计算任务,虽然内存、CPU 的速度很快,然而循环执行也可能耗时达到秒级。所以,如果一定要引入需要密集计算才能完成的请求,为了不阻碍其他事件的处理,要么把这样的请求放在独立的线程中完成,要么把请求的处理过程拆分成多段,确保每段能够快速执行完,同时每段执行完都要均等地处理其他事件,这样通过放慢该请求的处理时间,就保障了其他请求的及时处理。

  2. 读写磁盘,由于磁盘的写入操作使用了 PageCache 的延迟写特性,当 write 函数返回时只是复制到了内存中,所以写入操作很快。磁盘的读取操作就比较慢了,这时,通常要把大文件的读取,拆分成许多份,每份仅有几十 KB,降低单次操作的耗时。

  3. 通过网络访问上游服务。与处理客户端请求相似,我们必须使用非阻塞 socket,用事件驱动方式处理请求。需要注意的是,许多网络服务提供的 SDK,都是基于阻塞 socket 实现的,使用前必须先做完非阻塞改造。比如 Memcached 的官方 SDK 是用阻塞 socket 实现的,Nginx 如果直接使用该 SDK 访问它,性能就会一落千丈。正确的访问方式,是使用第三方提供的ngx_http_memcached_module 模块,它用非阻塞 socket 重新封装了 SDK。

总之,网络报文到达后,内核就产生了读、写事件,而 epoll 函数使得进程可以高效地收集到这些事件。接下来,要确保在进程中处理每个事件的时间足够短,才能及时地处理所有请求,这个过程中既要避免阻塞 socket 的使用,也要把耗时过长的操作拆成多份执行。最终,通过快速、及时、均等地执行所有事件,异步 Server 实现了高并发。

标签:请求,认识,事件驱动,处理,内核,事件,socket
From: https://www.cnblogs.com/kiper/p/17169664.html

相关文章

  • 认识数据标签
    目录数据标签体系什么是数据标签体系数据标签的分类按照计算方式分类按照更新时间分类数据标签体系与用户画像数据标签与用户画像的关系如何构建常见审计平台的数据标签体......
  • 关于OpenShift(OKD)网络Service、Routes的一些认识
    写在前面博文内容为OpenShift网络相关组件Service、Routes的一些认识理解不足小伙伴帮忙指正傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生......
  • 4大特性,带你认识化繁为简的华为云CodeArts Deploy
    摘要:2月27日,华为云发布持续部署服务CodeArtsDeploy,通过模块化自由编排部署流程,实现软件的自动化部署,帮助企业软件产品的快速、高效、高质量交付。本文分享自华为云社区《......
  • 网络请求类型Content-Type的认识
    一、Content-Type是什么?在HTTP协议消息头中,使用Content-Type来表示媒体类型信息。它被用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比......
  • JMeter的基础认识
    1、解释下什么是JMeter? JMeter是一款Java开源工具,用于性能负载测试。它旨在分析和衡量Web应用程序和各种服务的性能和负载功能行为。 2、说明JMeter的工作原理? JM......
  • 计算机的初步认识
    计算机的初步认识计算机广泛应用在:科学计算,数据处理,自动控制,计算机辅助设计,人工智能,网络等领域冯.诺伊曼体系结构......
  • uni-app学习笔记之----目录认识
    新建了一个项目之后,先简单认识目录结构1、pages 存放项目的所有页面2、static 存放静态资源3、unpackage 存放项目打包之后生成的文件4、App.vue  项目的根组......
  • jQuery基础 (一)——样式篇(认识jQuery)
    一、认识//等待dom元素加载完毕.$(document).ready(function(){alert("HelloWorld!");});二、jQuery对象与DOM对象是不一样的普通处理,通过标准JavaScript处理:<!-......
  • Docker的初步认识,安装与基本操作
    一、Docker概述1、Docker的概念•Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源•Docker是在Linux容器里运行应用的开源工具,是一种轻量级......
  • 认识Linux
    Linux操作系统目录结构的简介进入目录:cd使用cd可以进入其他目录例如:cdxxx(相对路径进入目录)cd/xx/xx(绝对路径进入目录)cd..返回上一级目录(向上)cd-回到上一......