ADR 0004. Windows dùng PDH với tên bộ đếm tiếng Anh
- Trạng thái: Đã chấp nhận (cần xác nhận ở spike S1). Thay thế một phần bởi ADR 0007: CPU và mạng dùng API trực tiếp, PDH chỉ còn cho I/O đĩa và page file chính xác
- Ngày: 2026-09-30
Bối cảnh
Windows lưu chỉ số hiệu năng qua Performance Data Helper (PDH). Tên bộ đếm hiển thị được bản địa hóa (ví dụ tiếng Đức, Nhật, Việt), nên đường dẫn viết cứng bằng tiếng Anh sẽ lỗi trên hệ điều hành không phải tiếng Anh. WMI thì chậm và nặng hơn.
Quyết định
- Dùng PDH qua
golang.org/x/sys/windows(syscall trực tiếp, không CGO). - Luôn thêm bộ đếm bằng
PdhAddEnglishCounter, không phụ thuộc ngôn ngữ giao diện. - Bộ đếm dạng tốc độ (bytes/sec, % time) cần hai lần lấy mẫu, mẫu đầu bị bỏ, khớp quy ước gauge của giao thức.
- Với thứ có API trực tiếp, dùng API thay vì PDH:
GlobalMemoryStatusEx(RAM),GetDiskFreeSpaceEx(đĩa),GetTickCount64(uptime),GetExtendedTcpTable(port), Service Control Manager (dịch vụ). Giảm bề mặt phụ thuộc bộ đếm. - Quản lý vòng đời handle query: mở một lần, làm mới khi lỗi, đóng khi dừng, kiểm thử rò rỉ handle.
- Khi bộ đếm hỏng (lỗi
PDH_CSTATUS_NO_OBJECT,PDH_INVALID_DATA), bộ thu báo lỗi (agent_collector_errors), không làm dừng agent, thử khôi phục sau vài chu kỳ và ghi gợi ýlodctr /R.
Hệ quả
- Hoạt động trên Windows đa ngôn ngữ (cần kiểm thử thực tế, spike S1).
- Tài khoản dịch vụ phải thuộc
Performance Monitor Users. MSI cấu hình khi cài. - Kết quả tải bộ xử lý hơi khác giữa các công cụ, ghi rõ trong catalog và chấp nhận sai số.
- Không dùng WMI (tránh chậm, tránh tiến trình
WmiPrvSEtốn CPU trên hàng nghìn máy).
Phương án đã cân nhắc
| Phương án | Lý do không chọn |
|---|---|
WMI (Win32_PerfFormattedData) | Chậm, tốn CPU, dễ hỏng repository WMI |
| Bộ đếm theo tên bản địa hóa | Lỗi trên hệ điều hành không phải tiếng Anh |
gopsutil toàn bộ trên Windows | Chấp nhận được ở vài chỉ số, nhưng kiểm soát kém về hai mẫu và handle. Đánh giá ở spike S5 và có thể dùng cho phần không nhạy |