- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在阅读有关 Linux 性能调整的文章,以便在接收金融市场数据时获得最快的数据包处理时间。我看到当 NIC 收到一个数据包时,它通过 DMA 将其放入内存,然后引发 HardIRQ - 这反过来设置一些 NAPI 设置并引发 SoftIRQ。 SoftIRQ 然后使用 NAPI/设备驱动程序通过轮询从 RX 缓冲区读取数据,但这只运行一段时间(net.core.netdev_budget,默认为 300 个数据包)。这些引用了运行 ubuntu 的真实服务器,带有 solarflare NIC 我的问题如下:
如果每个 HardIRQ 引发一个 SoftIRQ,并且设备驱动程序一次性读取多个数据包 (netdev_budget),那么 1 次从 RX 缓冲区中排出的每个数据包引发的 SoftIRQ 会发生什么情况(每个收到的包会先发出一个硬 irq,然后再发出一个软 irq)?这些排队了吗?
为什么 NAPI 使用轮询来耗尽 RX_buffer?系统刚产生SoftIRQ,正在读取RX buffer,那为什么要轮询呢?
据推测,通过 softirq 耗尽 RX_Buffer 只会发生在 1 个特定的 RX_Buffer 而不是跨越多个 RX_Buffer?如果是这样,那么增加 netdev_budget 可以延迟其他 RX_buffers 的处理/耗尽?还是可以通过为不同的内核分配不同的 RX_buffer 来缓解这种情况?
有一些设置可确保立即引发和处理 HardIRQ。但是,SoftIRQ 可能会在稍后处理。是否有设置/配置来确保与网络 RX 相关的 SoftIRQ 也得到最高优先级处理且没有延迟?
最佳答案
我写了一篇全面的博文,解释了您的问题的答案以及有关调整、优化、分析和理解整个 Linux 网络堆栈的所有其他内容 here .
问题的答案:
驱动程序在处理软中断时引发的 sofirq 不执行任何操作。这是因为 NAPI 帮助程序代码在尝试引发 softirq 之前首先检查 NAPI 是否已经在运行。即使NAPI没有检查,你也可以see from the softirq source softirqs 被实现为一个位向量。这意味着 softirq 只能是 1
(待定)或 0
(非待定)。当它设置为 1
时,将其设置为 1
的其他调用将无效。
softirq 用于启动 NAPI 轮询循环并控制 NAPI 轮询,因此它不会占用 100% 的 CPU 使用率。 NAPI 轮询循环只是一个 for 循环,softirq 代码管理它可以花费多少时间以及它有多少预算。
每个处理数据包的 CPU 都可以花费全部预算。因此,如果预算设置为 300,并且您有 2 个 CPU,则每个 CPU 可以处理 300 个数据包,总共 600 个。只有当您的 NIC 支持多个 RX 队列并且您已将 IRQ 分配给单独的 CPU 时才会出现这种情况加工。如果您的 NIC 没有,您可以使用 Receive Packet Steering 来帮助解决此问题 (RPS)。有关更多信息,请参阅我上面的博文。
不,没有这方面的设置。请注意,软中断在引发它们的同一 CPU 上运行。因此,如果您将 RX 队列 1 的 hardirq 处理程序设置为 CPU 16,则软中断将在 CPU 16 上运行。您可以做的一件事是:将您的 hardirq 设置为特定的 CPU,并将使用该数据的应用程序设置为相同的CPU。将所有其他应用程序(如 cron 作业、后台任务等)固定到其他 CPU——这确保只有 hardirq 处理程序、softirq 和将处理数据的应用程序可以运行。
如果您想要极低延迟的网络数据包读取,您应该尝试使用一个名为 busy polling 的新 Linux 内核网络功能。 .它可用于帮助最小化和减少网络数据包处理延迟。使用此选项会增加 CPU 使用率。
关于linux - Linux 网络上的 SoftIRQ 和快速数据包处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972854/
如何更改循环中变量的名称?比如 number1 、 number2 、 number3 、 number4 ? var array = [2,4,6,8] func ap ( number1: Int
我想设置 View 的背景颜色并在一定延迟后将其更改为另一种颜色。这是我的尝试方式: print("setting color 1") self.view.backgroundColor = UICo
我在使用 express-session 时遇到问题。 session 数据不会在请求之间持续存在。 正如您在下面的代码中看到的那样,/join 路由设置了一些 session 属性,但是当 /sur
我试图从叶渲染器获得一个非常简单的结果,用于快速 Steam 的 for 循环。 我正在上传叶文件 HTML,因为它不接受此处格式正确的代码 - 下面的pizza.swift代码- import
你们中有人有什么好的链接可以与我分享吗?我正在寻找一个 FAST 程序员编辑器,它可以非常快速地打开包含超过 100, 000 行代码的文件?我目前正在使用记事本自动取款机,打开一个 29000 行长
我现在正在处理眼动追踪数据,因此拥有一个巨大的数据集(想想数百万行),因此希望有一种快速的方法来完成此任务。这是它的简化版本。 数据告诉您眼睛在每个时间点正在查看的位置以及我们正在查看的每个文件。 X
我是新手,想为计时器或其他设备选择提示音。 如何打开此列表,以选择其中一种声音? Alert sound list 最佳答案 您将无法在应用中使用系统声音。 但是,您可以包括自己的声音文件,并将其显示
我编写了以下代码来构建具有顺序字符串的数组。 它的工作方式与我预期的一样,但我希望它能更快地运行。有没有更有效的方法在PowerShell中产生我想要的结果? 我是PowerShell的新手,非常感谢
我有一个包含一些非唯一行的矩阵,例如: x 尝试 y <- rle(apply(x, 1, paste, collapse = " ")) # y$lengths is the vector con
我的函数“keyboardWillShown”有问题。所以我想要的是菜单打开时,菜单正好出现在键盘上方。它可以在Iphone 8 plus,8、7、6上完美运行。但是,当我在模拟器上运行Iphone
我正在尝试通过Swift 5中的HTTP get方法从API提取数据。它在启动时成功加载了数据,但是当我刷新页面时,它说“索引超出范围”,这是因为数据是不再会在我的日志中读取,因此索引中没有任何内容。
我想做什么: 从我的数据库中获取时间戳并将其转换为用户的时区。 我的代码: let tryItNow = "\(model.timestampName)" let format = D
给定字体名称和字体大小,如何查找字符串的宽度(CGFloat)? (目标是将UIView的宽度设置为足以容纳字符串的宽度。) 我有两个字符串:一个重复“1”,重复36次,另一个重复“M”,重复36次。
我正在尝试解析此JSON ["Items": ( { AccountBalance = 0; AlphabetType = 3; Description = "\U0631\U
我在UINavigationBar内放置了一个UILabel。 我想根据navigationBar的高度增加该标签的字体大小。当navigationBar很大时,我希望字体大小更大;当滚动并缩小nav
我想将用户输入限制为仅有效数字并使用以下内容: func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, rep
目前我有一个包含超过 100.000 张图像的数据库,它们大小不一或类似,但我想为我的公司制作以下内容: 我插入/上传一张图片,系统返回最有可能相同的图片。我不知道使用什么算法,但它需要快速。我可以预
在我的 swift 项目中,我有一个按钮,我想在标签上打印按下该按钮的时间。 如何解决这个问题? 最佳答案 添加到DHEERAJ的答案中,您只需在func press(sender: UIButton
我必须发表评论,尝试在解析中导入数组。然而,有一个问题。 当我尝试从 Parse 加载数组时,我的输出是 ("Blah","Blah","Blah")这是一个元组...而不是一个数组 TT... 如何
我的应用程序有一个名为 MyDevice 的类,我用它来与硬件通信。该硬件是可选的,实例变量也是可选的: var theDevice:MyDevice = nil 然后,在应用程序中,我必须初始化设备
我是一名优秀的程序员,十分优秀!