DEV Community

Laptop Hưng Phát
Laptop Hưng Phát

Posted on Originally published at technologyspot.vn

Docker Compose đa dịch vụ: Chạy mượt trên 16GB RAM thay vì 32GB

Khi dựng môi trường phát triển cục bộ gồm PostgreSQL, Redis, backend API và frontend SPA, mức tiêu thụ tài nguyên thường vượt ngưỡng 10GB RAM danh định. Trên các cấu hình máy trạm hay laptop đồ họa như RTX 5070 Laptop, việc thiếu kiểm soát giới hạn tài nguyên dễ dẫn đến hiện tượng tráo đổi bộ nhớ (swap), làm chậm toàn bộ quy trình làm việc.

Thiết lập resource limits và healthcheck trong compose

Khác với môi trường production, môi trường phát triển trên máy 16GB RAM cần giới hạn trần (deploy.resources.limits) cho từng container để ngăn Redis hay PostgreSQL chiếm dụng bộ đệm vượt mức. Đồng thời, cấu hình healthcheck đảm bảo API chỉ khởi động sau khi cơ sở dữ liệu đã sẵn sàng nhận kết nối socket.

version: '3.8'
services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: app_dev
      POSTGRES_PASSWORD: secret
    deploy:
      resources:
        limits:
          memory: 512M
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 5
    volumes:
      - pgdata:/var/lib/postgresql/data

  cache:
    image: redis:7-alpine
    deploy:
      resources:
        limits:
          memory: 256M

  api:
    build: ./backend
    depends_on:
      db:
        condition: service_healthy
    deploy:
      resources:
        limits:
          memory: 1G
    volumes:
      - ./backend:/app
      - /app/node_modules

volumes:
  pgdata:
Enter fullscreen mode Exit fullscreen mode

Xử lý nghẽn I/O và file watcher chậm qua WSL2 bind mount

Vấn đề hiệu năng phổ biến nhất trên môi trường Windows chạy WSL2 là cơ chế đồng bộ file qua giao thức 9P giữa NTFS và Linux VFS. Khi chạy npm run dev hoặc vite, cơ chế file watcher quét hàng chục nghìn file trong thư mục node_modules gắn dạng bind mount (/mnt/c/...), gây trễ từ vài giây đến hàng chục giây cho mỗi lần hot reload.

Về mặt kỹ thuật, giải pháp tối ưu là chuyển toàn bộ mã nguồn vào hệ thống tệp gốc của Linux (\\wsl$\...) và cô lập node_modules bằng một named volume hoặc anonymous volume riêng biệt trong Docker. Cơ chế này ép Docker sử dụng driver lưu trữ nội bộ của WSL2, loại bỏ hoàn toàn độ trễ I/O qua lớp biên dịch file system của Windows.

Trong các bài phân tích phần cứng chuyên sâu tại technologyspot.vn, ranh giới bộ nhớ luôn là yếu tố phân tách rõ rệt giữa trải nghiệm mượt mà và tình trạng nghẽn cổ chai. Việc phân bổ định mức RAM hợp lý cho từng container giúp bạn duy trì hiệu năng ổn định mà chưa nhất thiết phải nâng cấp lên 32GB RAM.

Top comments (0)