Build Next.js chậm: nghẽn ở ổ đĩa hay ở CPU

Chia sẻ bài viết

Mục lục
Build Next.js chậm: nghẽn ở ổ đĩa hay ở CPU

Trả lời nhanh: Quá trình build Next.js có hai giai đoạn nặng theo hai kiểu khác nhau. Cài thư viện đọc ghi hàng chục nghìn file nhỏ, đây là công việc của ổ đĩa và là nơi ổ NVMe bỏ xa ổ thường. Giai đoạn biên dịch và tối ưu chủ yếu ăn CPU, trong đó nhiều bước chạy tuần tự nên xung nhịp quan trọng hơn số nhân. Muốn biết mình nghẽn ở đâu, chạy lệnh đo trong lúc build và xem chỉ số I/O wait cùng mức dùng từng nhân.

Build mất bốn phút, sửa một dòng lại build tiếp bốn phút. Một ngày mất cả tiếng chỉ để ngồi chờ. Trước khi nâng cấp máy, hãy xác định đúng thứ đang làm bạn chậm.

Tóm tắt nhanh
  • Cài thư viện là công việc của ổ đĩa: hàng chục nghìn file nhỏ, đúng kiểu đọc ghi ngẫu nhiên.
  • Biên dịch và tối ưu là công việc của CPU, nhiều bước chạy tuần tự nên cần xung cao.
  • Đo bằng cách chạy top hoặc iostat song song với lệnh build.
  • Bộ nhớ đệm build giúp nhiều nhất nhưng chỉ hiệu quả khi ổ đĩa đủ nhanh.

Bốn giai đoạn và thứ chúng ngốn

Giai đoạnNgốn gì nhấtGhi chú
Cài thư việnỔ đĩaHàng chục nghìn file nhỏ, đọc ghi ngẫu nhiên
Biên dịch mãCPUChia được cho nhiều nhân ở một mức nhất định
Tối ưu và đóng góiCPUNhiều bước tuần tự, xung nhịp quyết định
Ghi kết quả ra thư mụcỔ đĩaNhiều file nhỏ

Nhìn bảng này thấy ngay vì sao câu hỏi ổ đĩa hay CPU không có đáp án chung: tuỳ dự án của bạn nặng ở giai đoạn nào.

Cách đo chính xác

Mở hai phiên làm việc. Phiên một chạy build, phiên hai chạy lệnh theo dõi:

iostat -x 2

Quan sát trong lúc build:

  • Cột %util gần 100 trong lúc cài thư viện nghĩa là ổ đĩa đang là nút thắt.
  • Một nhân chạm 100 phần trăm còn các nhân khác rảnh ở giai đoạn tối ưu nghĩa là bạn bị giới hạn bởi xung nhịp.
  • Tất cả các nhân đều bận nghĩa là thêm nhân sẽ giúp ích.

Ghi lại thời gian từng giai đoạn qua vài lần build để biết mình đang mất thời gian ở đâu nhiều nhất.

Cách rút ngắn thời gian build

  1. Bật bộ nhớ đệm build và bộ nhớ đệm trình quản lý gói. Đây là thứ hiệu quả nhất, nhưng bản thân bộ nhớ đệm cũng đọc ghi ổ đĩa nên ổ nhanh vẫn cần.
  2. Chỉ cài thư viện cần cho môi trường chạy thật. Bỏ bớt phần chỉ dùng khi phát triển.
  3. Dùng trình quản lý gói nhanh hơn. Khác biệt chủ yếu nằm ở cách chúng xử lý số lượng lớn file nhỏ.
  4. Tách build khỏi máy chạy thật. Có máy build riêng thì máy phục vụ khách không bị ảnh hưởng.
  5. Nâng ổ trước khi nâng nhân. Với phần lớn dự án web, đây là khoản đầu tư cho cảm giác nhanh rõ rệt nhất.

Đo từng giai đoạn, không đo tổng

# Tach thoi gian cai thu vien va thoi gian build
time npm ci
time npm run build

# Xem chi tiet tung buoc bien dich
NEXT_TELEMETRY_DISABLED=1 npm run build -- --profile

# Do song song o phien thu hai
iostat -x 2      # cot %util va await
vmstat 2         # cot wa, si, so
htop             # bam phim 1 de xem tung nhan

Cách đọc nhanh: npm ci lâu mà npm run build nhanh là nghẽn ổ đĩa. Ngược lại là nghẽn vi xử lý. Cả hai đều lâu và vmstat có swap là thiếu bộ nhớ, phải sửa cái đó trước.

Cấu hình đề xuất theo quy mô dự án

Dự ánRAMỔ đĩaCPUThời gian build tham khảo
Trang giới thiệu, dưới 50 trang4 GBNVMe 40 GB2 nhân1 tới 2 phút
Ứng dụng web vừa, có xác thực và cơ sở dữ liệu8 GBNVMe 80 GB4 nhân xung cao2 tới 4 phút
Thương mại điện tử, hàng nghìn trang tĩnh16 GBNVMe 160 GB6 tới 8 nhân5 tới 10 phút
Kho mã nguồn gộp nhiều ứng dụng32 GBNVMe 320 GB8 nhân trở lêntùy cấu hình chia việc

Bộ nhớ là thứ cần trước tiên. Quá trình build hiện đại có thể chiếm vài gigabyte, và khi hết bộ nhớ thì tiến trình bị hệ thống dừng giữa chừng với thông báo khó hiểu. Nếu bạn gặp lỗi hết bộ nhớ, tăng giới hạn tạm bằng NODE_OPTIONS=--max-old-space-size=4096, nhưng cách bền là thêm bộ nhớ thật.

Năm cách rút ngắn, xếp theo hiệu quả

  • Giữ bộ nhớ đệm build giữa các lần chạy. Trên máy riêng thì tự có. Trên hệ thống tích hợp liên tục, phải khai rõ thư mục đệm để lưu và khôi phục, nếu không mỗi lần chạy là bắt đầu từ đầu.
  • Chỉ build lại phần đã đổi. Với kho mã nguồn gộp, dùng công cụ quản lý kho gộp để bỏ qua các gói không thay đổi.
  • Xem lại các trang tạo sẵn. Sinh sẵn hàng nghìn trang lúc build là chậm nhất. Cân nhắc chuyển sang sinh khi có yêu cầu đầu tiên rồi giữ lại, cách này rút thời gian build xuống rất nhiều với trang thương mại điện tử.
  • Bỏ bớt thư viện nặng. Kiểm bằng công cụ phân tích gói. Một thư viện biểu đồ hay một thư viện xử lý ngày tháng đầy đủ có thể chiếm phần lớn thời gian đóng gói.
  • Tách bước kiểm kiểu dữ liệu ra khỏi build. Chạy kiểm kiểu song song ở bước riêng thay vì nằm trong đường build chính.

Khi nào nên chuyển sang máy chủ tự quản

Hệ thống tích hợp liên tục miễn phí thường chậm vì hai lý do cộng lại: máy dùng chung cấu hình thấp, và mỗi lần chạy là môi trường mới nên mọi bộ nhớ đệm đều trống. Đội build từ mười lần một ngày trở lên nên tính lại: một máy chủ nhỏ ổ NVMe giữ được bộ nhớ đệm sống, thời gian chờ giảm hẳn, và chi phí thường thấp hơn khi tính đủ thời gian lập trình viên ngồi chờ.

Câu hỏi thường gặp

Build Next.js cần bao nhiêu RAM?

Dự án vừa thường cần 4GB để thoải mái. Dự án lớn có nhiều trang tĩnh có thể cần 8GB trở lên, thiếu RAM sẽ khiến quá trình build bị hệ thống tắt giữa chừng.

Ổ NVMe rút ngắn thời gian build bao nhiêu?

Phần cài thư viện cải thiện rõ nhất vì đó là đọc ghi hàng chục nghìn file nhỏ. Phần biên dịch phụ thuộc CPU nên ít thay đổi. Mức cải thiện tổng tuỳ tỉ trọng từng giai đoạn trong dự án của bạn.

Nên build trên máy cá nhân hay trên VPS?

Trên VPS nếu bạn cần build tự động, build ban đêm hoặc nhiều người cùng dùng chung môi trường. Máy cá nhân đủ cho làm việc một mình và không cần chạy liên tục.

Có nên tăng số nhân để build nhanh hơn?

Chỉ khi đo thấy tất cả các nhân đều bận. Nếu chỉ một nhân chạm trần thì thêm nhân không giúp gì, cần xung cao hơn hoặc cần tối ưu lại cấu hình build.

Hạ tầng NVMe Enterprise của TND
VPS ổ Enterprise U.2 NVMe, CPU xung cao, đặt tại Việt Nam
Truy vấn SQL, PHP dựng trang, build Next.js hay đóng gói app iOS và Android: phần lớn các bước này chạy đơn luồng và đập liên tục vào ổ đĩa. Nghẽn nằm ở tốc độ đọc ghixung nhịp CPU, không phải ở việc có thật nhiều nhân. Ổ Enterprise U.2 NVMe chuẩn máy chủ chạy RAID 10 cho IOPS đọc ghi ngẫu nhiên gấp 5 đến 7 lần ổ SATA SSD, khác hẳn NVMe M.2 phổ thông. Chạy trên chip Intel Xeon Platinum dòng xung cao, backup tự động hàng tuần, bàn giao trong 5 phút.
Xem VPS NVMe Enterprise, chip Intel Xeon Platinum xung cao

Bài viết liên quan