close

Kinh nghiệm tối ưu hiệu suất n8n self-host: database, execution, queue mode

Tác giả: Đông Tùng Ngày đăng: 16/07/2025 Chuyên mục: n8n
Disclosure
Website Tino blog được cung cấp bởi Tino Group. Truy cập và sử dụng website đồng nghĩa với việc bạn đồng ý với các điều khoản và điều kiện trong chính sách bảo mật - điều khoản sử dụng nội dung. Tino Group có thể thay đổi điều khoản sử dụng bất cứ lúc nào. Việc bạn tiếp tục sử dụng Tino blog sau khi thay đổi có nghĩa là bạn chấp nhận những thay đổi đó.
Why Trust Us
Các bài viết với hàm lượng tri thức cao tại Tino blog được tạo ra bởi các chuyên viên Marketing vững chuyên môn và được kiểm duyệt nghiêm túc theo chính sách biên tập bởi đội ngũ biên tập viên dày dặn kinh nghiệm. Mọi nỗ lực của chúng tôi đều hướng đến mong muốn mang đến cho cộng đồng nguồn thông tin chất lượng, chính xác, khách quan, đồng thời tuân thủ các tiêu chuẩn cao nhất trong báo cáo và xuất bản.

Muốn n8n self-host chạy nhanh và ổn định, hãy làm theo thứ tự: chuyển database sang PostgreSQL, bật tự dọn dữ liệu execution cũ, giới hạn số lượt chạy đồng thời, lưu file nhị phân ra ổ đĩa, rồi mới tách queue mode với Redis và worker khi một tiến trình không còn đủ. Mỗi bước đều có biến môi trường chính thức.

Bài này dành cho n8n đã cài đặt trên VPS bằng Docker. Nếu bạn đang tìm khái niệm self host và cách chọn giữa tự host với n8n Cloud, xem so sánh n8n self-host và n8n Cloud.

Vì sao n8n self-host chạy chậm?

n8n self-host thường chậm vì bốn nhóm nguyên nhân: máy chủ thiếu RAM hoặc ổ đĩa chậm, database SQLite phình to vì giữ quá nhiều dữ liệu execution, quá nhiều workflow chạy cùng lúc trong một tiến trình, và workflow xử lý dữ liệu lớn hơn mức cần. Biết nhóm nguyên nhân trước giúp bạn không nâng cấp VPS khi lỗi nằm ở workflow.

Cấu hình phần cứng máy chủ

  • CPU: số lõi và tốc độ CPU ảnh hưởng trực tiếp đến tốc độ chạy workflow phức tạp hoặc xử lý nhiều dữ liệu.
  • RAM: workflow nhiều bước, dữ liệu lớn hoặc nhiều lượt chạy đồng thời tiêu tốn nhiều RAM. Theo tài liệu n8n, bộ nhớ dùng phụ thuộc lượng dữ liệu, số node và số lượt chạy cùng lúc, nên n8n không công bố mức RAM tối thiểu cố định (Memory-related errors).
  • Ổ cứng: tốc độ đọc ghi ảnh hưởng đến database (SQLite hoặc PostgreSQL) và file tạm. SSD hoặc NVMe nhanh hơn rõ rệt so với HDD.
  • Mạng: workflow gọi API bên ngoài hoặc tải file lớn phụ thuộc băng thông và độ trễ mạng.

Cấu hình phần mềm n8n và môi trường

  • Database: mặc định n8n dùng SQLite, phù hợp cài đặt nhỏ. Khi lượng execution lớn, SQLite dễ thành điểm nghẽn.
  • Chế độ chạy: mặc định regular, mọi thứ chạy trong một tiến trình; queue tách phần thực thi sang các worker.
  • Dữ liệu execution: n8n lưu kết quả từng lần chạy; giữ quá lâu làm database phình to và chậm.
  • Phiên bản n8n: bản mới thường có cải tiến hiệu năng và bản vá; nên cập nhật định kỳ.

Thiết kế workflow

  • Độ phức tạp: càng nhiều node, vòng lặp, nhánh điều kiện thì càng tốn tài nguyên và thời gian.
  • Kích thước dữ liệu: xử lý file lớn hoặc danh sách dài trong một lần chạy làm tăng RAM.
  • Số lượt chạy đồng thời và tần suất: trigger quá dày (mỗi giây) hoặc nhiều webhook cùng lúc dễ gây quá tải.

Giám sát và bảo trì

  • Thiếu giám sát: không theo dõi CPU, RAM, ổ đĩa, số execution thì khó phát hiện vấn đề sớm.
  • Không cập nhật: bỏ lỡ bản vá lỗi hiệu năng và bảo mật.
  • Log và dữ liệu cũ: không dọn thì đầy ổ đĩa và làm chậm hệ thống.

Nên tối ưu n8n self-host theo thứ tự nào?

Nên tối ưu n8n self-host từ việc rẻ và ít rủi ro đến việc phức tạp: dọn dữ liệu và chuyển database trước, sau đó giới hạn lượt chạy đồng thời, cuối cùng mới tách queue mode. Bảng dưới tóm tắt từng bước, biến môi trường dùng và lúc nên làm.

BướcLàm gìBiến hoặc lệnh chínhNên làm khi
1Chuyển database sang PostgreSQLDB_TYPE=postgresdbChạy thật, nhiều execution mỗi ngày
2Tự dọn dữ liệu execution cũEXECUTIONS_DATA_PRUNE, EXECUTIONS_DATA_MAX_AGE, EXECUTIONS_DATA_PRUNE_MAX_COUNTDatabase tăng dung lượng nhanh
3Giới hạn lượt chạy đồng thờiN8N_CONCURRENCY_PRODUCTION_LIMITNhiều webhook đến cùng lúc làm treo n8n
4Lưu binary data ra ổ đĩaN8N_DEFAULT_BINARY_DATA_MODE=filesystemWorkflow xử lý file, ảnh, PDF
5Tách queue mode với Redis và workerEXECUTIONS_MODE=queue, n8n worker --concurrency=5Một tiến trình không còn đủ dù đã làm 1–4
6Giám sát bằng PrometheusN8N_METRICS=trueCần số liệu để quyết định nâng cấp
Biến môi trường theo docs.n8n.io, truy cập 23/10/2026

Kinh nghiệm tối ưu hiệu suất n8n self-host

Chọn cấu hình máy chủ và hệ điều hành phù hợp

Cấu hình máy chủ cho n8n nên bắt đầu vừa đủ rồi nâng theo số liệu giám sát. Kinh nghiệm thực tế: 2 vCPU là mức khởi đầu, 4 vCPU cho hệ thống nhiều workflow; RAM từ 4GB cho cài đặt nhỏ và vừa, 8–16GB khi xử lý dữ liệu lớn hoặc chạy cả PostgreSQL, Redis trên cùng VPS. Luôn dùng SSD hoặc NVMe.

  • Hệ điều hành: dùng Ubuntu 24.04 LTS hoặc Debian 12/13 và cập nhật bản vá thường xuyên. CentOS Linux đã hết vòng đời ngày 30/06/2024, không nên dùng cho máy mới.
  • Tắt dịch vụ không cần thiết: giảm tiến trình chạy ngầm không liên quan để dành CPU, RAM cho n8n.
  • Swap: một lượng swap vừa phải (khoảng 1–2 lần RAM với VPS nhỏ) giúp hệ thống không bị dừng khi tải tăng đột ngột, nhưng dùng swap thường xuyên là dấu hiệu thiếu RAM.

Bảng cấu hình theo quy mô: cấu hình tối thiểu để triển khai VPS n8n. Giới hạn RAM, CPU cho từng container Docker: tối ưu RAM và CPU cho n8n Docker trên VPS.

Dùng PostgreSQL thay vì SQLite

PostgreSQL là database nên dùng cho n8n chạy thật; n8n hỗ trợ PostgreSQL 16, 17 và 18 (Choose n8n’s database). MySQL và MariaDB không còn được hỗ trợ làm database của n8n từ bản 2.0 (v2.0 breaking changes); node MySQL để đọc ghi dữ liệu trong workflow vẫn dùng bình thường.

SQLite là database dạng file, đơn giản, hợp với cài đặt cá nhân ít workflow. Khi số workflow và execution tăng, SQLite xử lý đồng thời kém hơn và file database phình to. Cách chuyển dữ liệu sang PostgreSQL bằng lệnh export và import của n8n: đổi database n8n từ SQLite sang PostgreSQL.

Bật tự dọn dữ liệu execution cũ

n8n tự xóa dữ liệu execution cũ theo hai ngưỡng: tuổi (mặc định 336 giờ, tức 14 ngày) và số lượng (mặc định 10.000 execution). Biến EXECUTIONS_DATA_MAX_AGE tính bằng giờ (Executions environment variables). Hạ hai ngưỡng này là cách rẻ nhất để database nhẹ lại.

EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168            # giữ 7 ngày (tính bằng giờ)
EXECUTIONS_DATA_PRUNE_MAX_COUNT=5000
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none   # không lưu execution chạy thành công

Chỉ đặt EXECUTIONS_DATA_SAVE_ON_SUCCESS=none khi bạn không cần xem lại lần chạy thành công; execution lỗi vẫn được lưu để gỡ lỗi.

Giới hạn số lượt chạy đồng thời

Ở chế độ regular, N8N_CONCURRENCY_PRODUCTION_LIMIT giới hạn số lượt chạy production cùng lúc; mặc định -1 là không giới hạn (Executions environment variables). Lượt chạy vượt giới hạn được xếp hàng chờ thay vì chạy cùng lúc làm tràn RAM.

N8N_CONCURRENCY_PRODUCTION_LIMIT=10

Ở queue mode, mỗi worker tự giới hạn bằng cờ --concurrency (xem phần queue mode bên dưới).

Lưu binary data ra ổ đĩa

Binary data là file đính kèm, ảnh, PDF đi qua workflow. Từ n8n 2.0, chế độ giữ binary data trong RAM đã bị gỡ; ở chế độ regular, mặc định là filesystem, ở queue mode mặc định là database, ngoài ra có s3 (v2.0 breaking changes).

N8N_DEFAULT_BINARY_DATA_MODE=filesystem

Đảm bảo thư mục dữ liệu (mặc định nằm trong .n8n) còn đủ dung lượng. Tài liệu queue mode ghi n8n không hỗ trợ lưu binary data dạng filesystem khi chạy queue mode; khi đó dùng database hoặc S3.

Chạy n8n ở queue mode khi một tiến trình không còn đủ

Queue mode tách n8n thành một tiến trình main nhận trigger và webhook, Redis giữ hàng đợi, và nhiều worker thực thi workflow song song. Worker lấy việc từ Redis, đọc workflow trong database, chạy xong thì ghi kết quả lại (Enable queue mode).

Sơ đồ queue mode của n8n: trigger và webhook vào tiến trình main, main đẩy mã execution vào Redis, các worker lấy việc từ Redis, đọc và ghi kết quả vào PostgreSQL; main và mọi worker dùng chung khóa mã hóa và cùng database

Các điều kiện bắt buộc theo tài liệu n8n:

  • Đặt EXECUTIONS_MODE=queue trên main và trên mọi worker.
  • Dùng PostgreSQL; n8n không khuyến nghị chạy queue mode với SQLite.
  • Main, worker và webhook processor phải dùng chung N8N_ENCRYPTION_KEY, nếu không worker không giải mã được credentials.
  • Worker mặc định chạy 10 việc song song; n8n khuyên đặt --concurrency từ 5 trở lên.

Ví dụ phần khai báo trong Docker Compose (rút gọn, cần thêm service PostgreSQL và các biến DB_*):

services:
  redis:
    image: redis:7-alpine
    restart: unless-stopped

  n8n:
    image: n8nio/n8n:2.44.6
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - DB_TYPE=postgresdb

  n8n-worker:
    image: n8nio/n8n:2.44.6
    command: worker --concurrency=5
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - DB_TYPE=postgresdb

Main và worker phải chạy cùng một phiên bản n8n. Muốn thêm sức xử lý, tăng số worker (docker compose up -d --scale n8n-worker=2) thay vì chỉ tăng concurrency.

Khi lượng webhook rất lớn, có thể chạy thêm tiến trình n8n webhook riêng và đặt N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true trên main để main không nhận webhook production nữa (Enable queue mode). Cần một reverse proxy chia đường dẫn /webhook/ sang các tiến trình này; cách cấu hình Nginx xem ở cấu hình Nginx reverse proxy và SSL cho n8n.

Redis trong queue mode đóng vai trò hàng đợi việc (thư viện Bull), không phải bộ nhớ đệm cho workflow. Nếu cần nhiều n8n độc lập trên cùng máy thay vì một n8n nhiều worker, xem chạy nhiều instance n8n trên cùng 1 VPS.

Một số biến môi trường khác nên biết

  • N8N_PUSH_BACKEND: chọn websocket (mặc định) hoặc sse để gửi cập nhật lên giao diện; đổi sang sse khi proxy không hỗ trợ WebSocket (Deployment environment variables).
  • EXECUTIONS_TIMEOUT: thời gian tối đa (giây) cho mỗi workflow, mặc định -1 là không giới hạn; đặt giá trị để workflow treo không giữ tài nguyên mãi.
  • N8N_METRICS=true: bật endpoint /metrics cho Prometheus (xem phần giám sát).

Tối ưu workflow

Tối ưu workflow thường mang lại hiệu quả lớn hơn nâng cấp máy chủ, vì phần lớn tài nguyên bị tiêu vào dữ liệu thừa và lượt chạy không cần thiết.

  • Dùng Schedule Trigger hợp lý: với tác vụ định kỳ, chọn khoảng thời gian thật sự cần (mỗi giờ, mỗi ngày) thay vì chạy mỗi phút để kiểm tra.
  • Tách phần dùng chung thành sub-workflow: gọi bằng node Execute Workflow để dễ bảo trì; sub-workflow chạy xong sẽ giải phóng dữ liệu của nó, giúp workflow cha nhẹ hơn khi xử lý danh sách dài.
  • Gọi API hiệu quả: với node HTTP Request, chỉ lấy trường cần thiết, đặt Timeout để không treo khi API chậm, bật Retry On Fail cho lỗi tạm thời.
  • Tôn trọng giới hạn tốc độ API: chia dữ liệu thành lô bằng Loop Over Items, thêm node Wait giữa các lô hoặc dùng tùy chọn Batching của HTTP Request để không bị chặn vì gửi quá nhanh.
  • Có error workflow: đặt một workflow dùng Error Trigger để ghi lại và báo lỗi, giúp khoanh vùng sự cố nhanh.
  • Chỉ truyền dữ liệu cần thiết: dùng Edit Fields (Set) để bỏ bớt trường trước các bước nặng; JSON lớn không cần thiết làm tăng CPU, RAM.

Giám sát và theo dõi hiệu suất

Giám sát giúp bạn biết nên tối ưu ở đâu thay vì đoán. n8n xuất số liệu cho Prometheus khi đặt N8N_METRICS=true; endpoint /metrics chỉ nên mở cho dịch vụ nội bộ, không công khai ra Internet (Enable Prometheus metrics). Kết nối Prometheus với Grafana để xem số liệu theo thời gian.

  • CPU, RAM: dùng nhiều liên tục hoặc phải dùng swap là dấu hiệu cần tối ưu workflow hoặc tăng tài nguyên.
  • Ổ đĩa: I/O cao thường do database quá tải hoặc xử lý nhiều file lớn; theo dõi cả dung lượng trống.
  • Số execution và thời gian chạy: số lượt chờ trong hàng đợi tăng hoặc thời gian chạy trung bình tăng là lúc cân nhắc thêm worker.
  • Công cụ nhanh trên máy chủ: htop, docker stats để xem tài nguyên từng container.

Bảo mật và cập nhật

  • Cập nhật n8n định kỳ: bản mới có cải tiến hiệu năng và bản vá bảo mật; sao lưu trước khi nâng. Xem cách cập nhật n8n.
  • Cập nhật hệ điều hành, Docker, PostgreSQL, Redis để có bản vá ở cấp hệ thống.
  • Không mở cổng 5678 ra Internet: dùng reverse proxy (Nginx, Caddy) có HTTPS, hoặc Cloudflare Tunnel khi không muốn mở cổng trên tường lửa. Nhớ đặt N8N_WEBHOOK_URL (n8n từ 2.30.0) bằng địa chỉ công khai.

Kết luận

Tối ưu n8n self-host hiệu quả nhất khi làm theo thứ tự: PostgreSQL, dọn dữ liệu execution, giới hạn lượt chạy đồng thời, binary data ra ổ đĩa, rồi mới queue mode. Song song đó, rút gọn dữ liệu trong workflow và bật giám sát để có số liệu trước khi nâng cấp VPS.

Muốn chạy n8n 24/7 mà không tự cài? VPS n8n của Tino cài sẵn n8n trên VPS NVMe đặt tại Việt Nam; bạn vẫn có quyền root để cấu hình. Xem cấu hình và giá trên trang sản phẩm.

Những câu hỏi thường gặp

Tại sao nên sử dụng PostgreSQL thay vì SQLite cho n8n self-host?

SQLite là database mặc định, hợp với cài đặt nhỏ. Khi nhiều execution, SQLite xử lý đồng thời kém và file phình to. PostgreSQL (n8n hỗ trợ bản 16–18) xử lý đồng thời tốt hơn và là điều kiện để chạy queue mode. MySQL không còn được hỗ trợ làm database từ n8n 2.0.

Redis đóng vai trò gì trong việc tối ưu hiệu suất n8n?

Trong n8n, Redis chủ yếu làm hàng đợi cho queue mode: main đẩy mã execution vào Redis, worker lấy ra để chạy. Không chạy queue mode thì n8n không cần Redis.

Tại sao n8n của tôi chạy chậm hoặc treo khi xử lý nhiều workflow?

Thường do thiếu RAM, database SQLite quá lớn vì giữ nhiều execution, quá nhiều lượt chạy cùng lúc hoặc workflow truyền dữ liệu thừa. Kiểm tra theo thứ tự trong bảng của bài trước khi nâng cấp VPS.

Chế độ queue mode trong n8n là gì và khi nào nên sử dụng nó?

Queue mode tách phần thực thi workflow sang các worker, dùng Redis làm hàng đợi và PostgreSQL làm database. Nên dùng khi đã tối ưu database, dữ liệu execution và lượt chạy đồng thời mà một tiến trình n8n vẫn không đủ.

Biến N8N_EXECUTION_MODE hay EXECUTIONS_MODE mới đúng?

EXECUTIONS_MODE mới đúng, với giá trị regular hoặc queue. Biến N8N_EXECUTION_MODE và N8N_MAX_CONCURRENT_WORKFLOWS không có trong tài liệu n8n; để giới hạn lượt chạy đồng thời dùng N8N_CONCURRENCY_PRODUCTION_LIMIT hoặc cờ –concurrency của worker.

Việc cập nhật n8n có ảnh hưởng đến hiệu suất không?

Có. Bản mới thường có cải tiến hiệu năng và bản vá bảo mật. Sao lưu database và thư mục .n8n trước khi cập nhật, và đọc thay đổi lớn khi lên bản chính mới.

Đông Tùng

Senior Technology Writer

Là cử nhân Quản trị kinh doanh của Trường Đại học Tài chính - Marketing, Tùng bắt đầu làm việc tại Tino Group từ năm 2021 ở vị trí Content Marketing để thỏa mãn niềm đam mê viết lách của bản thân. Sở hữu khả năng sáng tạo đặc biệt, anh cùng đội ngũ của mình đã tạo nên những chiến dịch quảng cáo độc đáo cùng vô số bài viết hữu ích về nhiều chủ đề khác nhau. Sự tỉ mỉ, kiên trì và tinh thần sáng tạo của Tùng đã góp phần lớn vào thành công của Tino Group trong lĩnh vực marketing trực tuyến.

Xem thêm bài viết

Bài viết liên quan