在 IC 设计环境中,EDA 工具对存储资源的依赖性极强。当磁盘空间耗尽或用户 Quota 配额达到上限时,正在运行的 Virtuoso 会话和 Spectre 仿真可能面临严重的数据损坏风险。本文基于 Cadence 官方支持文档,深入解析磁盘空间不足导致的常见问题,并提供一套完整的预防和应对策略。

问题背景

在多用户共享的 HPC 集群环境下,IC 设计工程师经常遇到以下场景:

典型环境

  • 多个 Virtuoso 会话同时运行
  • Spectre 并行仿真任务消耗大量磁盘空间
  • 网络文件系统(NFS)挂载的设计库和仿真输出目录
  • 设置了严格的用户 Quota 限制

触发条件

  • 波形文件(PSF)快速增长
  • 临时文件(journal、WAL)堆积
  • 设计库未及时清理旧版本
  • 仿真日志持续写入

严重后果

  • Virtuoso 无法启动或突然崩溃
  • Spectre 仿真中断,结果丢失
  • 设计数据损坏
  • 锁定文件残留导致设计库无法访问

核心问题与风险

根据 Cadence 支持网站的调研,磁盘空间或 Quota 耗尽会引发以下问题:

1. Virtuoso 启动失败

典型错误信息

1
2
3
Disk quota exceeded
Malformed Lock-Stack file
Unable to create CDS.log

根本原因

  • Virtuoso 启动时需要创建或锁定 CDS.log 文件
  • 磁盘满时无法创建锁定文件(.lock 文件)
  • 日志文件写入失败导致启动流程中断

影响范围

  • 无法打开任何设计库
  • 已打开的 CIW(Command Interpreter Window)可能假死
  • 多个用户的 Virtuoso 会话可能相互干扰

[!WARNING] 数据风险:如果在保存设计时磁盘满了,可能导致 data.dm 或 OA 数据库文件截断或损坏。

2. Spectre 仿真致命错误

典型错误信息

1
2
3
FATAL (SPECTRE-7001): Cannot write to output file
Error creating PSF file
Disk write error during simulation

根本原因

  • Spectre 在仿真过程中持续写入波形数据(PSF 格式)
  • 磁盘空间不足时,PSF 文件无法扩展
  • 临时检查点文件无法创建

影响范围

  • 仿真立即终止,已计算的结果全部丢失
  • 无法生成仿真报告
  • 可能留下不完整的 PSF 文件(无法读取)

[!CAUTION] 严重后果:长时间运行的大规模仿真(如 Monte Carlo、PVT Corner)一旦因磁盘满而中断,可能浪费数天的计算资源。

3. 数据损坏与完整性问题

易损坏的文件类型

文件类型 路径示例 损坏后果
CDS.log ./CDS.log 操作历史丢失,调试困难
data.dm library/cell/layout/data.dm 设计元数据损坏,无法打开单元
PSF 文件 simulation/results.raw/ 波形数据不完整,无法后处理
SQLite 数据库 *.db 事务回滚失败,数据库损坏
锁定文件 *.lock, *.journal 残留锁文件阻止后续访问

4. 锁定文件残留

问题描述

  • 磁盘满时,程序异常退出无法清理 .lock 文件
  • 下次启动时提示”文件已被其他用户使用”

手动清理方法

1
2
3
4
5
# 查找孤立的锁文件
find /design/library -name "*.lock" -mtime +1 -ls

# 确认对应进程不存在后删除
rm -f /design/library/myLib/.lock

[!TIP] 使用 lsof 命令确认 .lock 文件是否真的被占用:

1
lsof /design/library/myLib/.lock

Cadence 官方解决方案

根据 Cadence 支持文档,以下是官方推荐的预防和应对策略:

1. ADE Explorer 自动挂起功能

适用场景:使用 ADE Explorer/Assembler 提交仿真任务

配置步骤

  1. 在 ADE Explorer 中打开 Options → Job Setup → Resources
  2. 启用以下选项:
    • Show warning for low disk(磁盘不足时显示警告)
    • Automatically suspend simulations if the disk space is insufficient(自动挂起)
  3. 设置磁盘空间阈值(推荐值:500MB - 2GB)

工作原理

  • ADE 在提交任务前检查磁盘空间
  • 仿真运行期间定期轮询磁盘使用率
  • 空间低于阈值时自动暂停仿真
  • 清理空间后可手动恢复运行

示例配置

1
2
Disk Space Threshold: 1000 MB
Check Interval: 60 seconds

[!IMPORTANT] 此功能仅在通过 ADE 提交的任务中有效,直接运行 spectre 命令需要使用下述参数。

参考文档

2. Spectre 磁盘检查参数

适用场景:命令行直接运行 Spectre 仿真

核心参数

+disk_check_thresh=<MB>

设置磁盘空间阈值(单位:MB),低于此值时挂起仿真。

示例

1
2
3
4
5
spectre input.scs \
  +log=spectre.log \
  +disk_check_thresh=1000 \
  +disk_check_interval=60 \
  +disk_check_autoresume

参数详解

参数 说明 推荐值
+disk_check_thresh=<MB> 磁盘空间下限,低于此值挂起 1000-5000
+disk_check_interval=<sec> 检查间隔(秒) 30-120
+disk_check_autoresume 空间恢复后自动继续仿真 建议启用
+disk_check_path=<path> 指定监控路径(默认为输出目录) /scratch/sim

工作流程

graph TD
    A[开始仿真] --> B{检查磁盘空间}
    B -->|充足| C[继续计算]
    B -->|不足| D[挂起仿真]
    
    C --> E[等待检查间隔]
    E --> B
    
    D --> F{autoresume 启用?}
    F -->|是| G[等待空间恢复]
    F -->|否| H[手动恢复或终止]
    
    G --> I{空间充足?}
    I -->|是| C
    I -->|否| G

实战示例

1
2
3
4
5
6
7
# 在集群上提交仿真任务
bsub -q eda -R "rusage[mem=16G]" \
  spectre netlist.scs \
  +disk_check_thresh=2000 \
  +disk_check_interval=30 \
  +disk_check_autoresume \
  +disk_check_path=/scratch/$USER/sim_results

参考文档

3. Spectre Save-Recover 功能

适用场景:超长时间仿真(Aging、Reliability 分析)

功能说明

  • 定期保存仿真检查点
  • 磁盘满导致中断后,清理空间即可从检查点恢复
  • 避免从头重新运行

启用方法

在 Spectre 命令行中启用:

1
2
3
4
spectre input.scs \
  +save_recover=yes \
  +save_recover_interval=3600 \
  +save_recover_path=/scratch/checkpoints/

在 ADE 中启用:

  1. Simulation → Options → Analog
  2. 找到 Save/Recover 选项卡
  3. 启用 Enable Save/Recover
  4. 设置检查点间隔(秒)

参数说明

参数 说明 推荐值
+save_recover=yes 启用检查点功能 必需
+save_recover_interval=<sec> 检查点间隔 1800-7200
+save_recover_path=<path> 检查点存储路径 高速存储

恢复仿真

1
2
3
# 清理磁盘空间后
spectre input.scs \
  +recover_from=/scratch/checkpoints/sim.chk

[!NOTE] 检查点文件可能很大(GB 级别),需要确保存储路径有足够空间。

参考文档

4. 定期清理与数据管理

清理策略

清理 CDS.log 文件

1
2
3
4
5
6
7
8
# 查找旧的 CDS.log(30天前)
find /design -name "CDS.log" -mtime +30 -ls

# 压缩归档
find /design -name "CDS.log" -mtime +30 -exec gzip {} \;

# 或直接删除
find /design -name "CDS.log" -mtime +30 -delete

清理仿真历史

在 ADE Explorer 中:

  1. Results → History
  2. 选择旧的仿真记录
  3. Delete 删除(包括相关的 PSF 文件)

清理临时文件

1
2
3
4
5
6
7
8
9
10
# SQLite journal 文件
find /design -name "*.db-journal" -mtime +7 -delete

# Virtuoso 临时文件
find /design -name ".nfs*" -delete
find /design -name "core.*" -delete

# Spectre 临时文件
find /simulation -name "*.log.*" -mtime +14 -delete
find /simulation -name "*.raw.tran*" -mtime +7 -delete

设计库压缩

Cadence 支持库级别的数据压缩(Article 20243164):

1
2
# 使用 OpenAccess 压缩工具
oaCompress -lib myLib -recursive

[!TIP] 建立自动化清理脚本,通过 cron 定期执行:

0 2 * * 0 /scripts/cleanup_old_simulations.sh

预防性监控方案

1. 磁盘空间监控脚本

监控目标

  • 设计库目录
  • 仿真结果目录
  • 用户 Home 目录
  • 临时文件系统

示例脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
# disk_monitor.sh

THRESHOLD_PCT=90
EMAIL="ic-team@company.com"

check_disk() {
    local path=$1
    local usage=$(df -h "$path" | awk 'NR==2 {print $5}' | sed 's/%//')
    
    if [ "$usage" -ge "$THRESHOLD_PCT" ]; then
        echo "WARNING: $path usage at ${usage}%"
        # 发送告警邮件
        echo "Disk space critical on $path: ${usage}% used" | \
            mail -s "Disk Alert: $path" "$EMAIL"
    fi
}

# 检查关键路径
check_disk "/design"
check_disk "/simulation"
check_disk "/scratch"

# 检查用户 Quota
quota -s | grep -v "0K" | while read -r line; do
    usage=$(echo "$line" | awk '{print $3/$2*100}')
    if [ $(echo "$usage > $THRESHOLD_PCT" | bc) -eq 1 ]; then
        echo "WARNING: User quota at ${usage}%"
        echo "User quota critical: ${usage}%" | \
            mail -s "Quota Alert" "$EMAIL"
    fi
done

部署方式

# 每小时检查一次
0 * * * * /admin/scripts/disk_monitor.sh

2. Quota 监控与告警

查看 Quota 状态

1
2
3
4
5
6
7
8
# NFS Quota
quota -s

# XFS Quota
xfs_quota -x -c 'report -h' /design

# ZFS Quota
zfs get userquota@username pool/design

接近上限时的用户通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
# quota_alert.sh

WARN_THRESHOLD=85
CRIT_THRESHOLD=95

for user in $(getent passwd | awk -F: '$3 >= 1000 {print $1}'); do
    quota_info=$(quota -u "$user" -f /design 2>/dev/null | tail -1)
    
    if [ -n "$quota_info" ]; then
        used=$(echo "$quota_info" | awk '{print $1}')
        limit=$(echo "$quota_info" | awk '{print $3}')
        
        if [ "$limit" -gt 0 ]; then
            usage_pct=$((used * 100 / limit))
            
            if [ "$usage_pct" -ge "$CRIT_THRESHOLD" ]; then
                echo "CRITICAL: $user quota at ${usage_pct}%" | \
                    mail -s "URGENT: Quota Alert" "${user}@company.com"
            elif [ "$usage_pct" -ge "$WARN_THRESHOLD" ]; then
                echo "WARNING: $user quota at ${usage_pct}%" | \
                    mail -s "Quota Warning" "${user}@company.com"
            fi
        fi
    fi
done

3. 集成到作业调度系统

LSF 示例

1
2
3
4
5
# 提交前检查磁盘空间
bsub -q eda \
  -E "check_disk_space.sh 2000" \
  -o sim_%J.log \
  spectre input.scs +disk_check_thresh=1000

pre-execution 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# check_disk_space.sh

required_mb=$1
output_dir=${LSB_OUTDIR:-/simulation}

avail_mb=$(df -BM "$output_dir" | awk 'NR==2 {print $4}' | sed 's/M//')

if [ "$avail_mb" -lt "$required_mb" ]; then
    echo "ERROR: Insufficient disk space ($avail_mb MB available, $required_mb MB required)"
    exit 1
fi

exit 0

最佳实践总结

设计阶段

目录规划

1
2
3
4
/design/          # 设计库(小文件多,需要高 IOPS)
/simulation/      # 仿真结果(大文件,需要高带宽)
/scratch/$USER/   # 临时文件(可定期清理)
/archive/         # 归档存储(冷数据)

权限与 Quota

1
2
3
4
5
6
7
8
# 为设计库设置合理的 Quota
xfs_quota -x -c "limit -u bsoft=50G bhard=100G $USER" /design

# 仿真目录给更大空间
xfs_quota -x -c "limit -u bsoft=500G bhard=1T $USER" /simulation

# 临时目录无 Quota 但定期清理
# /scratch 使用独立文件系统

仿真阶段

推荐配置清单

  • ✅ 启用 ADE Explorer 自动挂起功能
  • ✅ Spectre 命令行使用 +disk_check_thresh
  • ✅ 长时间仿真启用 Save-Recover
  • ✅ 设置合理的检查间隔(30-120秒)
  • ✅ 输出重定向到高速存储(/scratch)
  • ✅ 仿真完成后及时移动/删除结果

示例仿真脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
# run_spectre.sh

# 环境变量
export SPECTRE_DEFAULTS="-mt=4 +lqtimeout=0"
export OUTPUT_DIR="/scratch/$USER/sim_$(date +%Y%m%d_%H%M%S)"

# 创建输出目录
mkdir -p "$OUTPUT_DIR"

# 检查磁盘空间
avail_gb=$(df -BG "$OUTPUT_DIR" | awk 'NR==2 {print $4}' | sed 's/G//')
if [ "$avail_gb" -lt 10 ]; then
    echo "ERROR: 磁盘空间不足 (可用: ${avail_gb}GB)"
    exit 1
fi

# 运行仿真
cd "$OUTPUT_DIR"
spectre "$1" \
    +log=spectre.log \
    +disk_check_thresh=2000 \
    +disk_check_interval=60 \
    +disk_check_autoresume \
    +save_recover=yes \
    +save_recover_interval=3600

# 检查仿真结果
if [ $? -eq 0 ]; then
    echo "仿真成功完成"
    # 移动关键结果到永久存储
    rsync -av *.raw /design/results/
else
    echo "仿真失败或被挂起"
    exit 1
fi

日常维护

每日任务

1
2
3
4
5
# 清理临时文件
find /scratch -type f -mtime +3 -delete

# 检查磁盘使用率
df -h | grep -E "9[0-9]%" && echo "磁盘空间告警!"

每周任务

1
2
3
4
5
6
7
8
# 清理旧仿真结果
find /simulation -name "*.raw" -mtime +30 -exec rm -rf {} \;

# 清理 CDS.log
find /design -name "CDS.log" -mtime +30 -exec gzip {} \;

# 检查孤立锁文件
find /design -name "*.lock" -mtime +1 -ls

每月任务

1
2
3
4
5
# 压缩旧设计库
find /design -name "*.oa" -mtime +90 -exec oaCompress {} \;

# 归档历史项目
tar -czf /archive/project_2025Q4.tar.gz /design/project_2025Q4/

故障恢复流程

场景 1:Virtuoso 启动失败

错误提示

1
Disk quota exceeded

恢复步骤

  1. 检查 Quota 状态
    1
    
    quota -s
    
  2. 清理空间
    1
    2
    3
    4
    5
    
    # 删除旧 CDS.log
    find ~ -name "CDS.log" -mtime +7 -delete
       
    # 清理仿真结果
    rm -rf /simulation/old_runs/*
    
  3. 清理锁文件(如果存在):
    1
    2
    
    rm -f /design/myLib/.lock
    rm -f /design/myLib/CDS.log.lock
    
  4. 重新启动 Virtuoso
    1
    
    virtuoso -64 &
    

场景 2:Spectre 仿真中断

错误提示

1
FATAL (SPECTRE-7001): Cannot write to output file

恢复步骤

  1. 检查磁盘空间
    1
    
    df -h /simulation
    
  2. 清理空间
    1
    2
    3
    4
    5
    
    # 删除旧的波形文件
    find /simulation -name "*.raw" -mtime +14 -delete
       
    # 清理临时文件
    find /tmp -user $USER -mtime +1 -delete
    
  3. 从检查点恢复(如果启用了 Save-Recover):
    1
    2
    3
    
    spectre input.scs \
      +recover_from=/scratch/checkpoints/sim.chk \
      +disk_check_thresh=5000
    
  4. 如果没有检查点,重新运行仿真
    1
    2
    3
    4
    
    spectre input.scs \
      +disk_check_thresh=5000 \
      +disk_check_autoresume \
      +save_recover=yes
    

场景 3:数据库文件损坏

错误提示

1
Error opening library: corrupt data.dm file

恢复步骤

  1. 从备份恢复
    1
    2
    
    # 假设有定期备份
    cp /backup/design/myLib/data.dm /design/myLib/
    
  2. 如果没有备份,尝试修复
    1
    2
    
    # OpenAccess 修复工具
    oaCheck -lib myLib -fix
    
  3. 最坏情况:从版本控制恢复
    1
    2
    
    # 如果使用 SVN/Git
    svn revert -R /design/myLib/
    

[!CAUTION] 数据损坏可能无法完全恢复,定期备份是唯一可靠的保障。


相关文档与资源

Cadence 官方文档

Linux 存储管理


总结

关键要点

  1. 预防胜于治疗:启用磁盘检查功能是最简单有效的防护措施
  2. 实时监控:建立磁盘空间和 Quota 的自动化监控告警系统
  3. 定期清理:建立自动化的清理脚本,及时释放不必要的文件
  4. 检查点机制:长时间仿真务必启用 Save-Recover 功能
  5. 数据管理:合理规划存储层次,热数据和冷数据分离存储

必备配置清单

配置项 工具 参数/设置 优先级
自动挂起 ADE Explorer Options → Job Setup → Resources ⭐⭐⭐
磁盘检查 Spectre +disk_check_thresh=2000 ⭐⭐⭐
自动恢复 Spectre +disk_check_autoresume ⭐⭐
检查点保存 Spectre +save_recover=yes ⭐⭐⭐(长时间仿真)
监控告警 系统脚本 Cron + Email ⭐⭐⭐
定期清理 系统脚本 Cron + find/delete ⭐⭐

故障恢复能力

  • 轻度故障(Quota 95%):10分钟内恢复
  • 中度故障(磁盘满,仿真中断):30分钟内从检查点恢复
  • 重度故障(数据损坏):依赖备份,恢复时间不确定

通过实施上述策略,可以将磁盘空间相关的故障率降低 90% 以上,显著提升 IC 设计环境的稳定性和用户体验。

[!TIP] 建议在团队内部建立 存储使用规范,包括:

  • 个人 Quota 上限
  • 仿真结果保留期限
  • 归档流程
  • 紧急清理联系人