https://github.com/nevermosby/linux-bpf-learning
如果你对 Linux 流控感兴趣,如果你需要搭建高性能的 Linux 网关 , 本文将会使你受益颇多。
本篇主要讲述了利用tc工具对 Linux 进行高级流量控制.TC流量控制工具 , 从 Linux2.2 版开始已并入内核而且功能非常强大。如果你需要搭建高性能的 Linux 网关 , 本文将会使你受益颇多。
netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc 。
WebjxCom 友情提示: 公司一台服务器,网络环境太高,那台服务器和源服务器连接下载,就跑到 400M-500M,为了控制一下,所以研究了一下 TC. 来做流量控制。给他控制到小点,不要让这一台占了所有的网络。TC 很是强大啊,很多所谓的硬件路由器,都是基于这个做的。
1 限制流出速度 限制流出速度,主要通过tc这个工具,常用的有三个队列: tbf队列,令牌桶队列,适用于流量×××; cbq队列,分类的队列,用于实现精细的qos控制,配置复杂; htb队列,分层的令牌桶队列,用于实现精细的qos控制,配置比cbq简单些; 通过tbf限制流程速度的例子: tc qdisc add dev eth0 root tbf rate 51200kbit latency 50ms minburst 200k burst 200k 限制网卡eth0流出速度为51200kbit,正确的设置方法,和minburst这个参数有很大的关系,不同的硬件环境和系统需要具体调试。 通过htb实现不同目标地址的限速 删除 tc qdisc del dev eth0 root tbf 修改 tc qdisc change dev eth0 root tbf rate 2200kbit latency 5000ms burst 1540 查看当前队列 tc -s -d qdisc ls
3. 在两台 DTLE 服务器上添加网络带宽限制以及增加延迟(经测试网络延迟配置只对发送有效,故需要在源端和目标端同时添加 TC 规则,每端延迟配置为预期延迟的一半)。
日常在给客户做稳定性治理时,像实例级别的不可用、主从切换、重启、性能等维度的场景做的比较多,随着治理的深入,大家慢慢把目光专项应用程序更不可控的场景:网络数据包异常。
Aya这个库可以让你完全用Rust来编写eBPF程序,并且为开发者提供尽可能友好的开发体验。这篇文章里我们会讲什么是eBPF,为什么发起Aya,还有它的独特之处。
tc qdisc add dev eth0 root tbf rate 51200kbit latency 50ms minburst 200k burst 200k
在内核分析网络分组时,底层协议的数据将传输到跟高的层。而发送数据的时候顺序是相反的。每一层都是通过加(首部+净荷)传向跟底层,直至最终发送。
上篇讲解了Hqos基本知识点及vpp Hqos配置及基本流程框架,今天通过源码来分析Hqos实现逻辑。
本文内容来自 Linux Advanced Routing & Traffic Control HOWTO[1] (2012) , 这是一份在线文档(小书),直译为《Linux 高级路由与流量控制手册》。本文翻译第九章 Chapter 9. Queueing Disciplines for Bandwidth Management[2]。
其实不想用这个题目的,只因为TCP相关的东西比较吸引人的眼球,这篇文章的主题还是eBPF,而不是TCP。
Linux内核在2022年主要发布了5.16-5.19以及6.0和6.1这几个版本,每个版本都为eBPF引入了大量的新特性。本文将对这些新特性进行一点简要的介绍,更详细的资料请参考对应的链接信息。总体而言,eBPF在内核中依然是最活跃的模块之一,它的功能特性也还在高速发展中。某种意义上说,eBPF正朝着一个完备的内核态可编程接口快速进化。
eBPF 源于 BPF,本质上是处于内核中的一个高效与灵活的虚拟机组件,以一种安全的方式在许多内核 hook 点执行字节码,开发者可基于 eBPF 开发性能分析工具、软件定义网络、安全等诸多场景。但是,目前对于开发和使用 eBPF 应用而言还可能存在一些不够方便的地方:
netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian等等。
Kubernetes 自 v1.6 以来,官方就宣称单集群最大支持 5000 个节点。不过这只是理论上,在具体实践中从 0 到 5000,还是有很长的路要走,需要见招拆招。
笔者有一个需要搭建弱网环境来复现某个网络问题的需求,因此开始在网络中寻找能够快速搭建弱网环境的方式。
在前面的几篇文章中,我们解决了pod连接主机、pod连接外网、pod与相同节点或不同节点的pod连接、用clusterIP和nodeport的方式访问pod等几个问题,可以说,对于组织pod的网络的每一环都已经完成了。
许多发行版都为内核提供了模块化或整体式的流量控制(QOS)。自定义的内核可能不会支持这些特性。
输出调试信息是嵌入式开发中必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的打印log到文件的方法基本不适用。
有个老项目,通过 Squid 提供文件下载功能,利用 delay_parameters 实现带宽控制,问题是我玩不转 Squid,于是盘算着是不是能在 Nginx 里找到类似的功能。
Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。 接收包从输入接口进来后,经过流量限制丢弃不符合规定的数据包,由输入多路分配器进行判断选择:
本文翻译自 2020 年 Quentin Monnet 的一篇英文博客:Understanding tc “direct action” mode for BPF[1]。
文章涉及的实验环境和代码可以到这个git repo获取: https://github.com/nevermosby/linux-bpf-learning
在介绍tc qdisc之前,先解释下tc是什么, tc(traffic control)是Linux内核中的一个网络流量控制工具,它可以用来控制网络流量的带宽、延迟、丢包等参数,从而实现网络流量的优化和管理。详细介绍可以参考Linux TC工具的官方文档和man手册。而qdisc (queueing disciplines), 是tc工具中的一部分,叫做队列规则,是一种可以定义Linux网络流量队列规则的一种机制,可以进行流量排队、调度以及限速等操作,达到对网络流量的精细控制和管理。如下是几个qdisc的例子:
在实时性要求较高的特殊场景下,简单的UDP协议仍然是我们的主要手段。UDP协议没有重传机制,还适用于同时向多台主机广播,因此在诸如多人会议、实时竞技游戏、DNS查询等场景里很适用,视频、音频每一帧可以允许丢失但绝对不能重传,网络不好时用户可以容忍黑一下或者声音嘟一下,如果突然把几秒前的视频帧或者声音重播一次就乱套了。使用UDP协议作为信息承载的传输层协议时,就要面临反向代理如何选择的挑战。通常我们有数台企业内网的服务器向客户端提供服务,此时需要在下游用户前有一台反向代理服务器做UDP包的转发、依据各服务器的实时状态做负载均衡,而关于UDP反向代理服务器的使用介绍网上并不多见。本文将讲述udp协议的会话机制原理,以及基于nginx如何配置udp协议的反向代理,包括如何维持住session、透传客户端ip到上游应用服务的3种方案等。
在分享这篇文章之前,先简单和大家说下背景。在之前的文章中作者分享了一些关于Service Mesh微服务架构的文章,在Service Mesh架构中需要通过SideCar代理的方式对应用容器流量进行劫持,并以此实现微服务治理相关的各种能力。但这种SideCar方式在微服务数量过多时会造成系统性能的降低,因为SideCar本质上来说,也是通过用户代码实现的网络代理来进行流量管控的。而eBPF则是一种替代SideCar的新式解决方案,它存在于操作系统的内核层级,在性能上表现更优。 因此目前关于Service Mesh微服务架构的技术方案开始逐步趋向于使用eBPF来替代原先的像Envoy这样的SideCar代理。本文的内容将详细介绍eBPF的前世今生,具体如下:
电子相册的实现就是通过按键来改变显示器的图片轮换。本节将通过ps端的按键来控制ARM选择不同的图片通过HDMI输出到显示屏。
本文翻译自 2016 年 Daniel Borkman 在 NetdevConf 大会上的一篇文章:On getting tc classifier fully programmable with cls_bpf[1]。
为自动调优定义socket使用的内存。第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)。
网络 rz # 通过ssh上传小文件 sz # 通过ssh下载小文件 ifconfig eth0 down # 禁用网卡 ifconfig e
在 linux 中,经常需要获取文件的属性,比如修改时间,文件大小等等。stat 函数将会帮助我们得到这些信息。
最近1-2周, 业务侧基于性能和一致性的需求,测试和验证基于sofa-jraft的框架。由于上线后事关生产环境的稳定性,于是加入调研jraft/raft相关领域调研,确保生产环境即使在极端情况下,也在我们考量的范围之内。
V4L2子系统向上提供了很多访问Video设备的接口,应用程序可以通过系统调用访问Video设备。但由于Video设备千差万别,很少有设备驱动程序能支持所有的接口功能,因此在使用之前,需要了解设备驱动程序支持的功能。
FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,可以非常方便我们开发字体显示相关的程序功能。它支持单色位图、反走样位图的渲染。FreeType库是高度模块化的程序库,虽然它是使用ANSI C开发,但是采用面向对象的思想,因此,FreeType的用户可以灵活地对它进行裁剪。关于freetype的详细信息可以参考freetype的官方网站:https://www.freetype.org/来获取更多相关的信息。
本文翻译自 LPC 2021 的一篇分享:BPF datapath extensions for K8s workloads[1]。
Rust 已经从创新阶段转变为早期采用阶段,这主要是由于它在基础设施和网络数据平面空间(例如,Habitat和Linkerd 2.0)中的应用。Rust 语言也逐渐成为 WebAssembly 的天然合作伙伴,帮助提高人们的认识。此外 Facebook 选择使用 Rust 实现其 Libra 加密货币。
在上一节LCD层次分析中,得出写个LCD驱动入口函数,需要以下4步: 1) 分配一个fb_info结构体: framebuffer_alloc(); 2) 设置fb_info 3) 设置硬件相关的操作
D1-H哪吒开发板上有一个USB Host接口(即电脑上那种插鼠标键盘的USB口),同时D1-H Tina Linux支持UVC(USB Video Class,USB视频类),这样D1-H就具备了开发和使用USB摄像头的软硬件条件。
SmartX是中国领先的超融合产品与企业云解决方案提供商,拥有国内最顶尖的分布式存储和超融合架构研发团队,在分布式存储、虚拟化计算、微服务、容器、前端开发、自动化测试等领域都做着行业最前沿的实践。
这是基于Linux系统开发板设计一个小项目-数码相册,在LCD屏上可以显示完成常见的图片显示,翻页、旋转、缩放等功能。
发现它有smem_start和mmio_start两个字段。我刚开始看的时候就很疑惑:“帧缓冲区不就是MMIO的吗,这两个字段的区别在哪里?”
该框架旨在提供标准内核接口来控制 SoC 上的互连设置。这些设置可以是多个互连设备或功能块之间的吞吐量、延迟和优先级。这可以动态控制以节省功率或提供最大性能。
这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影。关于dma网上有许多的资料,关于dma采集ad网上也有很多。亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但
显示设备例如 LCD,在 Linux 中用 Framebuffer 来表征, Framebuffer 翻译过来就是帧缓冲,简称 fb,在 /dev 目录下显示设备一般表示成这样:/dev/fbn,应用程序通过访问这个设备来访问 LCD,实际上应用程序通过操作显存来操作显示设备,显存由驱动程序设置。说白了,我们要在 linux 下操作屏幕进行显示那么直接对 /dev/fbn 进行操作即可。
网络安全大神Peter Parkanyi用Rust程序和eBPF来"窥探"Zoom程序的内容。最近Zoom因为新冠病毒而大火一把,而且又因为美国政府担心Zoom的服务器绕中国一圈再回到美国引发安全顾虑又大火一把。这个博文值得关注。
领取专属 10元无门槛券
手把手带您无忧上云