如何解决AWS上Directus的CPU占用过高性能问题?
Directus高CPU负载及502错误排查分析
环境与配置
我们在AWS的t3.2xlarge实例(8 vCPUs/32GB内存)上部署了Directus,项目规模较小且几乎无流量,采用Redis(AWS ElastiCache)和PostgreSQL(AWS RDS)作为组件,通过Docker运行,相关配置如下:
directus: restart: always image: directus/directus:11.0.2 ports: - 80:80 environment: CORS_ENABLED: 'true' PORT: '80' CORS_ORIGIN: 'true' CORS_METHODS: 'GET,POST,PATCH,DELETE,OPTIONS' KEY: '***' SECRET: '***' DB_CLIENT: 'pg' DB_HOST: '***.us-east-1.rds.amazonaws.com' DB_PORT: '5432' DB_DATABASE: 'postgres' DB_USER: '***' DB_PASSWORD: '***' STORAGE_LOCATIONS: 's3' STORAGE_S3_DRIVER: 's3' STORAGE_S3_KEY: '***' STORAGE_S3_SECRET: '***' STORAGE_S3_BUCKET: '***' STORAGE_S3_REGION: 'us-east-1' STORAGE_S3__ENDPOINT: 's3.us-east-1.amazonaws.com' EMAIL_FROM: 'no-reply@***' EMAIL_TRANSPORT: 'mailgun' EMAIL_MAILGUN_API_KEY: '***' EMAIL_MAILGUN_DOMAIN: '***' CACHE_ENABLED: 'true' CACHE_STORE: 'redis' CACHE_AUTO_PURGE: 'true' REDIS: 'redis://***.use1.cache.amazonaws.com:6379' CONTENT_SECURITY_POLICY_DIRECTIVES__FRAME_SRC: "***" CONTENT_SECURITY_POLICY_DIRECTIVES__IMG_SRC: "array:'self',data:,https://*" PM2_INSTANCES: '8' PM2_AUTO_RESTART: 'true' PRESSURE_LIMITER_ENABLED: 'false'
问题描述
即使发起读取单个集合的简单API请求,PM2中也会出现CPU负载,多次请求后Directus会冻结并返回502错误。尝试过多种配置及最新版本,但均未解决问题。此前一年左右的旧版本Directus(Docker部署,含DB+Directus)运行正常。
可能的原因分析
- PM2实例数配置不合理:设置
PM2_INSTANCES: '8'与实例vCPU数一致,但低流量场景下,过多的Node.js进程会加剧资源竞争,增加CPU上下文切换开销,反而降低性能。旧版本可能未启用多实例或实例数更少,避免了此类问题。 - Redis连接或缓存逻辑问题:Redis与Directus实例间的网络延迟、Redis资源不足(内存/连接数限制),或
CACHE_AUTO_PURGE: 'true'导致的频繁缓存清理操作,都可能让Directus进程阻塞等待,引发CPU负载异常。 - PostgreSQL性能瓶颈:新版本Directus的查询复杂度可能提升(如更多元数据查询、关联查询),若RDS实例配置不足(CPU/内存不够),或存在低效SQL,会导致数据库响应缓慢,拖垮Directus进程。建议检查RDS监控指标(CPU使用率、查询等待时间)。
- 新版本性能回归:从旧版本升级到v11.0.2可能存在未被修复的性能bug,比如中间件、插件逻辑优化不当,导致简单请求也触发高CPU消耗。可尝试回退到旧版本对比验证。
- CSP配置格式错误:
CONTENT_SECURITY_POLICY_DIRECTIVES__IMG_SRC的array:'self',...格式不符合Directus要求,正确的数组类型配置应使用JSON数组格式(如["'self'", "data:", "https://*"]),错误配置可能引发解析异常,导致CPU消耗或进程崩溃。 - 压力限制器禁用导致资源耗尽:
PRESSURE_LIMITER_ENABLED: 'false'关闭了内置限流机制,请求堆积时进程无限制处理,最终导致CPU占满、进程冻结。旧版本可能默认启用该机制,避免资源耗尽。
内容的提问来源于stack exchange,提问作者Stan Shvaika
相关产品推荐
相关产品推荐

