《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 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳 ...
随机推荐
- 计算机网络-4-8-外部网关协议BGP
外部网关协议BGP 1989年,公布了新的外部网关协议BGP(边界网关协议),我们目前使用最多的版本是BGP-4(但仍然是起草方案[RFC 4271]),简写为BGP. 在不同的自治系统AS中之间的路 ...
- yum安装curl支持http2
yum 安装 安装 yum 源 rpm -ivh http://mirror.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-2-1.rh ...
- div中出现滚动条,自动保持在最底端---显示聊天窗口最新的信息
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Miniconda入门教程
Miniconda 教程 介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.因为包含了大量的科学包,Anaconda 的下载文件 ...
- 【LeetCode】243. Shortest Word Distance 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcode ...
- 1164 - Horrible Queries
1164 - Horrible Queries PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 64 M ...
- bugku的一道代码审计基础题:eval
首先看到 include "flag.php",第一反应就应该是文件包含 直接先?hello=file:////etc, 然后啥也没 那就再检查一下代码,eval(var_dump ...
- 第二十九个知识点:什么是UF-CMA数字签名的定义?
第二十九个知识点:什么是UF-CMA数字签名的定义? 第16篇博客给出了DSA,Schnoor和RSA-FDH签名方案的细节,但是签名方案是什么?它应该保证什么样的安全性? 一个签名方案\(S\)是一 ...
- 'real'词频分析
写下来想法来自于无聊时写的代码.https://cryptopals.com/sets/1/challenges/3 The hex encoded string: 1b37373331363f781 ...
- Java程序设计基础笔记 • 【第6章 循环结构进阶】
全部章节 >>>> 本章目录 6.1 for循环 6.1.1 for循环的简介 6.1.2 for循环的使用 6.1.3 for循环的表达式 6.1.4 实践练习 6.2 ...