系统设计学习(三)限流与零拷贝

news2025/1/15 23:10:45

七、有哪些常用限流算法?

Leaky Bucket 漏桶

漏桶可理解为是一个限定容量的请求队列。想象有一个桶,有水(指请求或数据)从上面流进来,水从桶下面的一个孔流出来。水流进桶的速度可以是随机的,但是水流出桶的速度是恒定的。 当水流进桶的速度较慢,桶不会被填满,请求就可以被处理。 当水流进桶的速度过快时,桶会逐渐被填满,当水超过桶的容量就会溢出,即被丢弃。

img

Token Bucket 令牌桶

在令牌桶算法中,系统会以一个固定的速率向桶中添加令牌。当有请求(或数据包)到来时,会从桶中删除一定数量的令牌。如果桶中有足够的令牌,请求就可以立即处理; 如果桶中没有足够的令牌,请求就会被阻塞或丢弃,具体行为取决于具体的实现。 桶有容量限制,如果添加令牌时桶已满,新的令牌就会被丢弃。

img

Fixed Window 固定窗口

在一个固定的时间窗口内,只允许一定数量的请求。如果在这个时间窗口内的请求已经达到了限制,那么新的请求就会被拒绝,过了当前时间窗口后,会进入下一个时间窗口,并重置窗口内的请求数量,重新计算。

img

Sliding Window 滑动窗口

在固定窗口限流算法中,如果大量请求在一个时间窗口的边界附近到达,可能会造成瞬时的流量突增。 滑动窗口随着时间的推移,动态统计请求量,避免了在窗口边界附近的流量突增。

九、零拷贝技术

Netty 用到了零拷贝来大幅提升网络吞吐量

正常流程:4次拷贝,4次用户态和内核态之间的切换

非DMA非零拷贝 (1).png

  1. 应用进程向系统申请读磁盘的数据,这时候程序从用户态切换成内核态。
  2. 系统也就是 linux 系统得知要读数据会通知 DMA 模块要读数据,这时 DMA 从磁盘拉取数据写到系统内存中。
  3. 系统收到 DMA 拷贝的数据后把数据拷贝到应用内存中,同时把程序从内核态变为用户态。
  4. 应用内存拿到从应用内存拿到数据后,会把数据拷贝到系统的 Socket 缓存,然后程序从用户态切换为内核态。
  5. 系统再次调用 DMA 模块,DMA 模块把 Socket 缓存的数据拷贝到网卡,从而完成数据的发送,最后程序从内核态切换为用户态。
MMAP + write
buf = mmap(file,length) 
write(socket,buf,length)
  // 所谓的 MMAP, 其实就是系统内存某段空间和用户内存某段空间保持一致,也就是说应用程序能通过访问用户内存访问系统内存
  • 应用进程通过接口调用系统接口 MMAP,并且进程从用户态切换为内核态。
  • 系统收到 MMAP 的调用后用 DMA 把数据从磁盘拷贝到系统内存,这时是第1次数据拷贝。由于这段数据在系统内存和应用内存是共享的,数据自然就到了应用内存中,这时程序从内核态切换为用户态。
  • 程序从应用内存得到数据后,会调用 write 系统接口,这时第2次拷贝开始,具体是把数据拷贝到 Socket 缓存,而且用户态切换为内核态。
  • 系统通过 DMA 把数据从 Socket 缓存拷贝到网卡。
  • 最后,进程从内核态切换为用户态。

这样做到收益是减少了一次拷贝但是用户态和内核态仍然是4次切换

sendfile

零拷贝之sendfile.png

  1. 应用进程调用系统接口 sendfile,进程从用户态切换完内核态。
  2. 系统接收到 sendfile 指令后,通过 DMA 从磁盘把数据拷贝到系统内存。
  3. 数据到了系统内存后,CPU 会把数据从系统内存拷贝到 socket 缓存中。
  4. 通过 DMA 拷贝到网卡中。
  5. 最后,进程从内核态切换为用户态。
零拷贝
  1. 应用进程调用系统接口 sendfile,进程从用户态切换完内核态。
  2. 系统接收到 sendfile 指令后,通过 DMA 从磁盘把数据拷贝到系统内存。
  3. 数据到了系统内存后,CPU 会把文件描述符和数据长度返回到 socket 缓存中(注意这里没有拷贝数据)。
  4. 通过 SG-DMA 把数据从系统内存拷贝到网卡中。
  5. 最后,进程从内核态切换为用户态。

真正的零拷贝.png

零拷贝在用户态和内核态之间的切换是2次,拷贝是2次,在内存之间没有拷贝,大大减少了切换次数和拷贝次数,而且全程没有 CPU 参与数据的拷贝。

## SG-DMA
在通常情况下,DMA 操作是在一个连续的内存块上执行的。然而,在实际应用中,所需的数据可能是分散的,即分布在物理内存的多个不同区域。Scatter-Gather DMA 就是为了解决这个问题而设计的:

- 分散(Scatter):指的是从内存的多个不连续位置读取数据块,并"分散"到连续的硬件缓冲区中,或者相反,将数据从硬件的连续缓冲区写入到内存的分散区域。

- 聚集(Gather):则是指将来自多个源的数据“聚集”起来,组合成一个大的数据块,以便连续地通过 DMA 传输。

为实现这一过程,操作系统通常会维护一个描述符表或链表,列出所有分散内存区块的地址和大小。DMA 控制器使用这个表来了解每个数据块的位置,并按正确的顺序将它们聚集起来进行传输。

Scatter-Gather DMA 在需要高效处理大量分散数据的场景下非常有用,比如在网络通信、文件系统管理和音视频数据流处理中。它消除了额外的数据拷贝步骤,因为它允许直接在分散的内存区块上操作,从而减少了延迟,提高了吞吐量,并减轻了 CPU 负担。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯小白赛第 7 场 3.奇偶排序(sort排序 + 双数组)

思路:在第一次看到这道题的时候我第一想法是用冒泡,但好像我的水平还不允许我写出来。我又读了遍题目发现它的数据很小,我就寻思着把它分成奇偶两部分。应该怎么分呢? 当然在读入的时候把这个问题解决就最好了。正好它的数据范围…

前端项目(vue3)自动化部署(Gitlab CI/CD)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

C语言练习题【复试准备】

1、BoBo教KiKi字符常量或字符变量表示的字符在内存中以ASCII码形式存储。BoBo出了一个问题给KiKi,转换以下ASCII码为对应字符并输出他们。 //73,32,99,97,110,32,100,111,32,105,116,33 int main() {int arr[] {73,32,99,97,110,32,100,111,32,105,116,33};int i …

Swift:.ignoresSafeArea():自由布局的全方位掌握

ignoresSafeArea(_ regions : edges:)修饰符的说明 SwiftUI布局系统会调整视图的尺寸和位置,以避免特定的安全区域。这就确保了系统内容(比如软件键盘)或设备边缘不会遮挡您的视图。要将您的内容扩展到这些区域,您可以通过应用该修…

一文看懂红帽认证含金量有多高!

近期好多人来问红帽认证,有些是还在校的大学生,有些是已经工作的运维小伙伴。!现在的就业和职场环境下,系统学Linux确实是非常必要的。今天就给大家详细介绍下红帽认证,看看它的含金量有多高! 红帽认证是什么?红帽认证等级?红帽…

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包:ConvertToUTF8或者GBK,我试了第一个插件包不行,安装GBK插件包后OK。

AI车辆占道识别摄像机

随着城市车辆数量的增加和交通状况的复杂化,道路交通安全问题日益突出,其中车辆占道现象严重影响了交通秩序和道路通畅。为了有效监管和防范车辆占道行为,AI车辆占道识别摄像机应运而生,利用人工智能技术,实现对车辆占…

探索CorelDRAW软件2024最新中文版的强大魅力,让你的电脑数码设计更上一层楼!

在当今日益发展的数字化时代,设计已成为连接创意与现实之间的桥梁,而CorelDRAW软件则是设计师们手中的得力助手。特别是随着CorelDRAW 2024最新中文版的发布,这一设计工具的魅力和功能得到了进一步的提升,为广大设计师们提供了前所…

strcmp的模拟实现

一:strcmp函数的定义: strcmp函数功能的解释: 比较两个字符串的大小(按照字符串中字符的ascll码值)。 标准规定: 第一个字符串大于第二个字符串,则返回大于 0 的数字 第一个字符串等于第二个…

Redis持久化和集群

redis持久化 RDB方式 Redis Database Backup file (redis数据备份文件), 也被叫做redis数据快照. 简单来说就是把内存中的所有数据记录到磁盘中. 快照文件称为RDB文件, 默认是保存在当前运行目录. [rootcentos-zyw ~]# docker exec -it redis redis-cli 127.0.0.1:6379> sav…

每日一题 第四期 洛谷 查找文献

【深基18.例3】查找文献 链接 题目描述 小 K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小 K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献&…

Mybatis sql 控制台格式化

package com.mysql; import org.apache.commons.lang.StringUtils; import org.apache.ibatis.logging.Log;import java.util.*;/*** Description: sql 格式化* Author: DingQiMing* Date: 2023-07-17* Version: V1.0*/ public class StdOutImpl implements Log {private stati…

石子合并多种解法

线性朴素n^3 using ll long long;int dp1[305][305], dp2[305][305]; int main() {int n;std::cin >> n;std::vector<int>a(n 1), sum(n 1);//扩增,计算前缀和for (int i 1; i < n; i) {std::cin >> a[i];sum[i] sum[i - 1] a[i];}//i是区间for (i…

洛谷P1182数列分段

题目描述 对于给定的一个长度为 N 的正整数数列 &#xff0c;现要将其分成 M&#xff08;M≤N&#xff09;段&#xff0c;并要求每段连续&#xff0c;且每段和的最大值最小。 关于最大值最小&#xff1a; 例如一数列 4 2 4 5 14 2 4 5 1 要分成 33 段。 将其如下分段&#…

攻防世界-CatchCat

题目&#xff1a;附件为 分析题目&#xff0c;可知文件里面是一堆关于GPS的数据&#xff0c;所以我们将GPS的轨迹绘制出来&#xff08;GPS地图绘制网站&#xff1a;GPS Visualizer&#xff1a;从 GPS 数据文件绘制地图&#xff09; 将文件导入后绘制地图&#xff0c;得到如图&a…

两道简单却实用的python面试题

题目一&#xff1a;python中String类型和unicode什么关系 整理答案&#xff1a;string是字节串&#xff0c;而unicode是一个统一的字符集&#xff0c;utf-8是它的一种存储实现形式&#xff0c;string可为utf-8编码&#xff0c;也可编码为GBK等各种编码格式 题目二&#xff1a…

知识点回顾梳理之spring事务

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f415;数据库事务含义解释 &#x1f380;spring中的事务管理&#x1f3e8;注解标签的位置&#xff08;可以在类 或方法上加&#xff09;&#x1f38…

C语言-存储期2.0

静态存储期 在数据段中分配的变量&#xff0c;统统拥有静态存储期&#xff0c;因此也都被称为静态变量。这里静态的含义&#xff0c;指的是这些变量的不会因为程序的运行而发生临时性的分配和释放&#xff0c;它们的生命周期是恒定的&#xff0c;跟整个程序一致。 静态变量包含…

图论:DFS与BFS

目录 1.DFS&#xff08;图论&#xff09; 1.1.DFS过程 1.2.应用 2.BFS&#xff08;图论&#xff09; 2.1.BFS过程 2.2.应用 2.3.双端队列BFS 实现 2.4.优先队列BFS&#xff08;堆优化 Dijkstra算法&#xff09; 1.DFS&#xff08;图论&#xff09; DFS全称是&#xff…