Q

Quản trị viên

Là một lập trình viên yêu công nghệ, thích viết blog để chia sẻ kiến thức, kinh nghiệm lập trình và những điều thú vị trong thế giới tech.

2300 bài viết · Website
Hệ điều hành 03/09/2026 9 phút

Cùng một vòng read() chạy ngon với pipe lại treo cứng với socket: bẫy ngữ nghĩa ẩn sau chữ ký hàm giống hệt

Unix socket mang tiếng 'socket' nhưng không hề chậm hơn pipe: 12597 so với 10791 MB/s vì AF_UNIX đi thẳng trong nhân, không qua mạng. Khác biệt thật là ngữ nghĩa — SOCK_STREAM gộp byte và báo EOF, SOCK_DGRAM giữ ranh giới gói và không có EOF, nên một vòng read() bê nguyên sang datagram sẽ treo vô tận.

Hệ điều hành 03/09/2026 8 phút

Chương trình dùng 4 giây CPU trong 1 giây thật: con số '400%' nghe bất khả mà lại đúng

Bốn luồng bận báo %CPU = 400% — dùng 4 giây CPU trong 1 giây tường, nghe bất khả nhưng đúng: thời gian CPU cộng dồn qua các lõi. sleep dùng 0% CPU dù wall trôi 1 giây; I/O nặng sys 0,64 lớn hơn user 0,36. 'Mất bao lâu' là câu hỏi mơ hồ tới khi bạn hỏi 'wall hay CPU'.

Hệ điều hành 03/09/2026 9 phút

Ép malloc về một arena chỉ chậm nhẹ, tôi định chốt 'arena không quan trọng' — rồi tắt thêm một thứ, nó sập 24 lần

Ép malloc về một arena chỉ làm 8 luồng chậm từ 556 xuống 434 triệu op/s — tưởng arena vô dụng. Nhưng có một biến ẩn đang gánh thay nó: tắt luôn tcache thì thông lượng sập còn 23. Hai lớp chống tranh khóa, mỗi lớp che hiệu ứng của lớp kia. Đo thật.

Giải thuật 03/09/2026 9 phút

Một cú đoán sai nhánh đốt 12 chu kỳ: đo cái giá đó

Đoán sai một nhánh chỉ chậm đi một chút? Đo ra: quét tỉ lệ nhánh được lấy từ 0% đến 100%, thời gian vẽ thành một hình chuông đỉnh ở 50% — nhánh đoán được (0% hoặc 100%) tốn 0,24–0,45 ns còn nhánh 50/50 tốn 2,38 ns. Từ đó suy ra phạt mỗi lần đoán sai ~3,86 ns, tức khoảng 12 chu kỳ CPU — đúng cỡ một lần xả pipeline.

Cơ sở dữ liệu 03/09/2026 8 phút

Planner đoán 99 hàng, thực tế 10000 — bí mật nằm ở khoảng cách giữa 'rows' và 'actual rows'

Trên hai cột trùng nhau, planner đoán 99 hàng còn thực tế 10000 — lệch 100 lần. 'rows' của EXPLAIN là ước lượng (không chạy), 'actual rows' của EXPLAIN ANALYZE mới là đo thật (có chạy). Chính khoảng cách giữa hai con số tố cáo planner đang đoán mù — và EXPLAIN ANALYZE chạy thật cả UPDATE/DELETE.

Cơ sở dữ liệu 03/09/2026 8 phút

Index (a,b) tăng tốc WHERE a nhưng bỏ rơi WHERE b — vì sao thứ tự cột quyết định tất cả

Index (a,b) tăng tốc WHERE a=? và WHERE a=? AND b=? (4 trang) — nhưng WHERE b=? một mình cho Seq Scan quét cả 5406 trang. Tôi tưởng (a,b) là hai index cho a và b; hóa ra nó là một cây sắp theo a trước. Quy tắc tiền tố trái nhất, và vì sao thứ tự cột là quyết định thiết kế.