在 2 核 2G 的云服务器上部署 Python 项目时,内存不足是常见问题。以下是系统化的优化方案,按优先级排序:
一、紧急缓解措施(立即生效)
1. 添加 Swap 分区
# 创建 2GB swap 文件
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
⚠️ Swap 会降低性能,但能避免 OOM 崩溃
2. 限制 Python 进程内存
# 在启动脚本中设置资源限制
import resource
resource.setrlimit(resource.RLIMIT_AS, (2*1024*1024*1024, 2*1024*1024*1024)) # 限制为 2GB
二、应用层优化
3. 调整 WSGI/Gunicorn 配置
# gunicorn.conf.py
workers = 1
worker_class = 'sync' # 或 'gevent' 更省内存
threads = 1
max_requests = 1000
max_requests_jitter = 50
timeout = 30
keepalive = 2
limit_request_line = 4094
limit_request_fields = 100
limit_request_field_size = 8190
启动命令:
gunicorn -c gunicorn.conf.py app:app --bind 0.0.0.0:8000
4. 使用轻量级框架替代
- Flask → FastAPI(异步支持更好)
- Django → Flask/FastAPI + 精简依赖
- 禁用不必要的中间件和扩展
5. 数据库优化
-- MySQL 配置示例 (my.cnf)
[mysqld]
innodb_buffer_pool_size = 128M
max_connections = 50
query_cache_size = 0 # 新版本已废弃
或使用 SQLite 替代(适合低并发场景):
DATABASE_URL = "sqlite:///app.db"
三、架构优化
6. 启用缓存
# Redis 缓存(可复用现有连接)
from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'redis', 'CACHE_REDIS_URL': 'redis://localhost:6379/0'})
或使用内存缓存(减少外部依赖):
from cachetools import LRUCache
cache = LRUCache(maxsize=1000)
7. 静态资源分离
- Nginx 托管静态文件(CSS/JS/图片)
- Gzip 压缩响应内容
- CDN 提速静态资源
Nginx 配置片段:
location ~* .(css|js|jpg|png|gif)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
四、监控与调优
8. 实时监控内存
# 安装监控工具
sudo apt install htop meminfo
# 查看实时内存
htop
free -h
9. 分析内存泄漏
# 使用 memory_profiler
from memory_profiler import profile
@profile
def heavy_function():
data = [i for i in range(100000)]
return sum(data)
启动时添加:
python -m memory_profiler your_app.py
五、终极方案
如果上述方法仍无法满足需求:
- 升级服务器:考虑 4G+ 内存实例
- 容器化优化:
FROM python:3.9-slim ENV PYTHONUNBUFFERED=1 RUN apt-get update && apt-get install -y --no-install-recommends libpq-dev gcc COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt - 无服务器部署:AWS Lambda / Google Cloud Functions
- 水平扩展:多个小实例 + 负载均衡
快速检查清单
- [ ] 已配置 Swap 分区
- [ ] Gunicorn workers 设为 1
- [ ] 数据库连接池大小合理
- [ ] 静态资源由 Nginx 托管
- [ ] 启用了缓存机制
- [ ] 移除了不必要的第三方库
- [ ] 配置了日志轮转(避免磁盘占满)
建议优先实施 Swap + Gunicorn 优化 + 静态资源分离,这三项通常能解决 80% 的内存问题。如果业务增长迅速,及时评估硬件升级成本比过度优化代码更经济。
云服务器