当前位置: 首页 > ops >正文

并发解析hea,转为pdf格式

由于每次解析一个heap需要时间有点久,就写了一个自动解析程pdf的一个脚本。
down_lib.sh是需要自己写的哦,主要是用于下载自己所需程序的库,用于解析heap。

#!/bin/bash# 优化版通用解析脚本(并发加速):批量生成 heap profile 的 PDF 报告
# down_lib.sh, heapjx.sh 放到同一目录下。
# 用法示例: ./heapjx.sh /app/heap
START_TIME=$(date +%Y-%m-%d_%H:%M:%S)
echo "开始生成 heap profile PDF 报告... 时间戳:${START_TIME}"set -euo pipefail# 自动查找 pprof_x86 路径
PPROF="$(find ~/ -name pprof_x86 2>/dev/null | head -n1)"
if [[ -z "${PPROF}" ]]; thenecho "未找到 pprof_x86 工具,请检查环境!"exit 1
fiEXEC="${EXEC:-./ndm_locmap_lib/ndm_locmap}"
HEAP_DIR="${HEAP_DIR:-./heap}"
PDF_DIR="${PDF_DIR:-./pdf}"
NDM_LOCMAP_DIR="${NDM_LOCMAP_DIR:-./ndm_locmap_lib}"
LIB_PREFIX="${LIB_PREFIX:-./ndm_locmap_lib}"
OPTS="--pdf --show_bytes --lib_prefix=${LIB_PREFIX}"
USERNAME="${USERNAME:-root}"
HOST="${HOST:-192.168.2.62}"
YCHEAP_DIR="${YCHEAP_DIR:-/app/heap/heap/}"# 自动创建必要目录
mkdir -p "${PDF_DIR}" "${NDM_LOCMAP_DIR}"# 拉取heap文件目录
# 如果当前目录下没有 heap 目录,才拉取
echo "62板子上的heap目录: $1"
if [[ ! -d ./heap ]]; thenecho "未检测到 heap 目录,执行拉取..."scp -r "${USERNAME}@${HOST}:$1" .
elseecho "heap 目录已存在,跳过拉取"
fi# 判断 ndm_locmap_lib 目录下是否有文件,无文件才拉库
if find ./ndm_locmap_lib -maxdepth 1 -type f | grep -q .; thenecho "ndm_locmap_lib 目录下已有文件,跳过拉取依赖库步骤"
elseif [[ -x ./down_lib.sh ]]; thenecho "拉取依赖库..."bash ./down_lib.sh ndm_locmap root 192.168.2.62 ./ndm_locmap_lib || \echo "警告: down_lib.sh 执行失败,跳过拉取依赖库步骤"elseecho "警告: down_lib.sh 未找到或不可执行,跳过拉取依赖库步骤"fi
fi# 处理 heap 文件
shopt -s nullglob
heap_files=("${HEAP_DIR}"/ndm_locmap_*.heap)
if [[ ${#heap_files[@]} -eq 0 ]]; thenecho "未在 ${HEAP_DIR} 目录下找到 ndm_locmap_*.heap 文件"exit 1
fi# 获取CPU核心数(并发数),允许通过环境变量指定
CPU_CORES="${CPU_CORES:-$(nproc)}"echo "开始并发生成 PDF,每次最多并发 ${CPU_CORES} 个任务..."export PPROF EXEC OPTS PDF_DIRgen_pdf() {heapfile="$1"fname=$(basename "$heapfile")base="${fname%.heap}" # 去掉结尾的 .heapoutpdf="${PDF_DIR}/${base}.heap.pdf"echo "生成 ${outpdf} ...""${PPROF}" "${EXEC}" "$heapfile" ${OPTS} > "${outpdf}"if [[ $? -eq 0 ]]; thenecho "✔ ${outpdf} 生成成功"elseecho "✗ ${outpdf} 生成失败"fi
}export -f gen_pdf# GNU parallel优先,否则用xargs(大多数Linux系统已自带)
if command -v parallel &> /dev/null; thenprintf "%s\n" "${heap_files[@]}" | parallel -j "${CPU_CORES}" gen_pdf {}
elseprintf "%s\n" "${heap_files[@]}" | xargs -n1 -P "${CPU_CORES}" -I{} bash -c 'gen_pdf "$@"' _ {}
fiENDTIME=$(date +%Y-%m-%d_%H:%M:%S)
echo "全部并发生成完成!时间戳:${ENDTIME}"
http://www.xdnf.cn/news/9382.html

相关文章:

  • Unity数字人开发笔记——讯飞超拟人语音
  • uniapp|实现多端图片上传、拍照上传自定义插入水印内容及拖拽自定义水印位置,实现水印相机、图片下载保存等功能
  • 实测!横屏影视素材转竖屏 无损转换 +参数可调 抖音 快手竖屏视频一键适配
  • C++ 复制构造函数:创建对象的 “拷贝大师”
  • Ajax(Asynchronous JavaScript and XML)
  • 无人机分布式协同算法解析!
  • 采用Bright Data+n8n+AI打造自动化新闻助手:每天5分钟实现内容日更
  • promptfoo:让语言模型评测不再“靠感觉”——一站式 LLM 自动化测评神器深度解读
  • C#学习26天:内存优化的几种方法
  • 【开源解析】基于PyQt5+Folium的谷歌地图应用开发:从入门到实战
  • 在 Ubuntu 22.04 LTS 上离线安装 Docker
  • 002 flutter基础 初始文件讲解(1)
  • 解码 Skate:打造链间可组合应用栈,构建跨越虚拟机的无状态未来
  • 使用 Selenium 进行自动化测试:入门指南
  • sl4j+log4j日志框架
  • 苍穹外卖 09 WebSocket来单提醒客户催单营业额统计
  • 【C++】string类的使用(万字详解)
  • ZYNQ-PS与PL端BRAM数据交互
  • Tesseract OCR 安装与中文+英文识别实现
  • RK3568DAYU开发板-平台驱动开发:I2C驱动(原理、源码、案例分析)
  • 中山大学无人机具身导航新突破!FlightGPT:迈向通用性和可解释性的无人机视觉语言导航
  • 概念流水账:PHY、PCS、PRBS
  • Vue 项目中 Sass 与 Less 的对比
  • 社区造数服务接入MCP|得物技术
  • 中间件redis 功能篇 过期淘汰策略和内存淘汰策略 力扣例题实现LRU
  • UE5 编辑器工具
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 按钮大小设置的小技巧
  • WHAT - 学习 WebSocket 实时 Web 开发
  • SQL中的锁机制
  • LabVIEW 中不同 VI 间图像传递方法解析