1.Linux 中断( IRQ / softirq )基础:原理及内核实现
2.网卡数据包的接收(netif_rx)
3.手动部署War包到Tomcat上之何为War
4.rps指标公式源码rps指标公式
5.NGINX 和 HAProxy:基于公有云标准环境的用户体验测试对比
Linux 中断( IRQ / softirq )基础:原理及内核实现
中断(IRQ),尤其是软中断(softirq)的广泛用途之一是网络数据包的接收与发送,但其应用场景并非单一。本文将全面整理中断(IRQ)与软中断(softirq)的基础知识,这些内容与网络数据包处理虽无直接联系,但整理本文旨在更深入地理解网络数据包处理机制。rar源码下载
什么是中断?
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):
具体细节将在后续介绍。苹果id网站源码
软中断与软中断子系统
软中断是内核子系统的一部分:
每个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(),这会展开成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。它不会降低延迟,只是将包重新分配: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()。mybatis源码开发包
如果对内核源码有一定了解,会发现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...来源:云原生实验室
网卡数据包的接收(netif_rx)
网卡数据包接收的核心操作主要围绕netif_rx和其相关的内部函数进行,如netif_rx_internal。这些函数的目的是处理网卡接收到的skb(Sk_buff,网络数据包)并将其存储起来,以供后续处理。
存储路径的精准买卖点 源码关键在于netsoft_data结构,每个CPU都有自己的实例。当网卡收到新的skb时,它会被添加到netsoft_data结构中的input_pkt_queue队列。只有当input_pkt_queue为空时,才会触发napi_schedule_rps,这会启动一个软中断,以便重新激活中断处理流程。
进一步追踪,napi_schedule_rps通过一系列调用链最终将napi_struct添加到poll_list中,并触发NET_RX_SOFTIRQ软中断。然而,值得注意的是,虽然我们可以在驱动函数和netif_rx系列中找到与skb处理相关的部分,但并未直接找到将驱动的napi_struct添加到backlog(这里可能指的是input_pkt_queue)的具体步骤。
总结来说,网卡数据包接收的过程涉及数据包的接收、存储,以及通过napi机制管理软中断,但驱动中napi_struct如何精确地加入到backlog的具体实现细节并不明显。这可能需要深入驱动源码或者相关文档以获取更详细的解答。
手动部署War包到Tomcat上之何为War
部署War包至Tomcat是一个常见的Java EE应用部署流程。War文件是Java EE web应用部署到应用服务器的载体,它将应用的所有组件打包为单一单元,包括JAR文件、JavaServer Pages(JSP)、Java Servlets、Java类文件、XML文件、HTML文件以及其他资源文件。
Maven是一种流行的构建管理工具,广泛应用于Java EE项目中,用于处理编译、打包、管理等任务。可以使用Maven WAR插件将项目构建为War文件。生成War文件的Maven实践|Baeldung
部署War包到Tomcat的第一步是配置Tomcat服务器,为部署操作添加拥有部署权限的用户。这可通过编辑位于Tomcat/conf子目录中的tomcat-users.xml文件完成。在tomcat-users标签内添加如下条目,保存文件并重启服务器以使更改生效。
重启Tomcat通常是在bin目录下执行startup.sh或./shutdown.sh命令,如果你的Tomcat服务始终处于运行状态,重启命令会确保配置更新。
访问/localhost:/>,确认Tomcat主页是否正确加载,否则可能存在配置问题。
若访问主页出现问题,可能需要将Tomcat首页的工程部署到服务器。这涉及在IDEA中选择“Run”菜单,点击“Edit Configuration...”,然后选择“Deployment”,添加Apache-tomcat/webapps/ROOT文件夹到外部源,确保右侧的Application Context不填写。删除多余的ROOT下的ServletDemo:war exploded,完成部署。
确保在IDEA中选择正确的Tomcat服务器,配置完成后,运行项目即可访问Tomcat主页。关闭IDEA后,通过Tomcat根目录下的bin执行startup.sh启动服务。
若遇到端口被占用问题,解决方法是调整端口号或重启服务器。配置好Maven和Tomcat后,下一步编辑Java web应用的POM文件,引用Tomcat Maven插件。
配置Maven与Tomcat连接信息,包括用户名、密码以及服务器的命名引用,这允许Maven在尝试连接应用服务器时使用这些信息。确保settings.xml文件(在下载的apache-maven-3.9.1/conf目录下,根据maven安装目录查找)包含适当配置。
在POM文件中注册tomcat7-maven-plugin,并将War文件生成时所需的Tomcat用户信息加入。运行mvn install tomcat7:deploy时,若出现错误,请检查并更新POM文件中的配置信息。
生成的War文件应位于Tomcat根目录下的webapps文件夹中,对应于pom.xml中的配置名称。对比源代码文件结构,生成的War文件包含所有Java相关文件,如编写的Servlet字节码文件、依赖库(如gson、mysql connector、log4j)。
确保Tomcat服务已启动(IDEA关闭时同样有效),访问/localhost:/>,在链接后添加路径(如/rps)以访问部署的应用。
在思考总结中,了解了根目录和URL路径的概念。访问特定页面时,路径决定了访问的文件位置。Tomcat主页的URL(/localhost:/>)通常位于webapps目录中,但如果没有index.html文件,可能是因为web.xml文件中配置了welcome标签,用于指定主页文件。
回顾web.xml文件在部署应用时的作用,它允许配置welcome标签,覆盖默认主页,如在Tomcat中的配置。
本文提供了一个逐步指导,从War文件构建到部署,再到验证过程,帮助理解Tomcat和Maven在Web应用部署中的角色和相互协作。
rps指标公式源码rps指标公式
关于rps指标公式源码,rps指标公式这个很多人还不知道,今天来为大家解答以上的问题,现在让我们一起来看看吧!
1、RPS = 并发数/响应时间 = /0. 。
2、大约是/S。
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开源社区。