Công cụ 22/09/2026 5 phút

cron: vì sao job "chạy tay thì được, cron thì không" — bẫy PATH và môi trường tối giản

Cron chạy job với môi trường tối giản, không nạp .bashrc, PATH rất ngắn — đó là lý do #1 khiến job cron im lặng thất bại dù chạy tay hoàn hảo. Bài này chạy crond THẬT: job fire lúc 10:24:01 báo 'go: command not found' vì PATH=/usr/bin:/bin, rồi sau khi set PATH trong crontab lại chạy đúng lúc 10:25:01. Kèm cú pháp năm trường và cách bắt log.

Lập trình Go 22/09/2026 11 phút

Worker pool và backpressure trong Go: vì sao 1 goroutine mỗi job là công thức sập

Số worker cố định + hàng đợi giới hạn giúp hệ thống chậm lại khi quá tải thay vì sập. Đo thật: pool giữ goroutine ở 6 trong khi cách ngây thơ 1-goroutine-mỗi-job bùng lên 102, và hàng đợi đầy chặn producer 89 lần (backpressure). Cơ chế và vì sao quan trọng. Go 1.23.

DevOps 22/09/2026 6 phút

PID namespace: ứng dụng trong container là PID 1 — và vì sao điều đó khiến docker stop chậm

Trong container, ứng dụng của bạn chạy với PID 1 như init của cả một hệ. Kernel bảo vệ PID 1: nó BỎ QUA các tín hiệu không có handler — nên app không xử lý SIGTERM sẽ phớt lờ docker stop. Bài này chạy thật: PID 1 sống sót sau SIGTERM, docker stop mất 3.1s (chờ grace rồi SIGKILL), và --init (tini) kéo xuống 0.1s.

Lập trình 22/09/2026 7 phút

RED và USE: hai phương pháp chọn đúng metric, để khỏi đo tràn lan mà vẫn mù lúc sự cố

Có công cụ metric rồi, câu hỏi khó hơn là ĐO CÁI GÌ. Đo tràn lan làm loãng tín hiệu và nổ cardinality; đo thiếu thì mù lúc sự cố. Hai phương pháp luận cắt gọn: RED (Rate, Errors, Duration) cho service, USE (Utilization, Saturation, Errors) cho tài nguyên. Bài này đo thật một service worker-pool ở tải thấp và tải cao: RED cho thấy lỗi nhảy từ 1.5% lên 6.9%, còn USE chỉ đúng nguyên nhân — pool utilization 100%, queue dồn tới 18, 103 request bị từ chối.