Linux系统网络性能实例分析( 二 )
文章插图
文章插图
3、 网络负荷中的进程与IRQ亲合性亲合性或绑定的含义是指强制只在选定的一个或多个 CPU上执行进程中断的过程 。 在多处理器系统中 , 基于操作系统调度器使用的策略 , 在特定条件下可以将一个处理器上的进程迁移到其他处理器 。 通过将进程保持在同一个处理器——这强制调度器将某个特定任务调度到指定 CPU上——可以极大提高所需数据存在于 cache中的概率 , 从而可以减少内存延迟 。 有些情况下 , 即使进程被限定在同一个 CPU上调度 ,诸如大型工作集以及多进程共享同一个 CPU等因素也常常导致清空 cache , 因此进程亲合性可能无法在所有情况下都起作用 。 本章给出的实例分析非常适于利用进程亲合特性 。Linux内核实现了下列两个系统调用 , 以便执行进程与处理器的绑定操作:
asmlinkage int sys_sched_set_affinity(pid_t pid, unsigned int mask_len,unsigned long *new_mask_ptr);asmlinkage int sys_sched_get_affinity(pid_t pid, unsigned int*user_mask_len_ptr, unsigned long *user_mask_ptr);
sched_set_affinity()系统调用还确保在恰当的一个或多个 CPU 上运行目标进程 。 sched_get_affinity(pid,&mask_len,NULL)可用于查询内核所支持的 CPU位屏蔽码长度 。进程亲合性意味着将进程或线程绑定到某个 CPU上 。 IRQ亲合性意味着强制在某个特定 CPU上执行具体 IRQ的中断处理 。 在 Linux中可以使用/proc接口设置 IRQ亲合性 。 通过确定 I/O接口所用的 IRQ , 然后修改该特定 IRQ的屏蔽码 , 可以设置 IRQ亲合性 。 例如 , 以下命令将 IRQ 63设置到 CPU 0 , 并将 IRQ 63所生成的中断发送到 CPU 1上
echo "1" > /proc/irq/63/smp_affinity
进程亲合性与IRQ亲合性是改进应用程序和系统的吞吐率及扩展性的通用性能优化实践 。 这些方法都要求识别出一个应用程序的所有进程并对其加以隔离 , 还需要识别出中断以便将其映射至应用程序的进程和运行这些进程的处理器 。 因此 , 这种“ n对 n”的映射关系在复杂环境下并不总可行 。Netperf3示例分析清晰表明 , IRQ与进程亲合性的应用改善了Linux网络的 SMP扩展性和网络吞吐率性能 。 在该例子中 , 使用了 Netperf3的多适配器支持能力来测量网络扩展性 。 它对每个 NIC都创建一个进程 ,该进程绑定到 4个 CPU中的某个 CPU以及某个 NIC上 。 该 NIC将由该进程使用并与之绑定到同一个CPU 。 一个 Netperf3进程的处理操作是被隔离的 , 并且对某个 NIC所生成的中断的执行操作被隔离到单个处理器上 。 在 Netperf3服务器上使用 TCP_STREAM测试来完成这个过程 。在服务器上 , 该工作负荷进行繁重的数据接收处理操作 , 会产生多次数据拷贝操作(将数据从 NIC复制到内核内存中 , 再从内核内存中复制到应用内存中) 。 绑定机制提高了性能 , 因为这些复制操作在单个处理器上完成 , 从而无需将数据加载到两个不同的处理器 cache中 。 如果同时应用这两个亲合性的话 , 那么绑定机制可以减少内存延迟 。 尽管可以单独使用IRQ亲合性或进程亲合性 , 但组合使用时能够进一步提高性能 。
需要C/C++ Linux高级服务器架构师学习资料后台私信“资料”(包括C/C++ , Linux , golang技术 , Nginx , ZeroMQ , MySQL , Redis , fastdfs , MongoDB , ZK , 流媒体 , CDN , P2P , K8S , Docker , TCP/IP , 协程 , DPDK , ffmpeg等)
文章插图
4、 NAPI
为了改进在繁重中断载荷条件下的 Linux网络性能 , 开发了网络设备驱动程序 API(NAPI) 。 系统的负荷可用于确定是否采用轮询(polling) 或中断机制来处理输入数据以便改进性能 。 轮询机制在中断负荷较重时可以改进性能 ,但当中断负荷较轻时会浪费 CPU周期 。 中断机制在较低的中断负荷情况下可以改进延迟 , 但当中断负荷超过了最大无损转发率(Maximum Loss Free Forwarding Rate ,MLFFR)时 , 会导致系统对于活锁(live lock)是脆弱的 。 NAPI只适用于实现了DMA缓冲区环的 NIC 。 当网络报文到达时 ,NAPI被置入环上的下一个缓冲区中 。 通常 , 对于每个报文 ,处理器都会被中断并且系统从环中清除该报文 。 当 NAPI被激活时 , 响应第一个中断 , 通知 NIC停止中断 。 然后 NAPI在环上轮询 。NAPI在处理报文过程中 , 可以取出新报文而无需更多中断 , 从而极大减少了接收中断 , 这有助于系统在繁重的网络负荷条件下正常运行 。Linux 2.5内核中的 NAPI实现使得网络设备驱动程序员无需在每个驱动程序中人工实现轮询 , 还可以管理中断泛洪 , 并保护系统免受拒绝服务(Denial of Service ,DoS)攻击 。 由于中断处理程序的 CPU开销 , 在没有 NAPI支持的情况下泛洪的最高限额要低得多 。 NAPI也消除了编制大量代码来实现NIC硬件中断缩减(interrupt mitigation)解决方案的需求 。 为了利用 NAPI的优点 , 网络设备驱动程序需要使用新的网络 API(NAPI) 。 当前 , 许多网络设备驱动程序都提供对 NAPI的支持 。 Intel Gigabit Ethernet等网络驱动程序将NAPI作为一个可构建在驱动程序中的选项 ,而诸如 BroadComTg3等驱动程序默认地支持 NAPI 。 如果网络驱动程序不使用 NAPI特性的话 , 则内核中的 NAPI代码也不被使用 。
- 闲鱼|电诉宝:“闲鱼”网络欺诈成用户投诉热点 Q3获“不建议下单”评级
- 峰会|这场峰会厉害了!政府企业专家媒体共议网络内容生态治理
- 网络覆盖|爱立信:2020年底,将有超过10亿人口获得5G网络覆盖
- 缩小|调整电脑屏幕文本文字显示大小,系统设置放大缩小DPI图文教程
- Win10系统桌面|手机桌面秒变Win10电脑系统,这波操作太给力了!
- 系统|电子邮箱系统哪家好?邮箱登陆入口是?
- 星期一|亚马逊:黑五与网络星期一期间 第三方卖家销售额达到48亿美元
- 车轮旋转|牵引力控制系统是如何工作的?它有什么作用?
- 机器人|网络里面的假消息忽悠了非常多的小喷子和小机器人
- iphone12|菜鸟网络原副总裁被捕!此前多名高管被判刑