如何使用火焰图来分析服务器负载

LucidChart 提供在线编辑流程图、网络拓扑图、ER 图、 UML 图以及脑图等多种图表服务,有超过 7 百万的用户,因其简单直观的交互体验和强大的多人协作功能,是可以替代 Visio 的最佳选择。

在 Lucid,我们使用面向服务的架构来建设我们的系统。其中字体服务(font service)就是其中之一,它负责根据字体族名称和 unicode 编码范围来提供相应的字体服务,同时也对用户上传的字体进行校验和检查。在生产环境中,该服务的负载一直很高,这一点超出我们的预期(使用或等待 CPU 的平均线程数)。特别从去年开始,我们注意到字体服务的负载高的惊人,特别是在晚上这样的流量低峰时期。

幸运的是最终我们找到了根本原因,并通过改进大大提高了服务的整体性能和稳定性。通过下面的内容,您将了解到我们是如何做到的。

图1: 字体服务在变更前后服务器平均负载对比

通过火焰图来调试和发现问题

我们从 Netflix 找到了一个非常棒的火焰图工具,并部署到生产环境。 此工具可以将多个不同调试分析工具的数据组合在一起并生成火焰图,以可视化的方式展示服务器和 JVM 的资源使用情况。

如下图所示,每个矩形表示一个栈帧,同时矩形的宽度代表了资源(比如 CPU 时间)的使用情况,Y 轴表示调用栈。通过识别那些宽的矩形块,就能快速缩小问题范围。在调试和排查字体服务时,它极大地帮助了我们。

图2: 高负载时字体服务中一台服务器的火焰图

在高负载状态下,我们对字体服务收集数据并生成了几个火焰图。下图是其中之一,并且特别展示了 JVM 相关栈的部分。可以分析得出,大部分时间都花在了 libz.so 这一步(gzip 使用该库进行压缩/解压缩操作),剩下大部分时间都花在了 XML 转义和 UTF-8 编码上。

图3: JVM 相关栈活动的局部火焰图

找到慢的原因

首先多啰嗦几句这个字体服务的一些背景情况。我们将所有字体相关数据存储在 Amazon S3 中,具体来说是将每个字体的每个 unicode 范围分别存为一个 S3 object。当其他服务请求为了获取字体族,一组 unicode 范围,或者是用户自定义字体时会向字体服务请求字体数据,接着字体服务将字体数据包裹在 XML 中返回。

功能非常简单,并没有什么明显的密集型计算。但是对于出现的高负载问题,火焰图帮助我们识别出了问题所在—— libz,XML 转义和 UTF-8编码都使用了大量的 CPU。

但是为什么会产生这么多编码和压缩的消耗?记得前面提到晚上时间的负载反而是最高的吗?我们的晚上(美国山区时间)正好是亚洲地区的白天,该地区很多用户都使用中文、日文或韩文等亚洲语言。会进行大量的 gzip 解压缩 → UTF-8解码 → XML 转义 → UTF-8编码 → gzip 压缩。相比于拉丁语系,单个 CJK 的 unicode 范围比拉丁语系的 unicode 范围大2个数量级(1MB:60KB)。所以上述的转换过程都压到了 CPU 上,特别压缩和解压缩,以及 XML 转义这类操作。

如何改进?

字体服务对请求的响应本质上只是 S3 上原始数据的集合。它确实需要执行一些重要的附加任务,如权限检查和从字体族中检索名称。但是,字体服务根本没必要挡在 S3 前面来代理那些字体数据!所以解决办法很简单, 直接用包含 S3 object 的链接(就是那些字体数据)的列表作为响应返回,字体服务不再从 S3 下载并重新编码字体数据。所以从图1中可以看出负载几乎降低到可忽略的程度。

总结

通过调试分析生产环境,我们能够找到并消除那些不必要的任务和工作,进而降低服务器负载。

使用例如火焰图之类的分析工具(profiling tool)来帮助识别 CPU 高占用的操作。

压缩/解压缩和各种编码/解码的操作都是昂贵的。

如果客户端可以直接访问数据,那么相比代理(客户端去请求)数据,直接返回链接是最好的选择,可以显著提高整体性能。

本文作者:佚名

来源:51CTO

时间: 2024-10-01 07:58:10

如何使用火焰图来分析服务器负载的相关文章

使用火焰图分析CPU性能回退问题

使用火焰图分析CPU性能回退问题 你能快速定位CPU性能回退的问题么? 如果你的工作环境非常复杂且变化快速,那么使用现有的工具是来定位这类问题是很具有挑战性的.当你花掉数周时间把根因找到时,代码已经又变更了好几轮,新的性能问题又冒了出来. 幸亏有了CPU火焰图(flame graphs),CPU使用率的问题一般都比较好定位.但要处理性能回退问题,就要在修改前后的火焰图之间,不断切换对比,来找出问题所在,这感觉就是像在太阳系中搜寻冥王星.虽然,这种方法可以解决问题,但我觉得应该会有更好的办法. 所

使用网络地址转换实现多服务器负载均衡

服务器|网络|转换 摘要:本文探讨了分布式网络服务器使用的负载均衡技术及负载分配的策略,并基于网络地址转换在FreeBSD上实现了负载均衡网关,应用于我们的Internet网络服务器上,将负载分给多个服务器分担,以解决Internet服务器面临的大量并发访问造成的CPU或I/O的高负载问题.为了达到最佳的负载均衡效果,负载控制器需要根据各个服务器的当前CPU和I/O状态来分配负载,这就需要动态监视服务器的负载,并应用优化的负载分配策略,达到平均分配负载的目的. 关键字: 负载均衡,网络地址转换,

使用网络地址转换实现多服务器负载均衡_php基础

摘要:本文探讨了分布式网络服务器使用的负载均衡技术及负载分配的策略,并基于网络地址转换在FreeBSD上实现了负载均衡网关,应用于我们的Internet网络服务器上,将负载分给多个服务器分担,以解决Internet服务器面临的大量并发访问造成的CPU或I/O的高负载问题.为了达到最佳的负载均衡效果,负载控制器需要根据各个服务器的当前CPU和I/O状态来分配负载,这就需要动态监视服务器的负载,并应用优化的负载分配策略,达到平均分配负载的目的. 关键字: 负载均衡,网络地址转换,FreeBSD 1.

rsyslog日志存储到mysql数据库中并利用loganalyzer进行web图形化分析管理

系统日志的重要性,相信大家都深有体会,当发生故障后,第一时间就是查看相关报错信息和日志信息,以定位问题所在,还可以基于日志,进行日志的分析,从而获取系统运行状态的一些规律,本篇就介绍关于系统日志的先关内容,具体分为: 1.rsyslog相关概念的介绍 2.自定义日志存储的信道(facility)和存储位置,让rsyslog作为服务端记录rsyslog客户端的日志信息 3.定义rsyslog的日志存储在mysql数据库中 4.利用loganalyzer实现对存储在mysql数据库中的rsyslog

如何私用云中的服务器负载均衡

从许多角度上来说,管理一个私有云跟管理内部数据中心是差不多的.IT管理员仍要通过几个重要的步骤来监控和平衡基础设施,但是云环境的真正成功依赖几个方面:安全.服务器密度.网络规划和负载管理. 在把工作负荷放置在"云就绪"的服务器前,管理员必须规划好他们的物理服务器环境.在这个规划阶段,云管理员可以调整环境,弄明白他们提供的工作负载并真正理解可用的资源信息. 分布式计算允许用户从多种设备,多个地点和多个时间来访问.这就意味着企业的云环境必须有能力处理用户数量浮动,特别那些用户从不同时区登录

PHP程序加速探索之服务器负载测试

程序|服务器 服务器负载太大而影响程序效率也是很常见的,我们需要对此进行测试.这里我以目前最常用的Apache服务器为例.  Apache服务器自带有一个叫AB(ApacheBench)的工具,在bin目录下.使用这个轻巧的工具我们可以对服务器进行负载测试,看看在重负荷之下服务器的表现如何.ApacheBench 可以针对某个特定的 URL 仿真出连续的联机请求,同时还可以仿真出同时间点数个相同的联机请求,因此利用 ApacheBench 可帮助我们在网站开发期间仿真实际上线可能的情况,利用仿真

ASP.NET通过DSO访问分析服务器的权限问题

asp.net|访问|服务器|问题 ASP.NET中通过Decision Support Objects(DSO)访问分析服务器的权限问题 1. 引子 先看一段代码: public class WebForm1 : System.Web.UI.Page{    private void Button1_Click(object sender, System.EventArgs e)    {        DSO.Server dsoServer = new DSO.ServerClass();

邮件服务器负载均衡大型企业部署方案

邮件服务器负载均衡在大型企业中的应用是很普遍的,市场经济下大型企业的队伍不断发展壮大,面对企业员工数量的不断增加,企业对邮件服务器也提出了更高的要求. 1. 高可用性 多台服务器进行负载均衡的同时,不会因为一台服务器的宕机而导致整个系统瘫痪. 2. 可扩展性 在不改变网路环境的情况下,添加和移除应用服务器,而不影响整体应用的性能,实现透明部署. 3. 安全性 具备IDS/IPS等安全防护措施, 能够防范诸如DOS, DDOS等攻击, 确保后台服务器不会因为黑客攻击等而影响整体系统的稳定性. 4.

四种常用方法实现服务器负载均衡

为了提高服务器的性能和工作负载能力,企业通常会使用DNS服务器.网络地址转换等技术来实现多服务器负载均衡,特别是目前企业对外的互联网Web网站,许多都是通过几台服务器来完成服务器访问的负载均衡.   目前企业使用的所谓"负载均衡服务器",实际上它是应用系统的一种控制服务器,所有用户的请求都首先到此服务器,然后由此服务器根据各个实际处理服务器状态将请求具体分配到某个实际处理服务器中,对外公开的域名与IP地址都是这台服务器.负载均衡控制与管理软件安装在这台服务器上,这台服务器一般只做负载均