Bài viết mới nhất

Tổng 2300 bài
Hệ thống 22/09/2026 7 phút

Load average thực sự nghĩa là gì: ba số 1/5/15 phút, và vì sao load cao không phải lúc nào cũng là CPU

Ai cũng thấy 'load average: 3.54, 1.34, 0.49' mà ít người đọc đúng. Nó không phải %CPU — mà là số tiến trình trung bình đang chạy HOẶC chờ I/O. Bài này chạy thật: 4 tiến trình CPU-bound làm load 1-phút leo từ 0.11 lên ~4; rồi 6 tiến trình dd kẹt ở D-state (chờ đĩa, gần 0% CPU) vẫn đẩy load lên — chứng minh load khác CPU. Và cách so load với số core để biết máy có quá tải không.

Hệ thống 22/09/2026 7 phút

Profiling CPU: tìm đúng hàm nóng (và đúng dòng) thay vì tối ưu theo cảm giác

Bạn đoán hàm A chậm, tối ưu cả ngày, hóa ra thủ phạm là hàm B. Profiler chấm dứt việc đoán mò: nó lấy mẫu stack định kỳ và chỉ ra hàm nào thực sự ngốn CPU bằng số. Bài này thử perf thật (bị container chặn — báo trung thực) rồi dùng Go pprof: hàm nóng chiếm 75.79% CPU, và pprof -list chỉ đúng dòng 17 ngốn 710ms. Bài cuối loạt Debug, kèm tổng kết 12 phần.

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

Regex thật ra là một cỗ máy trạng thái: engine khớp chuỗi thế nào

Nhiều người dùng regex như phép thuật mà không biết bên trong nó là gì. Thực ra engine làm hai việc: biên dịch mẫu thành một máy trạng thái, rồi chạy máy đó trên input. Bài này mở máy ra xem: python re.DEBUG in opcode thật của mẫu a(b|c)*d, và Go regexp (RE2) chứng minh nó duyệt input tuyến tính — input tăng gấp 5 thì thời gian cũng tăng gấp 5, ns mỗi ký tự gần như hằng số.

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

Tham lam vs lười trong regex: vì sao .* nuốt cả chuỗi còn .*? thì không

Cùng một mẫu, chỉ thêm một dấu ?, mà kết quả khác hẳn — và tốc độ cũng vậy. Bài này đo thật bằng python re: greedy .* nuốt cả '<b>xin</b> và <i>bạn</i>' thành một match, lazy .*? tách đúng bốn thẻ; và trên input 200k ký tự, greedy chậm hơn lazy 785 lần vì phải nhả dần (backtrack). Hiểu cơ chế để chọn đúng và tránh lỗi trích sai.

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

Neo và ranh giới trong regex: khớp thứ không phải là ký tự nào

^ $ \b \B không khớp ký tự nào, nhưng chúng quyết định mẫu của bạn đúng hay sai chỗ. Bài này đo thật: 'cat' khớp 4 chỗ (kể cả trong scatter, category), thêm \b thì chỉ còn 2 từ độc lập; và ^ $ đổi hẳn nghĩa khi bật cờ MULTILINE — từ 'đầu/cuối cả chuỗi' thành 'đầu/cuối mỗi dòng'. Hiểu anchor zero-width để tìm-thay-thế không dính nhầm.

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

Lớp ký tự và quantifier: hai viên gạch nền, và cái bẫy \w không phải [a-zA-Z]

Lớp ký tự [...] và quantifier {m,n} là nền của mọi regex, nhưng chúng giấu vài cái bẫy. Bài này đo thật: trên 'Hoà', \w khớp cả chữ à (Unicode) còn [a-zA-Z] thì đứt ở à thành 'Ho'; và trên '1234567', {2,4} greedy lấy 4 trước rồi 3, còn {2,4}? lazy lấy 2 mỗi lần. Xem cả opcode MAX_REPEAT + IN RANGE mà engine biên dịch ra.