You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django + PostgreSQL每秒仅插入1000条,如何提升性能?

关于高CPU占用问题的诊断分析与优化建议

嘿,我梳理了你提供的诊断信息和代码片段,下面是具体的分析和可行的优化方向:

当前系统资源占用情况

用htop监测到两个关键进程的CPU占用值得重点关注:

  • python save_to_db.py:吃掉了**86%**的CPU,是当前系统最耗资源的进程
  • postgres: mydb mydb localhost idle in transaction:占用**16%**的CPU,且处于「事务空闲」状态,这通常意味着存在未收尾的数据库事务

你的代码核心结构

这里是你提供的save_to_db.py代码片段:

import datetime
import django
import os
import sys
import json
import itertools
import cProfile

# 配置独立Django环境...

from django.db import transaction
from xxx.models import File

INPUT_FILE = "xxx"
with open("xxx", "r") as f:
    volume_name = f.read().strip()

def todat...

针对性优化建议

1. 解决Python进程高CPU问题

你已经导入了cProfile,刚好可以用它精准定位性能瓶颈:
运行命令生成性能分析报告:

python -m cProfile -o profile_stats save_to_db.py

之后用pstats模块分析生成的profile_stats文件,就能找到哪段代码(比如你提到的todat...函数)在疯狂消耗CPU。常见的问题包括:

  • 循环处理大量数据时未采用批量操作
  • itertools的使用逻辑不够高效
  • 数据转换(比如日期处理)存在冗余计算

2. 修复PostgreSQL事务空闲问题

idle in transaction状态是个隐患——事务开着却不提交/回滚,会持续占用数据库连接和CPU资源。可以这么处理:

  • 检查代码里的事务逻辑,确保所有路径都有明确的提交或回滚操作。推荐用Django的上下文管理器来自动处理:
    with transaction.atomic():
        # 在这里执行所有数据库操作
        File.objects.create(...)
    
    这样即使中间出错,事务也会自动回滚,不会卡在空闲状态
  • 也可以直接查询PostgreSQL里的空闲事务,定位具体进程:
    SELECT pid, query_start, state FROM pg_stat_activity WHERE state = 'idle in transaction';
    
    找到对应的PID后可手动终止(不过优先从代码层面解决更稳妥)

内容的提问来源于stack exchange,提问作者OneRaynyDay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:50:39