在开始优化工作之前,很有必要建立一个清晰、量化的认识,关于您的特征平台当前性能特点。基准测试提供了这个基准,让您能够衡量变化的影响,识别瓶颈,并就扩展和架构做出明智的决定。如果没有系统的测量,优化就变成了猜测,有浪费精力的风险,并可能导致其他地方的性能下降。本节侧重于系统测量特征平台性能的两个主要维度的方法:在线服务延迟和离线计算吞吐量。定义基准测试目标第一步是定义哪些性能方面最重要,对于您的特定使用场景。常见目标包括:了解当前性能: 在典型负载条件下建立延迟和吞吐量的基准。识别瓶颈: 找出限制整体性能的组件或操作(例如:数据库读取、网络传输、计算步骤)。评估设计选择: 比较不同架构模式、数据模型或基础设施选择的性能影响(例如,比较两种不同的在线存储数据库技术)。容量规划: 确定所需资源,以满足预期未来负载或服务水平目标 (SLO)。回归测试: 确保代码更改或基础设施更新不会对性能产生负面影响。通常,基准测试工作侧重于两个重要方面:在线服务延迟: 特征平台为实时推理请求检索特征的速度有多快?这直接影响生产机器学习应用程序的响应速度。离线计算吞吐量: 特征平台生成或回填大量特征数据的效率如何,用于模型训练或批处理?这影响了实验和模型再训练周期的速度。在线服务延迟基准测试在线服务性能通常通过以下时间来衡量:响应来自客户端应用程序(例如,模型服务端点)的特征检索请求所需的时间。指标重要延迟指标包括:平均延迟: 所有请求的平均响应时间。虽然易于计算,但可能受异常值影响。分位数延迟 (p50, p95, p99, p99.9): 这些能够更好地了解用户体验。例如,p95 延迟表示 95% 的请求所经历的最长时间。高分位数 (p99, p99.9) 对于了解最差性能和尾部延迟问题很重要。每秒请求数 (RPS) 或每秒查询数 (QPS): 系统能处理的最大负载,同时保持可接受的延迟 SLO。错误率: 失败或超时的请求百分比。方法有效的在线基准测试需要模拟真实的生产流量模式。定义工作负载: 描述典型请求:每次调用请求的特征数量。请求特征的数据类型。实体 ID 的分布(考虑潜在的“热键”)。读/写混合(如果适用,尽管通常是读密集型)。选择工具: 使用能够模拟并发用户和特定请求模式的负载生成工具。例如 Locust, k6, Apache JMeter 或自定义脚本。这些工具允许您增加负载、维持负载并收集详细指标。配置环境: 在一个与生产环境(硬件、网络、软件版本)高度相似的环境中运行基准测试。尽可能隔离被测试的特征平台组件,以避免混杂因素。执行测试: 运行长时间测试,以观察负载下的行为,而不仅仅是初始爆发性能。改变并发级别(模拟用户),以找到延迟急剧增加或出现错误的饱和点。分析结果: 绘制延迟分布(直方图或 CDF)并跟踪 RPS 对应的分位数延迟。识别性能下降的拐点。{"layout": {"title": "在线服务延迟分布 (p95 对 RPS)", "xaxis": {"title": "每秒请求数 (RPS)"}, "yaxis": {"title": "p95 延迟 (ms)"}, "legend": {"traceorder": "reversed"}}, "data": [{"type": "scatter", "mode": "lines+markers", "name": "基线", "x": [100, 500, 1000, 1500, 2000, 2500, 3000], "y": [12, 14, 15, 18, 25, 45, 70], "marker": {"color": "#4263eb"}}, {"type": "scatter", "mode": "lines+markers", "name": "优化后", "x": [100, 500, 1000, 1500, 2000, 2500, 3000], "y": [8, 9, 9, 10, 12, 15, 19], "marker": {"color": "#37b24d"}}]}95th 百分位延迟随请求负载增加的分布,比较了基线配置和优化后的配置。优化后的系统在明显更高的负载下保持更低的延迟。离线计算吞吐量基准测试离线基准测试侧重于批处理特征生成或回填过程的效率,通常涉及大量数据和分布式计算框架,如 Apache Spark 或 Apache Flink。指标重要的吞吐量指标包括:作业完成时间: 处理特定数据集或时间范围所需的总实际时间。数据处理速率: 每单位时间处理的源数据量(例如,GB/小时)或每单位时间生成的特征行数。资源利用率: 作业期间的 CPU、内存、网络和 I/O 使用情况。这有助于识别资源瓶颈(例如,CPU 密集型与 I/O 密集型)。成本: 运行计算作业相关的基础设施成本。方法对离线作业进行基准测试需要代表性数据和配置。定义测试作业: 选择典型的特征工程管道或回填任务。准备代表性数据: 使用与生产数据量和特征(数据分布、基数、稀疏度)相似的数据集。使用微小样本数据集通常会产生误导性结果。配置环境: 使用与目标生产环境可比的集群配置(节点数量、节点类型、执行器内存/核心)或系统地改变配置以了解扩展行为。执行作业: 在测试数据和配置上运行定义的作业。使用框架的工具(例如 Spark UI)监控执行进度。收集指标: 记录作业持续时间、来自集群监控工具(例如 Ganglia, Datadog, CloudWatch)的资源利用率指标,以及任何输出统计信息(处理的行数,写入的数据)。分析结果: 比较不同配置或代码版本的完成时间。分析资源利用率图表以识别瓶颈(例如,倾斜任务、高垃圾回收时间、I/O 等待时间)。计算处理速率和成本效率。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", fontsize=10]; edge [fontname="sans-serif", fontsize=9]; subgraph cluster_setup { label="设置"; bgcolor="#e9ecef"; SourceData [label="源数据\n(1 TB 日志)"]; ClusterConfig [label="集群配置\n(10 节点, m5.xlarge)"]; } subgraph cluster_process { label="处理"; bgcolor="#dee2e6"; FeatureJob [label="特征工程作业\n(Spark)"]; Monitoring [label="资源监控\n(CPU, 内存, I/O)"]; } subgraph cluster_results { label="结果"; bgcolor="#ced4da"; JobDuration [label="作业持续时间:\n2.5 小时"]; ProcessingRate [label="处理速率:\n400 GB/小时"]; Bottleneck [label="识别到的瓶颈:\n磁盘 I/O 饱和"]; } SourceData -> FeatureJob; ClusterConfig -> FeatureJob; FeatureJob -> Monitoring; FeatureJob -> JobDuration; FeatureJob -> ProcessingRate; Monitoring -> Bottleneck; }离线基准测试运行流程,从数据和配置开始,在监控的同时执行作业,并分析所得的持续时间、速率和瓶颈。建立基准并确保可重复性有效的基准测试需要一致性。隔离变量: 在基准测试运行之间一次只改变一个因素(例如,代码更改、数据库版本、实例类型),以准确归因性能差异。一致的环境: 确保底层硬件、网络配置、操作系统和依赖项版本在比较测试中保持稳定。容器化有助于实现这一点。预热期: 对于在线系统,在测量前运行一段时间的测试,以允许缓存预热并使系统达到稳定状态。多次运行: 对每种配置执行多次运行,并对结果取平均值(或使用统计方法),以消除瞬时波动。记录所有信息: 记录每次基准测试运行的精确配置、代码版本、使用的数据集、负载参数和结果。基准测试不是一次性活动。为您的重要特征平台操作建立基准,并将性能测试集成到您的 CI/CD 管道中,以尽早发现退步。通过系统地测量性能,您获得所需的信息,以构建和维护不仅仅是功能性的特征平台,而是真正达到生产就绪水平,并能够大规模支持高要求机器学习应用程序的。