如何排查Next.js应用部署到Vercel后运行缓慢的问题?
Vercel 部署 Next.js + Prisma + RDS Postgres 性能问题排查步骤
1. 网络链路排查
- 先做基础数据库查询耗时对比:新增一个测试接口,仅执行Prisma无业务查询
await prisma.$queryRawSELECT 1``,分别统计本地调用、Vercel部署后调用的耗时,如果部署后基础查询耗时比本地高数百ms,优先判定为跨区域网络问题。 - 核对部署区域一致性:确认RDS实例的可用区与Vercel Serverless函数的部署区域完全一致,跨区域访问数据库会带来百ms级的固定延迟,可在Vercel项目设置中将函数部署区域修改为与RDS同区域。
- 检查RDS访问策略:确认RDS安全组、网络ACL没有额外的流量校验、geo拦截等规则,避免不必要的网络开销。
2. Prisma 客户端配置排查
- 检查Prisma连接池配置:Serverless环境下默认连接池配置可能不适配,根据Vercel函数并发上限调整
connection_limit参数,免费版Vercel并发上限为10,可将连接字符串配置为postgresql://xxx:xxx@xxx:5432/xxx?connection_limit=10&connect_timeout=10,避免连接不足或超时重试带来的延迟。 - 确认Prisma实例全局复用:避免每次请求都新建Prisma实例,每次新建实例都会触发数据库连接重建,显著增加耗时,推荐全局单例复用方案:
import { PrismaClient } from '@prisma/client' const globalForPrisma = globalThis as unknown as { prisma: PrismaClient } export const prisma = globalForPrisma.prisma || new PrismaClient() if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
- 校验Prisma引擎生成逻辑:在
package.json的build脚本中添加prisma generate,确保构建时生成适配Vercel运行环境的Prisma引擎,避免运行时加载异常带来的额外开销。
3. Vercel 运行环境排查
- 排查冷启动影响:如果只有首次请求慢,后续请求速度恢复正常,属于Serverless函数冷启动特性,可通过配置函数预热、将高频接口迁移到边缘函数降低冷启动影响。
- 分析请求耗时分布:在Vercel项目后台的Analytics面板中查看请求各环节耗时,明确是函数执行耗时、网络传输耗时还是静态资源加载耗时,缩小排查范围。
- 优化服务端逻辑:检查是否存在串行的Prisma查询,可修改为并行查询减少耗时叠加;本地开发可能存在缓存机制掩盖慢查询问题,部署后无缓存会暴露性能缺陷。
4. 数据库层面排查
- 开启Prisma查询日志:初始化Prisma时开启查询日志,统计每个查询的实际执行时间:
const prisma = new PrismaClient({ log: ['query', 'info', 'warn', 'error'], })
- 分析慢查询执行计划:将日志中标记的慢查询放到RDS查询编辑器中执行,查看执行计划,确认是否存在未建索引导致的全表扫描,本地开发数据量通常远小于RDS,会出现本地查询快、RDS查询慢的情况。
- 检查RDS资源使用率:查看RDS实例的CPU、内存、IOPS指标,确认是否有异常资源占用,即使无对外流量,未优化的定时任务、批量查询也可能导致资源打满。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

