Web服务器如何实现高吞吐低延迟?Dropbox从操作系统到应用层优化指南

导读:本文是 Dropbox 对其如何优化网络延迟问题的经验总结。本文内容覆盖了从硬件选型到 Web 服务器优化的整个技术栈,值得大家收藏深入学习。


这是我在 2017 年 9 月 6 日在 NginxConf 2017 上演讲的扩展版。作为 Dropbox Traffic Team 的 SRE,我负责边缘网络优化,主要包括可靠性,性能和效率Dropbox 边缘网络 [1] 基于 Nginx 代理,旨在处理延迟敏感的元数据事务和高吞吐量数据传输。 在处理数万个延迟敏感事务的同时,处理数以千计的延迟敏感事务,在整个技术栈中,从对驱动程序和中断,到 TCP/IP 和内核还有库和应用程序进行效率/性能优化。


免责声明


在这篇文章中,我们将讨论很多调整 Web 服务器的方法。你需要使用科学的方法测量它们的效果,并确定在你的环境中是否确实起作用。


这不是一篇有关 Linux 性能调优的文章,即使我将对 bcc 工具, eBPF[2] 和 perf 进行大量的引用,这绝对不是使用性能分析工具的综合指南。 如果您想了解更多信息,您可能需要阅读 Brendan Gregg 的博客 [3]。


这也不是专注于浏览器性能的帖子。 在覆盖延迟相关的优化时,我将会触及客户端的性能,但只能简单地介绍。 如果您想了解更多,您应该阅读 Ilya Grigorik 的“ 高性能浏览器网络” [4] 。


而且,这也不是 TLS 最佳实践汇编。 虽然我会提到一些 TLS 库及其设置,您和您的安全小组应评估其中每一个修改和设置的性能以及安全性。 您可以使用 Qualys SSL Test [5],根据当前的最佳做法来进行验证,如果您想了解更多关于 TLS 的信息,请考虑订阅 Feisty Duck Bulletproof TLS 通讯 [6]。


本文结构


我们将讨论系统在不同层次上的效率/性能优化。 从硬件和驱动程序开始(这些调优可以几乎应用于任何高负载服务器), 到 Linux 内核及其 TCP / IP 协议栈(在任何使用 TCP / IP 协议栈的应用都可以尝试),最后我们将讨论库和应用程序级别的调整(这些调整主要适用于一般的 Web 服务器和 Nginx)。


对于每个潜在的优化领域,我将尝试给出延迟/吞吐量权衡,监控指南以及最后针对不同工作负载的调整建议。


硬件


(对硬件调优不感兴趣的读者可以直接跳到操作系统部分)


CPU


如果需要提高非对称 RSA / EC 的性能,则需要至少具有 AVX2( avx2 in /proc/cpuinfo )支持的处理器,最适合的是具有大整数运算 [7] 能力的硬件(支持 bmi 和 adx )的处理器。 对于对称加密的情况,需要支持 AES-NI(针对 AES)和 AVX512(针对 ChaCha + Poly)的硬件。 英特尔有一个针对 OpenSSL 1.0.2 在不同硬件产品性能比较 。


延迟敏感的场景,将受益于更少的 NUMA 节点和禁用 HT。 高吞吐量的任务在多核心上运行得更好,并且将受益于超线程(除非它们具有缓存限制),并且通常不会关心 NUMA。


具体来说,如果选用英特尔硬件,你至少要找 Haswell / Broadwell(理想情况需要 Skylake CPU)。 如果您正在使用 AMD, EPYC 的表现非常好。


NIC


在这里你至少要找 10G,最好甚至 25G。 如果您想通过单个服务器 (TLS) 进行推送,则此处所述的调整将不够,您可能需要将 TLS 框架调整进入内核级别(例如 FreeBSD , Linux )。


在软件方面,您应该查找具有活动邮件列表和用户社区的开源驱动程序。 如果您将调试与驱动程序有关的问题,这非常重要。


内存


这里的经验法则是延迟敏感的任务需要更快的内存,而吞吐量敏感的任务需要更多的内存。


硬盘


这取决于您的缓冲/缓存要求,但如果要缓存很多文件,您应该使用闪存。 有些甚至使用专门的 Flash 友好的文件系统(通常是日志结构的),但是它们未必比普通的 ext4 / xfs 更好。


无论如何,请不要因为您忘记了启用 TRIM 或更新固件而引起一些故障。


操作系统:低级别


固件


您应该保持您的固件是最新的,以避免痛苦和冗长的故障排除过程。 尝试使用最新的 CPU 微码,主板,网卡和固态硬盘的固件。 这并不意味着你需要保持最新固件,这里的经验法则是运行次新固件,除非它在最新版本中修复了严重错误。


驱动程序


这里的更新规则与固件几乎相同。 尽量保持次新的状态。 这里的一个注意事项是尝试将内核升级与驱动程序更新分离。 例如,您可以使用 DKMS 打包驱动程序,也可以为您使用的所有内核版本预先编译驱动程序。 这样当您更新内核并且某些功能无法正常工作时,您只需少量处理故障。


CPU


这里最好的助力是内核仓库和工具。 在 Ubuntu/Debian 中,您可以安装 Linux-tools 软件包,其中包含几个 Linux-tools ,但现在我们只使用 cpupower, x86_energy_perf_policy 和 x86_energy_perf_policy 。 为了验证与 CPU 相关的优化,您可以使用自己喜欢的负载生成工具(例如, Yandex 使用 Yandex.Tank )对软件进行压力测试。以下是来自开发人员的最新 NginxConf 的演示文稿,介绍了有关 Nginx loadtesting 最佳做法的内容:“Nginx 性能测试” [7] 。


cpupower

使用这个工具比抓取 /proc/ 更容易。 要查看有关您的处理器及其调速器的信息:


0?wx_fmt=png


检查是否启用了 Turbo Boost,对于 Intel CPU,请确保您正在运行 intel_pstate ,而不是 acpi-cpufreq ,甚至是 pcc-cpufreq 。 如果您仍然使用 acpi-cpufreq ,那么您应该升级内核,否则可能会导致使用 performance 调节器。 当使用 intel_pstate 运行时,甚至 intel_pstate 应该表现得更好,但是您需要自己验证。


说到空闲,看看 CPU 发生了什么改变,你可以使用 turbostat 直接查看处理器的MSR并获取电源,频率和空闲状态信息:


0?wx_fmt=png


在这里,您可以看到实际的 CPU 频率, 以及核心/包空闲状态 。

如果即使使用intel_pstate驱动程序,CPU 会花费比您想象的更多的空闲时间,您可以:


  • 将 governor 设为 performance 。

  • 将 x86_energy_perf_policy 设置为性能模式。


或者,只有对于非常延迟的关键任务,您可以:


  • 使用 /dev/cpu_dma_latency 接口。

  • 对于 UDP 流量,请使用 busy-polling 。


您可以从 LinuxCon Europe 2015 了解更多关于处理器电源管理和P状态相关资料,特别是英特尔 OpenSource 技术中心演示文稿“ 平衡 Linux 内核中的功能和性能 ”。


CPU 亲和性


您可以通过在每个线程/进程上应用 CPU 关联来额外减少延迟,例如,nginx 具有 worker_cpu_affinity 指令,可以将每个 Web 服务器进程自动绑定到其自身的核心。 这应该可以消除CPU迁移,减少高速缓存未命中和页面缺失。 所有这一切都可以通过 perf stat 验证。


可悲的是,启用亲和力也可能会因为增加进程花费等待可用 CPU 的时间量来对性能产生负面影响。 这可以通过在您的一个 nginx 工作者的 PID 上运行 runqlat 进行监控:


0?wx_fmt=png

如果您看到多毫秒的尾部延迟,那么除了&nb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值