(1)
不进入这个行当,很少会知道,人们对低延时的渴求。专业人士为了低延时,做过各种各样的努力。以往我们将数据库的某些SQL从秒级优化到毫秒级,至少会在心底里欢呼一下,百倍提升!但在这个行业,人们为了减少1毫秒,可以做出什么疯狂的事情呢?
2009年夏天,交易员斯皮维耗费3亿美元,“砸穿了美国坚硬无比的阿勒格尼山脉,将过去的网络线路缩减了100英里“,将芝加哥南部的数据中心与新泽西北部的股票交易市场连接起来,最终让网络时延减少了1毫秒。””仅这1毫秒,就可以让华尔街金融机构们首先获取芝加哥和纽约交易所的差价,供其每年获得200亿美元利润。“
2010年底,美国宽带服务商Hibernia Atlantic启动了Project Express,铺成首条横跨大西洋的海底电缆。这个计划耗资2.5亿美元,令伦敦和纽约之间的交易信号传播速度快了5毫秒。
以某证券交易所为例,其最新交易系统每秒进行300000笔交易,交易系统按0.1微秒为最小单位进行业务排队,即当两个人同时提交了一笔交易申请,同样的价格,提前0.1微秒到达的交易将会先成交。先人一步,带来的就是利润的差别。与此同时,深港通、沪深500指数等均需要多地交易数据近乎实时(追求零时延)的传递。
而最新的延时传输精进到了什么地步呢?皮秒(picosecond,符号是ps)原先是天文学的名词,已然来到了极速交易领域。皮秒到底是多长时间呢?1,000 皮秒 = 1纳秒;1,000,000 皮秒 = 1微秒;1,000,000,000,000 皮秒 = 1E12皮秒=1秒。普通人的最快反应时间是0.2秒,经过训练的人的最快反应时间也不会低于0.1秒。皮秒意味着什么呢?只能依赖极速程序,跟人无关。这也是华尔街大量的经纪人失业的重要原因。应该就在10月的QCON会议上,摩根士丹利的人居然来分享DevOps了,这又意味着什么呢?一切都已经在改变,墨守成规就是完蛋。
业界大概有这么个说法
慢5毫秒,损失1%的利润
慢10毫秒,损失10%的利润
1毫秒延时=400万美元损失
这不,某公司软件提升60%实现端到端3微秒。埋个坑,FPGA。相信,你估计没听过,就算你听过,也不太理解这是啥玩意。9月24号在深圳STAC峰会,大部分时间跟此相关,说真的也是听得懵懵懂懂的,一句话,无法绕开的牛逼。
用当年MBA的Selina Zhao同学的分享标题来说,就是Let's CHA,CHA,CHA! Challenge,Change,Chance!
(2)
金融服务市场特性决定了系统必须要求低延迟并且具有稳定的系统性能,这样才能支持高频交易、市场数据接收分发和交换数据处理。当然,在实时信号和图像处理等其他行业也有类似要求,但它们往往可以有其他解决方案,比如前几年云计算大卖,更多是卖给游戏和视频行业的CDN。
这些系统,就算是在负载压力很高的情况下(比如每秒数百万个事务。当然,往往并达不到这个量级,除了交易所。)必须以可预测的方式快速响应外部事件。为了达到这一性能水平,信息中心相关负责人在系统设计和配置过程中必须考虑以下因素:
•硬件:系统设计、处理器类型和速度;内存延迟、速度和容量;网络组件;存储子系统,包括固态硬盘。
•操作系统:选择操作系统内核专门为最小延迟和实时抢占而设计和调整
•BIOS:配置BIOS支持配置为最小延迟和最大性能
•网络:网络设备技术,1/10/25/40Gb以太网、Infiniband、光纤、Exablaze等。低延时网卡及驱动:用于Mellanox ConnectX-4 LX的VMA和用于SolarFlare Flareon X1/X2的OpenOnload。
•应用程序:设计用于通过内核旁路和RDMA技术加速执行多播消息的最终用户应用程序。本文第(1)部分的60%提升,就是应用层结合SolarFlare网卡驱动所带的TCP Direct功能及其他调优,将下单函数的时间消耗减少了60%.(注,基于超频机 4.8Ghz。如果是Dell740 3.6Ghz则是35%)。
•物理距离:信息源和客户机之间的物理距离当然影响整个系统性能延迟,比如上海-深圳专线延迟在20ms左右(有没有人告诉我,最佳是多少?)。
本篇主要介绍说下跟低延迟相关的BIOS配置和Linux操作系统优化的建议,主要针对Gen10的HPE Synergy计算模块以及HPE ProLiant DL系列服务器获得最低延迟性能。
Disable系统管理中断(SMI)的建议仅适用于对延迟非常敏感的系统,其他应用系统大可不必。大多数客户都能从SMI支持的节能、监视和通知中获益。
低延时系统的硬件配置建议:
1)一个socket上的核数尽可能少,Gen10最佳就是8核。当然,可以想象的,必须关闭SMT。别的不说,核多了,你看/etc/interrupts的时候得疯。
-自动PCI2core关联(应用程序无需改写或特意设定)。
-数据Direct I/O性能最佳。
—消除缓存窥探(snooping)。
-没有UPI(intel Ultra Path Interconnect)延迟。
-简化了CPU核心映射。
2)内存:
-每个channel 2根 8GB的DDR4-2666MT/s CAS-19 RDIMMs
-如果每个channel只配一根,用Dual-Rank 2666MT/s 16 GB RDIMMs
-每个channel必须至少配一根内存。否则如上一篇文章所说,这个CPU socket就白费了。
3)PCIe Gen3 架构
-DL380Gen10中,每个Processor(这里是指每个node/socket)上有2个x8 slot的PCI插槽和1个x16 slot的PCI插槽。可以选配第三块提升板,再加2个x8 slot的PCI插槽。
-DL360Gen10中,processor 1上可以提供2个x8或更多通道数的PCI,processo2上是1个x16的PCI插槽。
如下是PCIE的通道标准,不同通道的传输速率不一样。
4)PCIe网卡
-原生支持Mellanox网卡
-其他第三方厂家的网卡支持:SolareFlare、Myricom、Chelsio及Exablaze
5)存储
-新的HPE P408X和P816x存储控制器,提供12Gbs的SAS性能
(3)机器的低延迟配置(仅针对HPE,其他厂家的不适用)
做低延迟配置测试,会用到下面一些工具。做任何优化之前,用下面的工具做个快照或者性能、配置备份,以便跟踪什么配置提升/降低了性能。
• dmidecode
• lspci -vv
• iLO RESTful Interface tool (for ProLiant Gen9 and later servers)
• hpdiscovery
• CONREP (for ProLiant Gen9 and earlier servers)
iLO4的V2.20firmware版本发现有每15秒一次低延时抖动。建议下载最新的iLO驱动程序。
后续的所有改变实施之前,都确认先更新好firmware版本。下载方法如下:
Download the latest HPE SPP ISO image, and then upgrade the firmware using the instructions included with the ISO. The HPE SPP can be used in online mode from either a Windows- or Linux-hosted operating system, or in offline mode by booting to the ISO.
00001.
还要更新最新的BIOS,如果SPP中不包含,则通过下面的路径去下载:
BIOS调优建议:
1、用前面的方法做个快照
2、用HP-TimeTest7.3做个抖动数据出来
3、备份kernel boot设置
o For UEFI systems (Gen9 and Gen10)
• cat /boot/efi/EFI/redhat/grub.conf (for RHEL)
• cat /boot/grub.conf (for SLES 12)
4、更新BIOS
5、准备服务器,参照"Preparing Linux-based servers for low-latency tuning"
6、按推荐值调整BIOS设置
7、调优推荐
(1)通过RBSU(ROM-based Utility)调优
(2)通过HPE iLO RESTful接口工具调优(Gen9&Gen10)
(3)为低延迟配置做准备
BIOS环境的低延时配置表:
参数 | 值 | 描述 | HPE generation |
---|---|---|---|
Workload Profile | Low latency | 允许同时设置一组BIOS选项以适应目标应用程序类 | Gen10 |
Intel Hyperthreading Options | Disabled | 允许超线程 | Gen8 以上 |
Intel Turbo Boost Technology | Disabled | 允许超频 | Gen8 以上 |
Intel VT-d | Disabled | 启用 virtualized Directed I/O | Gen8 以上 |
Thermal Configuration | 首先尝试最佳冷却,然后增加,直到最大冷却。 | 通过RBSU设置 | Gen8 以上 |
HPE Power Profile | Maximum Performance | 禁用所有电源管理选型,会损坏性能 | Gen8&Gen9 |
HPE Power Regulator | HPE Static High Performance Mode | 处理器保持其最大功率/性能状态 | Gen8 以上 |
Intel QPI Link Power Management | Disabled | 不(将未使用的QPI链路置于低功耗状态) | Gen8&Gen9 |
Intel UPI Link Power Management | Disabled | 不(将未使用的upi链路置于低功耗状态) | Gen10 |
Minimum Processor Idle Power Core C-State | No C-States | 阻止处理器转换为低功耗核心为C-States | Gen8 以上 |
Minimum Processor Idle Power Package C-State | No Package State | 阻止处理器转换到低功耗包C-States | Gen8 以上 |
Energy/Performance Bias | Maximum Performance | 为高性能/低延迟配置处理器子系统 | Gen8 以上 |
Collaborative Power Control | Disabled | 阻止操作系统更改时钟频率 | Gen8 以上 |
Dynamic Power Capping Functionality | Disabled | 允许在启动过程中禁用系统ROM电源校准 | Gen8&Gen9 |
QPI Snoop Configuration* | Early Snoop, Home Snoop, or Cluster on Die | Gen9 | |
ACPI SLIT Preferences | Enabled | 支持SLIT的操作系统可以使用这些信息通过更有效地分配资源和工作负载来提高性能。 | Gen8 以上 |
Processor Power and Utilization Monitoring | Disabled | 禁用ILO处理器状态模式切换 | Gen8 and Gen9 |
Memory Pre-Failure Notification | Disabled (gen8&gen9)Enabled(Gen10) | 禁用内存故障前通知 | Gen8 以上 |
(4)
先来看看HPE为低延时(宽频交易)准备的新品硬件:
没过多可解释的,上面基本都提到过了,注意有个新东西Aruba 2920 24G Switch。
以下针对Linux的配置优化,仅针对该机型。HPE比较操蛋的是,每个机型配置都会改变,Dell不知道是不是这样。
(1)启动文件/etc/default/grub中的“GRUB_CMDLINE_LINUX” 里 ,要加这么一串(注意,Gen9&G8不完全是这样哦):
nosoftlockup intel_idle.max_cstate=0 mce=ignore_ce isolcpus=1-7,9-15 nohz=on nohz_full=1-7,9-15 rcu_nocbs=1-7,9-15 rcu_nocb_poll transparent_hugepage=never audit=0 nmi_watchdog=0 processor.max_cstate=0 nohz=on hugepagesz=2MB hugepages=3000 default_hugepagesz=2MB selinux=0 elevator=noop skew_tick=1 idle=poll
保存完要运行:
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg ((UEFI configurations))
或
grub2-mkconfig -o /boot/grub2/grub.cfg (non-UEFI configurations)
(2)禁用错误检测EDAC( Error Detection and Correction )
步骤如下:
1.查看EDAC是否启用
#lsmod | grep edac
2.如果有发现EDAC模块,则在
。在支持modprobe的OS版本中/etc/modprob.conf加入一行
alias edac_xxx off
。在支持backlist的OS版本中/etc/modprobe.d/blacklist.conf加入一行
blacklist edac_xxx:
(3)设置tuned file.
# tuned-adm profile latency-performance (RHEL 6) or
# tuned-adm profile network-latency (RHEL 7 and SLES 12)
然后重启服务器。
(4)重启完成后,用下面的命令(可以存成一个stop-service.sh文件)关停一堆服务。注意哈,仅限RHEL7,其他OS版本不适用。
for SERVICE in \
avahi-daemon.service crond.service dnsmasq.service
firewalld.service lvm2-monitor.service postfix.service
rpcgssd.service rpcidmapd.service rpcsvcgssd.service
wpa_supplicant.service irqbalance.service
do systemctl disable $SERVICE
systemctl stop $SERVICE
done
但是,irqbalance这个服务有点妖怪,上述命令运行完之后还要单独处理。步骤如下:
A.用下面的命令运行IRQ平衡器,其中“CoreMask”要填写我们不想让OS中断干扰到的CPU:
# IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
B.然后运行是sysctl irqbalance.service status检查。直到返回结果是“irqbalance is stopped”为止。
怎样改变IRQ的亲和性呢?
Consider changing the smp_affinity for the IRQs. For example, on a server on which you want to leave core 0 for the OS, the following masks off the other processors for all IRQs:
for MF in `find /proc/irq -name *smp_affinity` ; do awk -F, \ '{for(i=1;i<NF;i++)printf("00000000,");printf("%8.8x\n",and(0x00000001, strtonum("0x"$NF)))}' \$MF > $MF ; done
Consider using cset (http://code.google.com/p/cpuset/) to shield cores from the OS. For example, on a server on which you want to keep the OS from all cores except for 0, use the following command:
# cset shield --cpu 1-15 --kthread=on
• If running as root, the following command can then be used to move the current PID to the "user" set of cores:
# cset proc --move --pid=$$ --threads --toset=user
关于测延迟抖动,可以用openonload的jitter,也可以用HPE的TimeTest。实话说,两个工具用起来都不太方便。贴2个图先看看:
HPE-TimeTest图中,可以看到大约每8秒有个抖动。
sysjitter图可以看到,大概每15秒有个抖动event发生,最大event5.98微秒。
这是一种常见的情况,在大多数统计数据中都被忽略。由于linux调度器不可避免的中断,每个内核每秒都会经历一对抖动event(纠正方法如前所述)。
参考:
1.https://baike.baidu.com/item/pcie
2.Configuring and tuning HPE ProLiant Servers for low-latency applications
3.HPE Reference Configuration for Trade and Match Solution
4.HPE Gen10 Servers Intelligent System Tuning
本系列文章:
关于作者:
Oracle ACE
腾讯云最具价值专家TVP
博文视点大数据图书专家委员会专家
已翻译出版《Oracle 核心技术》《Oracle Exadata专家手册》,在即将出版的《DAMA数据管理知识体系指南(第2版)》中翻译了其中6、11章,校对了1-2、13-17章。