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

cgroups v2 giới hạn CPU đo thật: --cpus=0.5 đặt cpu.max 50000/100000 chứ không giấu bớt lõi, một khối việc 6 giây phình thành 77 giây ở --cpus=0.2, nproc vẫn báo đủ 10 lõi host, cpu.stat cho thấy luồng bị ghìm 50 trên 51 chu kỳ

cgroups giới hạn cái container dùng, khác namespace cô lập cái nó thấy. --cpus=X đặt cpu.max = quota/period: --cpus=0.5 là 50 ms chạy mỗi 100 ms rồi bị ghìm. Nhưng nproc vẫn báo đủ 10 lõi host, nên Go đặt GOMAXPROCS=10 và Java tính pool theo 10 lõi. Một luồng busy 5 giây ở --cpus=0.5 chỉ chạy 2,55 giây, bị ghìm 50 trên 51 chu kỳ, chờ 2,5 giây dù host rảnh, đọc qua cpu.stat. Cùng khối việc 6 giây chạy như nhau ở 1, 2 hay unlimited CPU nhưng thành 12 giây ở 0.5 và 77 giây ở 0.2. Một request 1 giây CPU biến thành 12 giây.

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

cgroups v2 giới hạn bộ nhớ đo thật: --memory=128m đặt memory.max 128 MiB, vượt trần là OOM killer giết chứ không chạy chậm, container chết với exit 137 và OOMKilled=true, nhưng OOM chỉ giết tiến trình ngốn RAM nên PID 1 sống thì container sống

Khác CPU bị ghìm, bộ nhớ vượt trần thì OOM killer giết tiến trình. --memory=128m đặt memory.max 134217728 byte. Tắt swap rồi cho một tiến trình ngốn 10 MB mỗi vòng: memory.current leo 95, 105, 115, 125 MB rồi vượt 128 MB là bị SIGKILL, container exit 137 và OOMKilled=true. memory.events đếm max là số lần chạm trần và oom_kill là số tiến trình bị giết. Điểm quan trọng: OOM giết tiến trình ngốn RAM, không nhất thiết cả container, nên nếu PID 1 không phải kẻ ngốn thì container vẫn Running. memory.high ghìm mềm thì Docker không phơi ra.

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

cgroups v2 giới hạn I/O và số tiến trình đo thật: --pids-limit chặn fork bomb đúng tại trần 50 tiến trình, --device-write-bps bóp ghi đĩa từ 1,7 GB/s xuống 10,6 MB/s, nhưng ghi buffered lách qua page cache với 3,3 GB/s và chỉ bị bóp khi fsync

Hai lưới an toàn ít ai đặt. pids.max là trần cho tổng số tiến trình: fork bomb bằng python os.fork() dừng đúng tại 50 tiến trình với --pids-limit=50, pids.current chạm 50, pids.events đếm fork bị từ chối. io.max là trần băng thông đĩa: --device-write-bps /dev/vda:10mb cho io.max wbps 10485760, ghi direct bị bóp xuống 10,6 MB/s so với 1,7 GB/s không giới hạn. Nhưng io.max chỉ chặn I/O thật xuống thiết bị: ghi buffered vào page cache đạt 3,3 GB/s vì chưa chạm đĩa, chỉ bị bóp xuống 10,4 MB/s khi fsync ép writeback. App ghi rồi fsync như database cảm nhận io.max, ghi buffered rồi quên thì không.