Cải Tiến Thống Kê Mạng Cho Skynet - nói dối e blog

Cải Tiến Thống Kê Mạng Cho Skynet

Trong giai đoạn hiện tại, mục tiêu chính của skynet là nâng cao tính minh bạch của các thông tin nội bộ trong quá trình vận hành. Việc cung cấp thêm dữ liệu thống kê thời gian chạy không chỉ hỗ trợ công tác vận hành hệ thống mà còn định hướng tối ưu hiệu năng một cách rõ ràng hơn.

Gần đây, tôi đã bổ sung lệnh netstat vào giao diện debug console, đồng thời phát triển API socket.netstat tương ứng để truy xuất dữ liệu này. Lệnh này cho phép liệt kê toàn bộ kết nối mạng (socket) do skynet quản lý, bao gồm các thông tin chi tiết như:

  • Dịch vụ nào đang sở hữu socket đó
  • Tổng số byte đã đọc/ghi trên socket
  • Thời điểm lần đọc/ghi cuối cùng
  • Số byte đang chờ trong hàng đợi ghi (pending write)
  • Địa chỉ IP và cổng kết nối (nếu là socket mạng)
  • Đối với socket lắng nghe (listen), sẽ ghi nhận số lần chấp nhận kết nối thành công (accept)

Dù các dữ liệu này có thể kiểm tra qua lệnh netstat hệ thống, nhưng phiên bản do skynet cung cấp lại chứa thêm thông tin then chốt: mối liên kết giữa socket và dịch vụ nội bộ. Đây là yếu tố không thể truy xuất được từ công cụ hệ thống thông thường.

Quy trình thiết kế API thống kê

Ban đầu, tôi cân nhắc phương án gửi tín hiệu điều khiển đến luồng socket, yêu cầu nó thực hiện thống kê và trả về kết quả thông qua cấu trúc dữ liệu socket. Cách tiếp cận này giúp tránh rủi ro đa luồng, đồng thời không quá quan trọng việc đồng bộ hay bất đồng bộ.

Tuy nhiên, sau khi phân tích kỹ, tôi đã loại bỏ ý tưởng này vì hai lý do chính:

  1. Rủi ro tương thích ngược: Việc mở rộng cấu trúc tin nhắn socket có thể gây xung đột với mã nguồn cũ, dù mức độ nghiêm trọng chỉ dừng ở việc rò rỉ bộ nhớ trong kết quả truy vấn.
  2. Vấn đề quản lý bộ nhớ: Do kết quả trả về là cấu trúc dữ liệu phức tạp, việc giải phóng bộ nhớ phải do bên nhận đảm nhiệm. Nếu giao kết quả cho một dịch vụ cụ thể, nguy cơ rò rỉ bộ nhớ vẫn tồn tại.

Quan trọng hơn, giao diện bất đồng bộ sẽ làm phức tạp hóa quy trình sử dụng. Do đó, tôi quyết định thiết kế API đồng bộ thay thế.

Ưu điểm của API đồng bộ

Dù dữ liệu thống kê không đảm bảo tính nhất quán tuyệt đối (không phải ảnh chụp trạng thái mạng tại một thời điểm), nhưng điều này không ảnh hưởng lớn đến mục đích sử dụng. Nhờ skynet sử dụng mảng cấu trúc socket kích thước cố định (mặc định tối đa 64K socket, có thể điều chỉnh qua macro biên dịch), việc kiểm soát vòng đời cấu trúc dữ liệu trong môi trường đa luồng trở nên đơn giản.

Cơ chế double-check được áp dụng để đảm bảo tính hợp lệ của dữ liệu từng socket khi truy vấn, giúp tránh khóa đồng bộ (lock) và giảm thiểu chi phí hệ thống.

Cách sử dụng tính năng mới

Người dùng có thể truy xuất dữ liệu theo ba cách:

  1. Qua debug console: Đăng nhập và nhập lệnh netstat.
  2. Giao thức HTTP: Sử dụng lệnh `wget –q -O - để lấy dữ liệu định dạng văn bản.
  3. API Lua: Gọi socket.netstat() để nhận kết quả dưới dạng bảng (table) chi tiết.

Tính năng này không chỉ hỗ trợ giám sát thời gian thực mà còn là công cụ hữu ích trong việc phân tích nghẽn cổ chai hiệu năng, từ đó tối ưu hóa kiến trúc hệ thống một cách chính xác.

0%