《Go组件设计与实现》-netpoll的总结
主要针对字节跳动的netpoll网络库进行总结。netpoll网络库相比于go本身的net标准库更适合高并发场景。
基础知识
netpoll与go.net库一样使用epoll这种IO多路复用机制处理网络请求。
基本理解
我们知道linux万物皆文件,每个文件有个文件标识符fd,我们可以想象linux提供给我们的socket fd就是操作系统将传输层及以下的协议进行封装抽象化的一个接口。我们可以简单把socket理解成对应的一次tcp连接。 那么网络操作根本上也是针对网卡的IO操作,我们需要读取数据/写入数据,那么如何更加高效地处理数据呢?目前大多数网络库都使用IO多路复用机制,在linux系统中最先进的io多路复用就是epoll机制。
epoll工作方式
- 事件通知机制
- epoll_ctl/epoll_wait
- ET(边缘触发)/LT(水平触发)
事件通知机制
- 注册事件:epoll需要注册一些可读的事件
- 监听事件:监听到可读的数据
- 触发事件:通知数据可读
主要还是有两个系统调用:
- epoll_ctl
- epoll_wait
工作模式
epoll有两种触发工作模式:ET和LT
- ET也叫边缘触发,注册的事件满足条件之后,epoll只会触发一次通知。就算你这一次的读写事件的数据没有处理完,下一次epoll_wait也不会再触发通知。
- LT也叫水平触发,注册的事件满足条件之后,不管数据是否读写完成,每一次epoll_wait都会通知当前监听的fd事件。
BIO/NIO
- BIO:blocking I/O,阻塞I/O。就是当我们向一个socket发起read的时候,数据读取完成之前一直是阻塞的。
- NIO:nonblocking I/O,非阻塞I/O。就是read数据的时候不阻塞,立即返回。
那么我们每次发现socket中有可读数据的时候,我们就会开启一个goroutine读取数据。
Netpoll的优化点
go的net库是BIO的,浪费了更多的goroutine在阻塞,并且难以对连接池中的连接进行探活。 netpoll采用了LT的触发方式,这种触发方式也就导致编程思路的不同
ET
LT
netpoll采用LT的编程思路 由于netpoll想在 系统调用 和 buffer 上做优化,所以采用LT的形式。
优化系统调用
syscall这个方法其实有三步:
- enter_runtime
- raw_syscall
- exit_runtime
由于系统调用是一个耗时的阻塞操作,容易造成goroutine阻塞,所以需要加入一些runtime的调度流程。 但是,epoll_wait触发的事件,保证不会被阻塞,所以netpoll直接采用RawSyscall方法做系统调用,跳过了runtime的一些逻辑。
优化调度
使用msec动态调参和runtime.Gosched主动让出P
msec动态调参
epoll_wait的系统调用有个参数是,等待时间,设置成-1是无限等待事件到来,0是不等待。
这样就有事件到来的时候下次循环的epoll_wait采用立即返回,没有事件就一直阻塞,减少反复无用的调用。
runtime.Gosched主动让出P
如果msec为-1的话会立即进入下一次循环,开启新的epoll_wait调用,那么调用就阻塞在这里,goroutine阻塞时间长了之后会被runtime切换掉,只能等到下一次执行这个goroutine才行,导致时间浪费。 netpoll调用runtime.Gosched方法主动将GMP中的P让出,减少runtime的调度过程。
优化buffer
我们在读取和写入数据的时候需要使用到buffer。 多数框架使用环形buffer,可以做到流式读写。但是环形buffer容量是死的,需要扩容的话,需要重新copy数组,引入了很多的并发问题。
LinkBuffer
netpoll使用的buffer实现包括:
- 链表解决扩容copy问题
- sync.Pool复用链表节点
- atomic访问size,规避data race和锁竞争
还有一些nocopy方面的优化,减少了write和read的次数,从而提高了读取和发送的时候的编解码效率。
更多信息看:https://www.cloudwego.io/zh/blog/2021/10/09/字节跳动在-go-网络库上的实践/#nocopy-buffer
《Go组件设计与实现》-netpoll的总结的更多相关文章
- 《WePayUI组件设计的秘密》——2016年第一届前端体验大会分享
本文是博主参加第一届前端体验大会 | 物勒工名做的分享<WePayUI组件设计的秘密>,内容主要分为2个部分: 一.浅析UI库/框架的未来 讨论的UI库或者框架,主要包含展示和交互的css ...
- HTML5拓扑图形组件设计之道(一)
HT for Web(http://www.hightopo.com/guide/readme.html)提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表 ...
- HT图形组件设计之道(四)
在<HT图形组件设计之道(二)>我们展示了HT在2D图形矢量的数据绑定功能,这种机制不仅可用于2D图形,HT的通用组件甚至3D引擎都具备这种数据绑定机制,此篇我们将构建一个3D飞机模型,展 ...
- HT图形组件设计之道(三)
上篇我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动,这类案例后续文章还会继续以便大家掌握更多的矢量应用场景,本篇我们先切换个话题, ...
- HT图形组件设计之道(一)
HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表达的我们希望提供:Everything you need to create ...
- xmlplus 组件设计系列之零 - xmlplus 简介
xmlplus 是什么 xmlplus 是博主写的一个 JavaScript 框架,用于快速开发前后端项目. xmlplus 基于组件设计,组件是基本的构造块.评价组件设计好坏的一个重要标准是封装度. ...
- React组件设计
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- React组件设计(转)
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- 【转载】COM 组件设计与应用(十七)——持续性
原文:http://vckbase.com/index.php/wv/1264.html 一.前言 我们写程序,经常需要实现这样的需求: 例一.程序运行产生一个窗口,用户关闭的时候需要记录窗口的位置, ...
- 【转载】COM 组件设计与应用(十一)—— IDispatch 及双接口的调用
原文:http://vckbase.com/index.php/wv/1236.html 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳 ...
随机推荐
- [BUUCTF]PWN11——get_started_3dsctf_2016
[BUUCTF]PWN11--get_started_3dsctf_2016 题目网址:https://buuoj.cn/challenges#get_started_3dsctf_2016 步骤: ...
- Java on Visual Studio Code的更新 – 2021年11月
Nick zhu Senior Program Manager, Developer Division at Microsoft 大家好,欢迎来到 11 月版的 Visual Studio Code ...
- LuoguP7337 『MdOI R4』Fun 题解
Content 有 \(n\) 个人去打比赛.给出第 \(i\) 个人的交通方式 \(t_i\) 和颓废值 \(q_i\)(均以 \(0/1\) 表示).如果 \(t_i=1,q_i=1\) 的人数 ...
- jQuery Validate验证(判断)某个字段是否通过验证
jQuery Validate 默认只能判断整个表单是否验证通过,但是有时候我们需要对某个字段进行判断 ,可以使用以下方法 var bool=$("整个form表单的ID").va ...
- 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)
0.关于 为缩短篇幅,本系列记录如下: 再谈多线程模型之生产者消费者(基础概念)(c++11实现) 再谈多线程模型之生产者消费者(单一生产者和单一消费者)(c++11实现)[本文] 再谈多线程模型之生 ...
- 【九度OJ】题目1203:IP地址 解题报告
[九度OJ]题目1203:IP地址 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1203 题目描述: 输入一个ip地址串,判断是否合 ...
- 【LeetCode】11. Container With Most Water 盛最多水的容器
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:盛水,容器,题解,leetcode, 力扣,python ...
- 设计模式学习——JAVA动态代理原理分析
一.JDK动态代理执行过程 上一篇我们讲了JDK动态代理的简单使用,今天我们就来研究一下它的原理. 首先我们回忆下上一篇的代码: public class Main { public static v ...
- 「AHOI2013」 差异
知识点: SA,线段树,单调栈 原题面 Loj Luogu 题意简述 给定一长度为 \(n\) 的字符串 \(S\),令 \(T_i\) 表示从第 \(i\) 个字符开始的后缀,求: \[\sum_{ ...
- MongoDB笔记:windows环境安装及连接本地数据库
下载MongoDB 2.4.9版 mongodb官网下载:http://www.mongodb.org/downloads 直接下载地址:http://fastdl.mongodb.org/win32 ...