1.rps指标公式源码rps指标公式
2.Linux 中断( IRQ / softirq )基础:原理及内核实现
3.NGINX 和 HAProxy:基于公有云标准环境的机源用户体验测试对比
rps指标公式源码rps指标公式
关于rps指标公式源码,rps指标公式这个很多人还不知道,源码今天来为大家解答以上的机源问题,现在让我们一起来看看吧!源码
1、机源RPS = 并发数/响应时间 = /0. 。源码源码资本投资p2p
2、机源大约是源码/S。
Linux 中断( IRQ / softirq )基础:原理及内核实现
中断(IRQ),机源尤其是源码软中断(softirq)的广泛用途之一是网络数据包的接收与发送,但其应用场景并非单一。机源本文将全面整理中断(IRQ)与软中断(softirq)的源码基础知识,这些内容与网络数据包处理虽无直接联系,机源但整理本文旨在更深入地理解网络数据包处理机制。源码
什么是机源中断?
CPU 通过时分复用处理多任务,其中包括硬件任务,如磁盘读写、键盘输入,以及软件任务,如网络数据包处理。CPU 在任何时刻只能执行一个任务。当某个硬件或软件任务当前未被执行,但希望CPU立即处理时,荣誉圣殿源码会向CPU发送中断请求——希望CPU暂停手头工作,优先服务“我”。中断以事件形式通知CPU,因此常看到“在XX条件下会触发XX中断事件”的表述。
中断分为两类:
管理中断的设备:Advanced Programmable Interrupt Controller(APIC)。
硬中断的中断处理流程
中断随时发生,处理流程如下:
Maskable and non-maskable
Maskable interrupts 在x_上可以通过sti/cli指令来屏蔽(关闭)和恢复:
在屏蔽期间,这种类型的中断不会触发新的中断事件。大部分IRQ都属于这种类型。例如,网卡的收发包硬件中断。
Non-maskable interrupts 不可屏蔽,因此属于更高优先级的类型。
问题:执行速度与逻辑复杂性之间的矛盾
IRQ处理器的两个特点如下:
存在内在矛盾。
解决方式:中断的推迟处理(deferred interrupt handling)
传统解决方式是将中断处理分为两部分:
这种方式称为中断的推迟处理或延后处理。现在已是一个通用术语,涵盖各种推迟执行中断处理的方式。中断分为两部分处理:
在Linux中,有三种推迟中断(deferred interrupts):
具体细节将在后续介绍。
软中断与软中断子系统
软中断是内核子系统的一部分:
每个CPU上会初始化一个ksoftirqd内核线程,负责处理各种类型的softirq中断事件;
使用cgroup ls或ps -ef都能看到:
软中断事件的handler提前注册到softirq子系统,注册方式为open_softirq(softirq_id,盗号流程源码 handler)
例如,注册网卡收发包(RX/TX)软中断处理函数:
软中断占用了CPU的总开销:可以使用top查看,第三行倒数第二个指标是系统的软中断开销(si字段):
Linux内核源码分析学习地址:ke.qq.com/course/...
文章福利小编推荐自己的Linux内核源码分析交流群:点击加入整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!
主处理
smpboot.c类似于事件驱动的循环,会调度ksoftirqd线程执行pending的软中断。ksoftirqd内部会进一步调用到__do_softirq,
避免软中断占用过多CPU
软中断的潜在影响:推迟执行的部分(如softirq)可能会占用较长时间,在这段时间内,用户空间线程只能等待。反映在top中,si占比。
不过softirq调度循环对此有所改进,通过budget机制来避免softirq占用过多CPU时间。
硬中断-软中断调用栈
softirq是一种推迟中断处理机制,将IRQ的大部分处理逻辑推迟在这里执行。有两条路径都会执行到softirq主处理逻辑__do_softirq():
1、CPU调度到ksoftirqd线程时,会执行到__do_softirq();
2、每次IRQ handler退出时:do_IRQ()->...
do_IRQ是内核中主要的IRQ处理方式。它执行结束时,会调用exiting_irq(),rbac权限 源码这会展开成irq_exit()。后者会检查是否pending有softirq,如果有,则唤醒:
进而会使CPU执行到__do_softirq。
软中断触发执行的步骤
总结,每个软中断会经过以下阶段:
以收包软中断为例,IRQ handler并不执行NAPI,只是触发它,在内部会执行到raiseNET_RX_SOFTIRQ;真正的执行在softirq,会调用网卡的poll()方法收包。IRQ handler中会调用napi_schedule(),然后启动NAPI poll()。
需要注意的是,虽然IRQ handler所做的工作很少,但处理这个包的softirq和IRQ在同一CPU上运行。这意味着,如果大量的包都放在同一个RX队列,虽然IRQ开销可能不多,但该CPU仍然会非常繁忙,都花费在softirq上。解决方式:RPS。它不会降低延迟,maven 源码分析只是将包重新分配:RXQ->CPU。
三种推迟执行方式(softirq/tasklet/workqueue)
提到,Linux中的三种推迟中断执行方式:
其中:
前面已经看到,Linux在每个CPU上创建了一个ksoftirqd内核线程。
softirqs是在Linux内核编译时确定的,例如网络收包对应的NET_RX_SOFTIRQ软中断。因此是一种静态机制。如果想添加一种新softirq类型,需要修改并重新编译内核。
内部组织
内部由一个数组(或称为向量)管理,每个软中断号对应一个softirq handler。数组与注册:
在5.中所有类型的softirq:
也就是在cat /proc/softirqs看到的哪些。
触发(唤醒)softirq
以收包软中断为例,IRQ handler并不执行NAPI,只是触发它,在内部会执行到raiseNET_RX_SOFTIRQ;真正的执行在softirq,会调用网卡的poll()方法收包。IRQ handler中会调用napi_schedule(),然后启动NAPI poll()。
如果对内核源码有一定了解,会发现softirq使用非常有限,原因之一是它是静态编译的,依赖内置的ksoftirqd线程来调度内置的9种softirq。如果想添加一种新功能,就得修改并重新编译内核,开发成本很高。
实际上,实现推迟执行的更常用方式是tasklet。它构建在softirq机制之上,具体来说就是使用了两种softirq:
换句话说,tasklet是在运行时(runtime)创建和初始化的softirq,
内核软中断子系统初始化了两个per-cpu变量:
tasklet再执行针对list的循环:
tasklet在内核中的使用非常广泛。不过,后面又出现了第三种方式:workqueue。
这也是一种推迟执行机制,与tasklet有些相似,但有显著不同。
使用场景
简而言之,workqueue子系统提供了一个接口,通过该接口可以创建内核线程来处理从其他地方enqueue过来的任务。这些内核线程称为worker threads,内置的per-cpu worker threads:
结构体
kworker线程调度workqueues,原理与ksoftirqd线程调度softirqs类似。然而,我们可以为workqueue创建新的线程,而softirq则不行。
参考资料引用链接
[1]
中断与中断处理:0xax.gitbooks.io/linux-...
作者:赵亚楠 原文:arthurchiao.art/blog/li...来源:云原生实验室
NGINX 和 HAProxy:基于公有云标准环境的用户体验测试对比
NGINX 和 HAProxy 在公有云环境下的用户体验测试对比
在深入探讨性能指标时,我们往往倾向于关注峰值吞吐量或每秒请求数(RPS),然而,这些指标可能未能全面反映站点的实际性能需求。站点的性能需求取决于必须服务的并发用户数量以及每个用户活跃程度。最终,用户的体验才是决定性因素。用户并不关心有多少人正在访问站点,他们更关注的是能够获得最佳服务,且系统不会因过载导致性能下降。
因此,对于企业来说,关键在于提供在高负载下也能持续提供低延迟、可靠性能的服务。本文将从两个方面对比 NGINX 和 HAProxy 在公有云标准环境下的用户体验测试:测试程序与收集的指标,以及测试方法与代理配置。
在测试中,我们使用压测工具wrk2 模拟客户端,连续发出HTTPS请求,NGINX或HAProxy作为反向代理,与客户端建立加密连接,并将请求转发至后端Web服务器。三个组件(客户端、反向代理和Web服务器)均运行在Ubuntu ..1 LTS、EC2的c5n.2xlarge实例上。
我们收集了完整的延迟指标百分位分布,包括客户端从生成请求到接收响应所用的时间。此百分位分布将测试期间的延迟测量值从高到低排序。
测试中,借助wrk2(版本4.0.0),我们运行脚本生成4个wrk线程,共建立个连接,持续秒生成指定数量的RPS。参数对应于wrk2选项。在一组测试中,我们逐渐增加RPS数量,直至代理CPU利用率达到%。
客户端与代理间所有连接采用TLSv1.3建立,使用位ECC密钥加密、PFS(完全向前保密)以及TLS_AES__GCM_SHA密码套件。在测试中,我们使用TLSv1.2进行重跑,结果与TLSv1.3相似,故不再详述。
在HAProxy测试中,我们使用版本2.3(稳定版)进行反向代理性能测试。HAProxy在1.8版本中引入了多线程作为多进程的替代方案,解决状态共享问题,但多线程模式下的性能不如多进程模式。我们的配置包含了多线程模式(HAProxy MT)和多进程模式(HAProxy MP)。
NGINX测试中,我们使用开源版1..0作为反向代理,配置中使用worker_processes指令添加auto参数,以便使用设备上所有可用的内核,同时添加worker_cpu_affinity指令,将每个worker进程绑定到一个CPU。
性能测试结果表明,三个反向代理在未耗尽RPS能力时性能相当。在RPS为,的负载级别上,HAProxy MT的CPU利用率首先达到%,随后性能急剧下降。HAProxy MP的性能相对更好,延迟在第百分位前保持较慢的上升速度,并在达到大约毫秒时趋于平稳。NGINX在整个百分位上几乎都没有延迟,最高延迟(第.百分位)约为8毫秒。
从用户体验角度看,延迟分布中的高百分位数更能代表多数请求的延迟情况,对用户感知影响更大。NGINX无需在性能与多线程模式之间做取舍,能够提供多进程的卓越性能,避免了HAProxy中的状态共享限制。
测试结果证明,NGINX在用户体验上优于HAProxy,尤其是在高负载下仍能提供低延迟、可靠性能。NGINX的配置灵活,可根据需求调整,无需担心多线程模式带来的复杂性。
欲使用NGINX开源版,请下载二进制文件或源代码。更多资源,可访问NGINX开源社区。