readFileSync blocking — giữ event loop hoàn toàn cho đến khi OS trả data, không xử lý request nào khác trong thời gian đó. readFile non-blocking — gửi I/O request đến libuv thread pool, event loop tự do xử lý requests khác.
Impact thực tế: readFileSync đọc file 50ms trên server 1000 req/s → mỗi request xếp hàng bị delay 50ms cộng dồn → latency spike hàng giây.
Khi sync chấp nhận được:
- module initialization trước
server.listen()—const config = JSON.parse(fs.readFileSync('config.json', 'utf8'))chạy một lần duy nhất lúc startup, không có traffic; - CLI tools;
- build scripts
Quy tắc: bất kỳ code nào chạy SAU server.listen() trong request path — bắt buộc dùng async.
Đo blocking: node --prof app.js → node --prof-process isolate-*.log → readFileSync trong hot path hiện rõ ràng với % CPU time.