性能与内存分析:结果诊断与可信度验证

把墙钟时间拆成线性求解、外迭代组装、I/O 写盘与通信四块,用加速比与并行效率反推串行占比,并给出场数据与 LDU 矩阵的内存占用量级估算方法。

OpenFOAM结果诊断与可信度验证性能与内存分析并行加速比专题

性能与内存分析:结果诊断与可信度验证

性能分析的起点是把墙钟时间拆成可归因的几块:线性求解、外迭代组装、I/O 写盘与并行通信。OpenFOAM 日志已经给出大部分数据,关键是用一致口径把它们算成加速比、效率与内存占用,再判断瓶颈在哪一层。

日志里可直接读到的计时

grep -E "ExecutionTime|ClockTime|Solving for" log.foamRun | tail -40
tail -20 log.foamRun

日志末尾会打印:

ExecutionTime = 842.3 s  ClockTime = 851 s

ExecutionTime 是各进程 CPU 时间之和,ClockTime 是墙钟时间。并行时二者比值近似等于核数;若远小于核数,说明存在大量串行段或等待。

加速比与并行效率

SN=T1TN,EN=SNNS_N = \frac{T_1}{T_N}, \qquad E_N = \frac{S_N}{N}

某算例单核 3600 s,32 核 240 s:

S32=3600240=15.0,E32=15.032=0.469S_{32} = \frac{3600}{240} = 15.0, \qquad E_{32} = \frac{15.0}{32} = 0.469

效率 46.9% 偏低。用 Amdahl 定律反推串行占比,设可并行部分比例为 pp:

SN=1(1−p)+p/N⇒15.0=1(1−p)+p/32S_N = \frac{1}{(1-p) + p/N} \Rightarrow 15.0 = \frac{1}{(1-p) + p/32}

解得 1−p≈0.04551-p \approx 0.0455,即约 4.6% 的时间是串行的。对 32 核来说,这 4.6% 把理论上限压到 1/0.0455=221/0.0455 = 22。要再提升,必须减少串行 I/O 与全局归约。

内存占用量级

以单元数 NN、每单元场数 nfn_f、双精度 8 字节估算场数据:

Mfields≈N×nf×8×2M_{fields} \approx N \times n_f \times 8 \times 2

末乘 2 是因为线性系统还需要一份工作数组。N=106N = 10^{6}、nf=20n_f = 20 时:

Mfields=106×20×8×2=3.2×108 B≈320 MBM_{fields} = 10^{6} \times 20 \times 8 \times 2 = 3.2\times10^{8}\ \mathrm{B} \approx 320\ \mathrm{MB}

这还没算 LDU 矩阵(约 NfacesN_{faces} 乘系数个数乘 8 字节)与 AMG 的粗化层级。经验上 GAMG 的峰值内存是场数据的 3~6 倍,即 1.0~1.9 GB。32 核分摊后每核约 32~60 MB,远小于节点内存,说明该算例是计算受限而非内存受限。

I/O 与写盘频率

写盘是典型串行段。若每 100 步写一次、每次 96 MB、共 100 次写盘合计 9.6 GB,在 200 MB/s 的磁盘上需 48 s,占 240 s 墙钟的 20%。把写盘间隔提到 500 步可降到 4%,用 writeControl timeStep; writeInterval 500; 或改用二进制格式。

分区均衡与每核负载

decomposePar 默认按单元数均衡,但计算量还取决于局部迭代数。以 100 万单元、32 核为例,理想每核 31250 单元;若某核因几何集中拿到 45000 单元,负载比达 45000/31250=1.4445000/31250 = 1.44。墙钟时间由最慢的核决定,因此整体效率至少损失 30%。用 decomposePar -cellDist 导出分区分布,在 ParaView 里看每核单元数的极差;超过 10% 就应换分解方法或手工加权。

定位瓶颈的判定顺序

  1. 看 ExecutionTime/ClockTime 比值与核数是否匹配。
  2. 看线性求解器迭代次数是否随核数增加——并行 GAMG 的粗化层通信会放大迭代数。
  3. 看写盘时刻的 ClockTime 是否出现台阶。
  4. 用 top/ps 采样内存,确认是否发生换页。

失败模式

现象 根因 判定试验
核数翻倍时间不变 串行段主导(I/O 或全局归约) 关掉写盘重跑,若时间骤降即为 I/O
加速比随核数下降 每核单元数过少、通信占比上升 固定总网格,从 8 核增到 32 核画加速比曲线
内存随迭代缓慢增长 场或矩阵未释放、平均统计累积 用 top 观察 RSS 是否单调上升
求解器迭代数随核数上升 分区边界增大、GAMG 粗化通信变差 换 scotch/hierarchical 分解方法对比
计算节点突然变慢 磁盘写满或内存换页 查磁盘余量与 vmstat 的换页计数

参考文献

  1. G. M. Amdahl, “Validity of the single processor approach to achieving large scale computing capabilities”, AFIPS Spring Joint Computer Conference, 1967.
  2. G. H. Golub, C. F. Van Loan, Matrix Computations, 4th ed., Johns Hopkins University Press, 2013.
  3. W. Gropp, E. Lusk, A. Skjellum, Using MPI, 3rd ed., MIT Press, 2014.
  4. U. Trottenberg, C. Oosterlee, A. Schüller, Multigrid, Academic Press, 2001.
  5. OpenFOAM Foundation, OpenFOAM User Guide, §“Parallel performance and decomposition”.