数仓稳定性测试实践——7×24小时持续加压,我们踩过的那些坑
一、稳定性测试跟性能测试有什么区别性能测试看的是快不快稳定性测试看的是稳不稳。我们项目里定了一条硬性标准所有做了性能测试的业务都要在75% CPU压力下进行7×24小时的稳定性测试。为什么定75%因为生产环境的CPU不可能一直空载日常业务定时任务混跑CPU使用率长期在60%-80%之间是常态。我们在测试环境用75%的CPU压力跑七天就是为了模拟生产环境的真实负载情况。稳定性测试的目标就两个系统能不能持续稳定运行不崩溃、不重启系统性能会不会随时间衰减第七天跟第一天一样快我们跑了一轮七天稳定性测试结果发现的问题还真不少。下面按时间线一个个说。二、测试怎么设计的JMeter的配置跟性能测试类似但有一个关键区别持续时间从几个小时拉长到了七天。线程组的配置是这样的textNumber of Threads: 根据性能测试结果压到CPU 75%左右的并发数 Ramp-Up Period: 300秒5分钟慢慢加上去别一启动就把系统冲垮 Loop Count: Forever一直跑不停 Scheduler: 勾选Duration: 604800秒7×24小时四种业务场景采集任务、SparkSQL作业、质量规则、API接口同时跑混合加压模拟真实生产环境。监控方面我们部署了监控层面工具采集频率关注指标操作系统Prometheus Node Exporter15秒CPU、内存、磁盘、网络数据库Oracle Enterprise Manager1分钟会话数、等待事件、表空间大数据组件Ambari / Cloudera Manager1分钟YARN队列、HDFS使用率、Spark作业应用日志ELKElasticsearch Logstash Kibana实时错误日志、异常堆栈七天跑下来发现的问题依次是三、第一天到第三天一切正常前三天没什么异常。系统CPU稳定在73%-77%之间波动内存使用率平稳磁盘I/O正常所有任务的成功率都在99.5%以上。监控面板上一片绿色大家还挺乐观的。但到了第四天开始出问题了。四、第四天磁盘被日志写满现象第四天下午监控突然报警磁盘使用率超过了90%。登录服务器一看/u01/logs目录下全是日志文件最大的几个都超过了10GB。bash# 查看磁盘使用情况 df -h # /u01 使用率 92% # 查哪个目录占的空间最大 du -sh /u01/* | sort -rh | head -10 # /u01/logs 180G # /u01/data 120G # 看看日志文件多大 ls -lh /u01/logs/ # app.log.2026-01-18 12G # app.log.2026-01-17 11G # app.log.2026-01-16 10G # ...四天的日志加起来180G问题根因日志没有做轮转log rotation。所有的业务日志都往同一个文件里写写满了就新建一个但旧文件从来不删。四天就攒了180G的日志把磁盘撑爆了。临时处理手动清理了15天前的日志释放了150G空间。bash# 清理15天前的日志 find /u01/logs/ -name *.log.* -mtime 15 -exec rm -f {} \;长期解决方案写了一个日志自动清理脚本加入crontab每月执行一次。bash#!/bin/bash # /opt/scripts/clean_old_logs.sh # 每月1号凌晨3点执行清理30天前的日志 LOG_DIR/u01/logs RETENTION_DAYS30 find $LOG_DIR -name *.log.* -mtime $RETENTION_DAYS -exec rm -f {} \; find $LOG_DIR -name *.out -mtime $RETENTION_DAYS -exec rm -f {} \; # 记录清理结果 echo $(date): Cleaned logs older than $RETENTION_DAYS days /var/log/log_clean.log加入crontabbash# 每月1号凌晨3点执行 0 3 1 * * /opt/scripts/clean_old_logs.sh反思为什么是每月执行一次而不是每天执行因为磁盘是1TB的按照日志增长速度30天大约产生1.4TB的日志所以30天的保留策略刚好撑满。但生产环境的日志量可能会波动我们后来改成每天执行保留30天。五、第五天到第六天各种小问题陆续暴露日志问题解决之后第五天第六天相对平静但还是发现了一些小问题问题一连接池偶尔泄露有个采集任务的连接池配置了maxIdle10但代码里忘了在finally块里释放连接。跑了五天后连接池里积累了几十个僵尸连接导致新请求拿不到连接。现象是监控上看到活跃连接数慢慢上涨到了第五天下午突然有一个小时的成功率掉到了95%。排查手段查了应用的数据库连接池监控发现活跃连接数一直在涨从来不会降。抓了几个线程栈看到有线程持有连接但不释放。解决方案修改代码把连接释放逻辑放到finally块里确保不管成功还是异常都能释放连接。java// 修改前有泄漏 Connection conn dataSource.getConnection(); // 执行业务逻辑... // 如果这里抛异常conn就不会被关闭 // 修改后用finally保证释放 Connection conn null; try { conn dataSource.getConnection(); // 执行业务逻辑... } finally { if (conn ! null) { conn.close(); } }问题二Kafka消费者Rebalance频繁质量任务那边用的是Kafka消费者拉取数据跑着跑着发现消费者组频繁发生Rebalance重平衡每次Rebalance的时候消费就暂停了任务成功率短期下降。排查后发现是消费者的max.poll.interval.ms设置得太短默认300秒但质量任务处理每条消息的时间较长超过了300秒还没处理完Kafka就认为消费者死了触发Rebalance。解决方案把超时时间调长。properties# Kafka消费者配置 max.poll.interval.ms600000 # 从300秒调到600秒10分钟 max.poll.records100 # 每次拉取的消息数调小减少单次处理时间 session.timeout.ms45000 # 会话超时适当调长六、第七天性能衰减——第七天比第一天慢了很多现象第七天早上我们对比了一下监控数据发现了一个严重问题——第七天比第一天所用的时间更长。具体来说指标第一天平均值第七天平均值增幅SparkSQL作业平均耗时2.4分钟4.1分钟70%API平均响应时间135ms289ms114%采集任务平均耗时1.8秒/表3.5秒/表94%质量任务平均耗时8.2秒/表15.7秒/表91%所有任务的耗时都在变长而且越往后越慢。这是个典型的性能衰减问题。排查过程第一步看系统资源。CPU还是75%左右没变。内存使用率也没明显增长。磁盘I/O正常。资源层面没问题那就不是系统被压垮了而是某些资源被消耗了但没释放。第二步查数据库层面。连上Oracle查了一下临时表空间和UNDO表空间sql-- 查看临时表空间使用 SELECT * FROM V$TEMP_SPACE_HEADER; -- 临时表空间用了80%比第一天高了40% -- 查看UNDO表空间 SELECT tablespace_name, ROUND(used_space/1024/1024/1024, 2) as used_gb FROM DBA_TABLESPACE_USAGE_METRICS WHERE tablespace_name UNDOTBS1; -- UNDO用了120GB第一天只有30GB临时表空间和UNDO都在持续增长说明有些事务一直没有提交或者提交后空间没有被回收。第三步查长时间运行的事务。sqlSELECT sid, serial#, username, status, ROUND((SYSDATE - start_time) * 24, 2) as hours_running, sql_text FROM V$SESSION JOIN V$SQL ON V$SESSION.sql_id V$SQL.sql_id WHERE status ACTIVE AND start_time SYSDATE - 1/24 -- 运行超过1小时 ORDER BY start_time;发现有3个事务已经跑了6个小时还没结束一直在执行大量的INSERT操作。这些长事务持有UNDO段不释放导致UNDO表空间越涨越大其他需要读取一致性视图的操作就变慢了。第四步找到长事务的源头。顺着SID查了应用的日志发现是质量任务里有一个脚本做了全量数据的行数校验对一张30亿行的表执行了SELECT COUNT(*)。这个查询需要读取全表数据同时为了保证读一致性需要用到UNDO里的历史数据。UNDO被撑得越大查询就越慢形成了一个恶性循环。问题根因质量任务的SQL写得有问题——对超大表执行全表COUNT(*)不仅自己慢还撑爆了UNDO拖累了整个系统的性能。解决方案终止了那个跑了6小时的查询sql-- 终止长事务 ALTER SYSTEM KILL SESSION sid,serial#;优化质量任务的SQL用统计信息代替全表COUNTsql-- 原来的写法30亿行全表扫描 SELECT COUNT(*) FROM huge_table WHERE dt 2026-01-15; -- 优化后的写法查分区统计信息 SELECT num_rows FROM DBA_TAB_PARTITIONS WHERE table_name HUGE_TABLE AND partition_name P_20260115;清理UNDO表空间回收空间sql-- 切换UNDO表空间让旧的UNDO段释放 ALTER SYSTEM SET UNDO_TABLESPACE UNDOTBS2; -- 等旧事务全部结束后再切回去最终效果优化之后我们又跑了一轮7天稳定性测试这次第七天的性能跟第一天基本持平指标第一天第七天变化SparkSQL作业平均耗时2.4分钟2.6分钟8.3%API平均响应时间135ms148ms9.6%采集任务平均耗时1.8秒/表1.9秒/表5.6%质量任务平均耗时8.2秒/表8.8秒/表7.3%在可接受范围内。七、稳定性测试中压出的其他问题除了上面这几个我们在多轮稳定性测试中还压出了以下问题问题四内存泄漏导致OOM测试跑到第六天的时候某个采集服务的JVM内存使用率从正常的40%涨到了90%然后触发了Full GC服务卡顿了5分钟大量任务超时。排查手段用jmap导出了堆内存dump文件用MATMemory Analyzer Tool分析发现某个缓存Map一直在膨胀从来没清理过。bash# 导出堆dump jmap -dump:live,formatb,fileheap.hprof pid # 用MAT分析找到最大的对象解决方案给缓存加了个大小限制使用LRULeast Recently Used淘汰策略超过上限就自动淘汰最久未使用的条目。java// 修改前 MapString, Object cache new HashMap(); cache.put(key, value); // 一直往里塞从来不删 // 修改后 CacheString, Object cache Caffeine.newBuilder() .maximumSize(10000) // 最多缓存1万条 .expireAfterWrite(1, TimeUnit.HOURS) // 1小时后自动过期 .build();问题五HDFS小文件堆积SparkSQL作业每跑一次就会在HDFS上生成一些临时文件。七天下来临时文件累积了80多万个小文件NameNode的内存被撑爆了导致整个HDFS集群变慢。解决方案配置Spark作业自动清理临时目录。sqlSET spark.sql.autoBroadcastJoinThreshold104857600; -- 关键是下面这个配置作业结束后自动删除临时文件 SET spark.sql.adaptive.coalescePartitions.enabledtrue;同时增加了一个每日定时任务清理超过3天的临时文件bash# 每天凌晨2点清理HDFS临时文件 hdfs dfs -rm -r -skipTrash /tmp/spark/*/ 2/dev/null八、稳定性测试结论一轮7×24小时的稳定性测试跑下来发现的主要问题问题发现时间严重程度解决方案日志写满磁盘第4天高差点宕机定时清理脚本连接池泄漏第5天中成功率下降代码加finally释放Kafka频繁Rebalance第5天中短暂抖动调大超时参数长事务撑爆UNDO第7天高性能严重衰减优化SQL清理UNDO内存泄漏OOM第6天高服务卡顿限制缓存大小LRUHDFS小文件堆积第7天中影响集群性能自动清理临时文件几个核心经验性能测试看快不快稳定性测试看多久还是这么快。第七天比第一天慢了一倍多这种衰减在短期的性能测试里是发现不了的。75% CPU压力是稳定性测试的黄金标准。太低压不出问题太高系统直接崩溃没法观察。75%刚好让所有组件都工作在接近极限的状态长期运行各种隐藏问题都会暴露。日志清理不是小事。日志写满磁盘是稳定性测试里最高频的问题之一一定要有自动清理机制而且要持续监控磁盘使用率。长事务是性能衰减的最大杀手。一个跑了6小时的COUNT(*)看起来只是慢但它会拖慢整个系统。对大表查询能用统计信息就别用全表扫描。

相关新闻

49-缓存淘汰与命中率优化:平台如何让缓存既快又不失控

49-缓存淘汰与命中率优化:平台如何让缓存既快又不失控

适合对象:关注缓存命中、淘汰策略、容量控制、平台性能的后端工程师和平台工程师。 先说结论 缓存淘汰与命中率优化不是一个孤立功能,而是精准测试平台里帮助团队做判断的一环。 它重点解决的是:平台如何让缓存既快又不失控。 用大白话讲,缓存和资源管理要让平台跑得更快…

2026/10/9 7:07:54 阅读更多 →
MySQL数据类型选择与优化实战指南

MySQL数据类型选择与优化实战指南

1. MySQL数据类型深度解析:从原理到实战避坑指南作为关系型数据库的基石,数据类型的选择直接影响着数据存储效率、查询性能和系统稳定性。从业十年间,我见过太多因数据类型使用不当导致的性能瓶颈——有将手机号存为INT导致首位零丢失的&…

2026/10/8 14:47:24 阅读更多 →
从单模型到多模型编排:构建高效AI Agent系统的核心策略与实践

从单模型到多模型编排:构建高效AI Agent系统的核心策略与实践

1. 项目概述:从“单兵作战”到“团队协作”的AI范式演进 最近和几个做AI应用落地的朋友聊天,大家普遍有个感觉:单个大模型(比如GPT-4、Claude 3)的能力确实很强,写代码、做分析、搞创作都是一把好手。但真要…

2026/10/14 19:41:35 阅读更多 →

最新新闻

利用 Go 1.27.1 通用泛型方法构建高可靠 Kubernetes 事件监听管道

利用 Go 1.27.1 通用泛型方法构建高可靠 Kubernetes 事件监听管道

在采用 Go 语言构建企业级 Kubernetes 自定义控制器(Operator)时,**事件监听与过滤流水线(Event Filter Pipeline / Predicates)**是整个控制回路的“第一道安全关卡”。 一个成熟的 GPU 算力集群通常每秒会产生数以千…

2026/10/15 2:02:12 阅读更多 →
各种开发板

各种开发板

一)硬木课堂FPGA【40P接口1为3V3,2为低,39为VBUS,40为地】 1.DMZ-EG4S20 开发板(5):板卡资源下载 (yuque.com) https://www.yuque.com/yingmuketang/01/lwghr4 百度网盘 请输入提取码 VeriMake SparkRoad开发板VeriMake/Spark…

2026/10/15 2:02:12 阅读更多 →
属于一个人的数字管家:个人生活自动化脚本工具包全景复盘

属于一个人的数字管家:个人生活自动化脚本工具包全景复盘

十月十四日的夜色深沉,秋虫在窗台外发出细微的鸣唱。我端着一杯温热的麦茶,在终端里敲下一条命令:tree ~/scripts -L 1。 屏幕上整整齐齐地列出了七个小巧的 Python 脚本文件。没有复杂的工程脚手架,没有深不见底的依赖树&#xf…

2026/10/15 2:02:12 阅读更多 →
COMSOL仿真非对称光栅传输特性与优化设计

COMSOL仿真非对称光栅传输特性与优化设计

1. 项目背景与核心价值光栅作为光学系统中的关键元件,其非对称传输特性在集成光子学、光通信和传感领域具有重要应用价值。传统对称光栅的衍射效率在正负衍射级次上基本一致,而非对称光栅则能实现不同衍射级次间的能量非均匀分配,这种特性为光…

2026/10/15 2:02:12 阅读更多 →
ComfyUI v0.40.0发布:资产系统、原生 LoRA 堆栈、Qwen 3.5、3D 输出、相机节点与多项合作节点全面更新

ComfyUI v0.40.0发布:资产系统、原生 LoRA 堆栈、Qwen 3.5、3D 输出、相机节点与多项合作节点全面更新

发布日期:2026 年 10 月 14 日 版本:v0.40.0 Latest 发布说明:该版本为不可变发布,仅允许修改发布标题与发布说明。ComfyUI v0.40.0 正式发布。本次更新覆盖服务端安全策略、模型注意力机制、资产系统、3D 输出、相机信息、视频元…

2026/10/15 2:02:12 阅读更多 →
两串磷酸铁锂主动均衡方案:基于MP2642GR-Z与STM32L442KC

两串磷酸铁锂主动均衡方案:基于MP2642GR-Z与STM32L442KC

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 2:01:12 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →