DEV Community

Review Laptop
Review Laptop

Posted on • Originally published at reviewlaptop.vn

SSD chậm làm nghẽn Docker build và bind mount ra sao?

Nhiều developer từng gặp cảnh máy treo cứng khi chạy docker pull hay docker build. CPU chỉ dùng chừng 15%, RAM còn thừa phân nửa, nhưng quạt rú và terminal đứng yên ở bước Extracting. Thủ phạm chính là nút thắt Disk I/O trên ổ cứng SSD khi Docker thao tác với layer cache và mount volume.

Nghẽn I/O khi Docker giải nén layer và kiểm tra cache

Mỗi layer trong Docker image thực chất là một gói nén tarball chứa các file thay đổi trên filesystem. Khi docker pull hoặc build từ Dockerfile:

  • Extracting layer: Engine phải giải nén đồng thời hàng ngàn file nhỏ (như thư mục node_modules hay thư viện Python). Thao tác này đòi hỏi tốc độ ghi ngẫu nhiên (random 4K write) rất cao từ SSD.
  • Layer cache hit: Docker daemon phải liên tục đọc metadata và so sánh checksum của các layer cũ qua storage driver (thường là overlay2). Nếu SSD có IOPS thấp, thời gian kiểm tra cache kéo dài đáng kể, biến việc build tưởng chừng tức thì thành thời gian chờ đợi.

Named volume và bind mount: Lựa chọn theo nhu cầu

Khi chạy container cho môi trường phát triển, cách mount dữ liệu quyết định trực tiếp độ trễ đọc/ghi file source code.

# Benchmark kiểm tra I/O ngẫu nhiên trên volume
fio --name=randwrite --ioengine=libaio --iodepth=16 --rw=randwrite --bs=4k --direct=1 --size=512M --numjobs=1 --runtime=30 --group_reporting
Enter fullscreen mode Exit fullscreen mode

Thực tế vận hành chia rõ hai nhóm nhu cầu:

  • Nhóm dev backend/frontend cần hot-reload: Bind mount thư mục mã nguồn trực tiếp từ máy host vào container thường bị trễ I/O do lớp filesystem bridge (nhất là trên WSL2 hoặc máy ảo). Giải pháp thực tế: chỉ bind mount đúng thư mục code cần chỉnh sửa, còn các thư mục phụ thuộc nặng file nhỏ như node_modules hoặc cache build thì cô lập vào named volume để đọc/ghi trực tiếp theo tốc độ native của Linux container.
  • Nhóm dev làm việc với build image nặng/CI local: Cần đưa thư mục dữ liệu gốc của Docker (/var/lib/docker) sang phân vùng SSD NVMe có tốc độ IOPS cao, đồng thời tận dụng multi-stage build và gộp lệnh RUN để giảm bớt số lượng layer trung gian sinh ra trên đĩa.

Cũng như việc kiểm soát xung đột phần cứng được phân tích trong nguồn tham khảo, hiểu đúng cách Docker tương tác với ổ cứng sẽ giúp bạn tối ưu thời gian build mà không lãng phí tài nguyên máy.

Top comments (0)