m6米乐安卓版下载-米乐app官网下载
暂无图片
9

丝析发解丨一个tcp性能优化点 -m6米乐安卓版下载

云和恩墨 1天前
102

最近读了一篇关于tcp性能优化的论文【1】,里面讲到一个普遍性的问题:一个tcp链接的收包和发包流程,经常在不同cpu核上运行,性能开销很大。对很多系统来说,解决掉这个问题,性能可以提升20%以上。

图1 文章摘要

1

问题描述

随着网络速度提高,网卡接收报文的速度超过了单个cpu核的处理能力,为了解决这个问题,现在的很多网卡芯片都支持rss(receive side scaling)特性,也就是把接收到的tcp报文送给多个cpu核处理。

为了保证同一条tcp链接的报文被送到相同的cpu核上,网卡会用五元组(local_addr、remote_addr、local_port、remote_port、proto)来计算一个hash值,然后根据这个hash值,把报文送入不同的接收队列,不同队列由不同cpu核负责处理。具体实现方法是:不同的接收队列对应不同的中断号码,这些中断号码会被路由到不同的cpu核上去;网络报文到达后,通过中断通知cpu核,然后linux内核会唤醒这个核上的软中断处理流程,在软中断中运行tcp接收报文的代码路径;然后唤醒上层应用线程,调用recvmsg()把报文从内核拷贝出去。也就是说,内核tcp的接收处理路径,是由网卡的rss的hash算法,以及网卡的接收队列中断和cpu核之间绑定关系决定的。

linux内核的tcp发送处理路径,是与应用线程在同一个cpu核上。如果不做特殊处理,同一条tcp链接的接收流程和发送流程大概率是在不同cpu核上处理的。

由于接收流程和发送流程都需要访问tcp链接的数据结构,它们在不同cpu核上运行,就需要锁来保证互斥访问,会产生锁竞争。这些tcp数据结构频繁在不同cpu核的l1/l2 cache之间迁移。锁竞争和cache中数据的频繁迁移会产生很大性能开销。设法让同一条tcp的接收和发送流程在同一个cpu核上运行,成为优化tcp性能的一个重要方向。

图2 多核cpu的tcp接收和发送

2

现有方案

流定向,即flow direct,简写为fd或fdir。有些网卡内部集成了一个路由表,软件可以配置这个路由表来决定某个特定tcp链接的报文被送到哪个接收队列中。一般来说,这个路由表中可配置的表项数量有限,也不是所有高速网卡都支持。

intel某些型号网卡支持application targeting routing(atr),网卡自动配置fdir路由表,把tcp接收队列调整到发送流程所在的cpu核上,也不是所有网卡都支持这个特性。

除了上面这些网卡硬件实现的特性之外,linux内核软件也实现了一些类似的特性。rps是软件实现的rss,由一个cpu核来处理网卡接收报文,然后把报文分发到多个cpu核上去,rfs可以把报文分发到上层应用所在的核。

本文开头提到的《improving network connection locality on multicore system》论文【1】,提出了一个新方法。应用可以在多个线程中同时调用accept(),linux内核选择这个新tcp链接的接收流程所在的cpu核返回accept()。这样处理这个tcp链接的应用线程所在的cpu核跟tcp链接的报文接收流程处理cpu核很大概率是相同的。但这个方案只对服务端起作用,对客户端不起作用,似乎最新的linux内核代码也没包括这部分代码。

3

我的方法

我曾经发明过一种土方法,通过主动选择local_port,让网卡把收到的tcp消息送到应用线程所在的cpu核,从而避免tcp接收和发送在不同核上处理。

在tcp客户端调用connect()发起链接之前,先为这条链接选定一个本地端口号(local_port),并调用bind让这条tcp链接使用这个选定的本地端口号,避免让linux内核在connect的自动选择一个随机的端口号;应用通过选定本地端口号,可以控制这个tcp链接的接收流程在特定的cpu核上运行,这样就可以控制tcp的接收和发送流程在相同的cpu核上运行;参与rss的hash值计算的五元组(local_addr, remote_addr, local_port, remote_port, proto)中的有四个都是固定的,只有local_port是一个可变的,控制local_port的值,可以让hash函数算出期望的结果。如果这条tcp链接是一个集群内部的链接,使用该方法可以同时选择本地cpu核和远端的cpu核。

在 zstorage 里面,解决过很多类似的小问题,zstorage 的高性能就是靠很多个类似微创新积累起来才达到的。

【1】https://people.csail.mit.edu/nickolai/papers/pesterev-multiaccept.pdf

关于 zstorage

zstorage 是云和恩墨针对数据库应用开发的高性能全闪分布式块存储。三节点 zstorage 集群可以达到200万iops随机读写性能,同时平均时延<300μs、p99时延小于800μs。

zstorage 支持多存储池、精简配置、快照/一致性组快照、链接克隆/完整克隆、nvmeof/nvmeotcp、iscsi、cli和api管理、快照差异位图(dcl)、慢盘检测、亚健康管理、16kb原子写、2副本、强一致3副本、raft 3副本、ib和roce、tcp/ip、后台巡检、基于merkle树的一致性校验、全流程trim、qos、scsi pr、scsi caw。

zstorage 是一个存储平台,可作为数据库产品和存储产品的底座,欢迎发邮件至 marketing@enmotech.com 咨询。

作者简介


黄岩,云和恩墨分布式存储软件总架构师,十余年存储研发经验,在nas和备份领域有深入钻研,曾担任某nas产品性能se,负责产品性能调优工作,该产品在2011年打破了specsfs性能测试世界纪录。

「墨读时刻」特别节目:黄岩人物专访,听一位存储老兵讲述摸爬滚打的这些年和对未来自研存储的洞察,点亮让我知道你在看哦~


数据驱动,成就未来,云和恩墨,不负所托!


云和恩墨创立于2011年,以“数据驱动,成就未来”为使命,是智能的数据技术提供商。我们致力于将数据技术带给每个行业、每个组织、每个人,构建数据驱动的智能未来。

云和恩墨在数据承载(分布式存储、数据持续保护)、管理(数据库基础软件、数据库云管平台、数据技术服务)、加工(应用开发质量管控、数据模型管控、数字化转型咨询)和应用(数据服务化管理平台、数据智能分析处理、隐私计算)等领域为各个组织提供可信赖的产品、服务和m6米乐安卓版下载的解决方案,围绕用户需求,持续为客户创造价值,激发数据潜能,为成就未来敏捷高效的数字世界而不懈努力。

文章转载自,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

网站地图